表单应用程序中的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。

这些查询的区别是什么,我如何解决这个问题?

表单应用程序中的SQL查询返回与在SQL管理中执行时不同的结果

既然你正确地使用了参数,你就不需要在@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));