连接字符串适用于OLE DB连接,但不适用于Sql Server Native Client 10.0

时间:2013-01-28 14:25:46

标签: c# sql sql-server ado.net

以下是使用带有Microsoft OLE DB Provider for SQL Server的配置工具连接到数据库时生成的连接字符串。

Provider=SQLOLEDB.1;Password=password;Persist Security Info=True;User ID=sa;
Initial Catalog=database;Data Source=localhost;Use Procedure for Prepare=1;
Auto Translate=True;Packet Size=4096;Workstation ID=computer1;
Use Encryption for Data=False;Tag with column collation when possible=False

如果我使用SQL Server Native Client 10.0连接到同一数据库,则会收到此连接字符串。

Provider=SQLNCLI10.1;Integrated Security=\"\";Persist Security Info=False;
User ID=sa;Initial Catalog=database;Data Source=localhost;Use Procedure for Prepare=1;
Auto Translate=True;Packet Size=4096;Workstation ID=computer1;
Initial File Name=\"\";Use Encryption for Data=False;
Tag with column collation when possible=False;
MARS Connection=False;DataTypeCompatibility=0;Trust Server Certificate=False\0

我有一个c#应用程序,它读取其中一个连接字符串并使用它来创建与我的数据库的连接,如此

SqlConnectionStringBuilder _sqlConnectionStringBuilder = new SqlConnectionStringBuilder();
OleDbConnectionStringBuilder conBuilder = new OleDbConnectionStringBuilder( CONNECTION STRING SHOWN ABOVE);
_initialCatalogValue = (string)conBuilder["Initial Catalog"];
_dataSourceValue = conBuilder.DataSource;

_sqlConnectionStringBuilder.Password = (string)conBuilder["Password"];
_sqlConnectionStringBuilder.UserID = (string)conBuilder["User Id"];
_sqlConnectionStringBuilder.InitialCatalog = _initialCatalogValue;
_sqlConnectionStringBuilder.DataSource = _dataSourceValue;
_sqlConnectionStringBuilder.PersistSecurityInfo = true;

_conn = new SqlConnection(_sqlConnectionStringBuilder.ConnectionString);
_conn.Open();

当我使用SQL Server本机客户端时,密码为空并且我的SQLConnection在登录时失败的问题。我得到的错误是“用户'sa登录失败'”。

OLE DB连接字符串成功。由于我在c#中使用的某些类,我的登录是否因sql server本机客户端而失败? Sql Server Native Client 10.0是否加密密码?我应该尝试识别哪个提供程序在连接字符串中并且具有两个不同的代码路径?如果是这样,连接需要什么?

基本问题是,无论我收到哪个连接字符串(只有上面两个),我怎样才能确保连接成功?

N.B。我无法控制连接字符串。我只能接受我收到的东西。

2 个答案:

答案 0 :(得分:1)

您提供的第二个连接字符串包含密码;因此,当您将conBuilder["Password"]设置为第二个字符串时,conBuilder.ConnectionString将返回一个空字符串。

答案 1 :(得分:0)

问题解决如下。

有一个主应用程序正在使用上述连接字符串,并且正在执行以下操作。

应用程序将获取连接字符串。 如果连接字符串的提供程序是SQL Server Native Client(SQLNCLI10.1),则应用程序将检查持久安全性。如果找不到它,则将IntegratedSecurity = SSPI添加到连接字符串,然后使用Windows身份验证进行连接。这是否是正确的(或安全的事情)正在做的事情。

回答'这个问题。您可以接收连接字符串,如果找不到密码,可以设置IntegratedSecurity = SSPI。这将允许您使用Windows身份验证而不是SQL Server身份验证进行连接。我不建议你做,但它会奏效。