0

在一个类中,我正在创建登录到 sql 的工作正常。我想添加一些错误检查来首先检查登录是否已经存在于 SQL 中。如果确实如此,则不要尝试添加登录名,而是映射到表等。

在 sql 中,我使用以下命令检查登录:

select name from sys.server_principals where name = 'viewer2'

我厌倦了在我的课堂上使用它如下

protected static bool CheckForExistingUser(DbContext context, string userName)
        {
            string checkForUser =
                @" SET NOCOUNT ON
                    DECLARE @userName AS nvarchar(max) = {0}
                    EXEC('
                    SELECT name FROM sys.server_principals where name = ['+ @userName +']
                    ')";
            return Convert.ToBoolean(context.Database.ExecuteSqlCommand(checkForUser, userName));
        }

但是,当我调用此方法时,我得到一个异常,即该列(传入的任何用户名)无效

$exception  {"Invalid column name 'viewer2'."}  System.Exception {System.Data.SqlClient.SqlException}

关于导致这种情况的任何想法,是否有更好的方法来检查代码中的 sql db 中是否存在登录?

干杯

4

3 回答 3

3

你应该使用'而不是[]围绕你的价值。否则,SQL Server 将其视为列名。

string checkForUser =
    @" SET NOCOUNT ON
        DECLARE @userName AS nvarchar(max) = {0}
        EXEC('
        SELECT name FROM sys.server_principals where name = ''' + @userName +'''
        ')";
于 2013-04-05T20:45:14.953 回答
0

试一试:

protected static bool CheckForExistingUser(DbContext context, string userName)
        {
            return Convert.ToBoolean(context.Database.ExecuteSqlCommand("SELECT name FROM sys.server_principals where name = {0}", userName));
        }

count 将返回 0 或 1,具体取决于用户名是否存在满足 bool 转换...还删除了代码中的所有修剪。如果它不起作用,请告诉我。

于 2013-04-05T21:32:37.673 回答
0

正如@MarcinJuraszek 所回答的那样,您的字符串参数周围不能有'['。如果作为参数发送,它们必须有单引号或自动引用。

由于看起来您正在使用实体框架,我认为您可以通过执行更简单的查询来使其更具可读性。在 .NET Framework 4.0 及更高版本中,您可以执行以下操作:

string checkForUser = "SELECT count(1) FROM sys.server_principals where name = {0}";
return context.ExecuteStoreQuery<int>(checkForUser, userName).First() > 0;
于 2013-04-05T21:34:38.380 回答