我这里有一点奇怪的情况。在我的Windows窗体应用程序中,我正在检查数据库中是否存在登录,如果不存在则创建。我遇到的问题是,在第二次运行程序时,未检测到创建的登录信息。
我的代码是:
const string checkLoginQuery = @"SELECT name
FROM master.sys.server_principals
WHERE name = '@Name'";
object loginExists;
using (SqlCommand checkLoginCommand = new SqlCommand(checkLoginQuery, _connection))
{
checkLoginCommand.Parameters.Add(new SqlParameter("Name", _user));
loginExists = checkLoginCommand.ExecuteScalar();
}
if (loginExists != null)
{
m_logger.Info("Login already exists");
}
else
{
m_logger.Info("Creating login");
string createLoginQuery = string.Format("CREATE LOGIN [{0}] WITH PASSWORD = '{1}'", _user,
_password);
using (SqlCommand createLoginCommand = new SqlCommand(createLoginQuery, _connection))
{
createLoginCommand.ExecuteNonQuery();
}
}
创建工作正常,但第一个SqlCommand始终返回null。
当我在SQL管理中运行查询SELECT name FROM master.sys.server_principals WHERE name = 'myName'
时,这正确地返回先前创建的登录名。
从SQL Profiler,我看到我的表单应用程序生成以下查询:
exec sp_executesql N'SELECT name
FROM master.sys.server_principals
WHERE name = ''@Name''',N'@Name nvarchar(6)',@Name=N'myName'
返回null。
这些查询有什么区别,我该如何解决这个问题?
答案 0 :(得分:2)
因为你正确使用参数,所以你不需要围绕@Name:
引用@"SELECT name FROM master.sys.server_principals WHERE name = @Name";
如前所述,使用:
checkLoginCommand.Parameters.Add(new SqlParameter("@Name", _user));
答案 1 :(得分:1)
您可以使用@Name
。
checkLoginCommand.Parameters.Add(new SqlParameter("@Name", _user));