SQL查询可在SSMS中工作,但不能在C#中工作:SELECT拒绝

时间:2018-11-20 14:16:34

标签: c# sql-server ssms sqldatareader

首先:不是一个不起作用的特定语句。 SELECT * FROM [TABLE];也不起作用。当我以用户A的身份在SSMS中运行它时,它工作得很好。当我像这样在C#中使用它时:

string sqlCommand = "SELECT * FROM [TABLE];"

using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Name"].ToString()))
using (var command = new SqlCommand(sqlCommand, conn))
{
    conn.Open();

    using (var dataReader = command.ExecuteReader())
    {
        while (dataReader.Read())
        {
            // work with results
        }
    }
}

我使用try-catch记录了此代码块,并收到以下错误消息:System.Data.SqlClient.SqlException (0x80131904): The SELECT permission was denied on the object 'TABLE', database 'MyDb', schema 'dbo'.

即使我在数据库所在的服务器上运行程序,也会遇到相同的错误。

我的连接字符串看起来很像这样:

Data Source=Server\Something;Initial Catalog=MyDb;User ID=DOMAIN\username;Password=verySecurePassword;Trusted_Connection=True;

用户A在整个数据库上具有数据读取器角色。

您知道为什么会这样吗?我的数据库管理员也无法帮助我,而且似乎连接正常,这似乎不是网络问题。

1 个答案:

答案 0 :(得分:5)

在连接字符串中包含该字符时:

Trusted_Connection=True;

连接字符串的这一部分将被忽略:

User ID=DOMAIN\username;Password=verySecurePassword;

可靠的连接和集成的安全性意味着您始终始终以运行程序进程的帐户连接到服务器。您无需指定密码;相反,程序将传递为运行该进程的用户颁发的身份验证令牌,并且数据库将针对该令牌进行验证。

如果需要使用域登录名,则必须以该用户身份运行程序。如果需要使用用户名/密码,则必须使用Sql身份验证和Sql Server中定义的非域帐户。