表单应用程序中的SQL查询返回与在SQL管理中执行时不同的结果
本文关键字:SQL 执行 管理 结果 应用程序 查询 返回 表单 | 更新日期: 2023-09-27 18:15:23
这里有一个有点奇怪的场景。在我的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。
这些查询的区别是什么,我如何解决这个问题?
既然你正确地使用了参数,你就不需要在@Name:
周围加引号了@"SELECT name FROM master.sys.server_principals WHERE name = @Name";
也像前面提到的那样使用:
checkLoginCommand.Parameters.Add(new SqlParameter("@Name", _user));
也许你应该使用@Name
checkLoginCommand.Parameters.Add(new SqlParameter("@Name", _user));