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

时间:2015-10-01 10:45:04

标签: c# sql

我这里有一点奇怪的情况。在我的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。

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

2 个答案:

答案 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));