检查在c#中是否存在一个登录

本文关键字:一个 登录 存在 是否 检查 | 更新日期: 2023-09-27 18:07:57

在一个类中,我正在创建登录到工作良好的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数据库登录?

欢呼

检查在c#中是否存在一个登录

您应该在值周围使用'而不是[]。否则,SQL server将其视为列名。

string checkForUser =
    @" SET NOCOUNT ON
        DECLARE @userName AS nvarchar(max) = {0}
        EXEC('
        SELECT name FROM sys.server_principals where name = ''' + @userName +'''
        ')";

正如@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;

试一试:

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将根据用户名是否满足bool转换返回0或1…还删除了代码中的所有修剪。