如何使用 Entity Framework Core 传递没有单撇号的 SQL 查询参数?

我正在尝试使用 SQL Server 2012。我有一个数据库,我需要通过代码创建一个新的数据库用户。但我不处理它。


首先,这是我的 SQL 查询


CREATE USER TestUser FOR LOGIN TestUser

在 SQL Server 中,它运行良好。


我有这段代码:


internal class ServerContext : DbContext

{

    public ServerContext(DbContextOptions<ServerContext> options) : base(options) { }

}

<'''>


DbContextOptions<ServerContext> _options;

var optionsBuilder = new DbContextOptionsBuilder<ServerContext>();

var connectionString = string.Format(ConnectionString.ConnectString, url, dbName, login, password);

_options = optionsBuilder.UseSqlServer(connectionString).Options;


using (var context = new ServerContext(_options))

{

    if (data.Count() == 0)

    {

       context.Database.ExecuteSqlCommand(Query.CreateDbUser, new SqlParameter("@Login", "user"));

    }

}

<'''>


public static class Query

{    

     public static string CreateDbUser = "CREATE USER @Login FOR LOGIN @Login";

}

此查询转换为:


 exec sp_executesql N'CREATE USER @Login FOR LOGIN @Login',N'@Login nvarchar(4)',@Login=N'User' 

我得到这个错误:


“@Login”周围的语法无效。


我认为这是由于参数“user”作为字符串传递并在执行查询时用引号指定。


慕容森
浏览 66回答 1
1回答

月关宝盒

您不能使用以下语句,因为变量不能替换对象的名称:exec sp_executesql N'CREATE USER @Login FOR LOGIN @Login',N'@Login nvarchar(4)',@Login=N'User'这将尝试创建一个名为 的用户@Login,这是无效的。您需要使用动态 SQL:DECLARE @SQL nvarchar(MAX);SET @SQL = N'CREATE USER ' + QUOTENAME(@Login) + N' FOR LOGIN '+ QUOTENAME(@Login) + N';';EXEC sp_executesql @SQL;
打开App,查看更多内容
随时随地看视频慕课网APP