检查在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数据库登录?
欢呼
您应该在值周围使用'
而不是[]
。否则,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…还删除了代码中的所有修剪。