干了这么多年编程,发现今天被一个数据库连接字符串给整蒙了,惭愧,知耻而后勇!加油吧
大家看我上面的字符串有问题吗?很负责任的告诉你,有问题,而且执行到sqlconnection.open()时,会抛出一个异常:“用户 '' 登录失败。该用户与可信 SQL Server 连接无关联。”
这是为什么呢?查了一下msdn才发现,上面的字符串同时集成了windows身份认证和sqlserver混合身份认证。当在字符串中指定:Integrated Security=SSPI时,字符串会基层windows方式来验证,也就是说数据库服务器会在域账户中检查sa账户是否存在而且是否有权限连接web2.0这个数据库。很显然,我的域
<add name="SqlConnectionUIA" connectionString="data source=192.168.0.20; Initial Catalog=web2.0; UID=sa;Password=sa" providerName="System.Data.SqlClient"/>
账户中没有sa。
对于Integrated Security属性,还有几点需要注意:
(1)如果数据提供程序是sqlserver .net framework(通俗的说就是如果你采用sqlserver作为数据库) 那么下面三种方式都可以用:
Integrated Security=true; Integrated Security=SSPI;
Trusted_Connection=True;
另外 Provider是System.Data.SqlClient
如:
混合身份认证方式:
<add name="SqlConnectionUIA" connectionString="data source=192.168.0.20; Initial Catalog=web2.0; UID=sa;Password=sa" providerName="System.Data.SqlClient"/>
集成windows方式:
<add name="SqlConnectionUIA" connectionString="data source=192.168.0.20; Initial Catalog=web2.0; Integrate Security=SSIP" providerName="System.Data.SqlClient"/>
(2)如果数据库提供程序是 oledb.Net framework(通俗的说就是你采用access,excel等)那么只能采用下面的方式
Integrated Security=SSPI;
而且必须为 OleDbConnection 连接字符串指定提供程序名称。以下连接字符串使用 Jet 提供程序连接到 Microsoft Access 数据库。注意,如果数据库未受保护(默认设置),UserID 和 Password 关键字是可选的。
Provider=Microsoft.Jet.OLEDB.4.0; Data Source=d:\Northwind.mdb;User ID=Admin;Password=;如果数据库受保护,必须提供工作组信息文件的位置。
对于 SQL Server 6.5 或更低版本,请使用 sqloledb 关键字。Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\Northwind.mdb;Jet OLEDB:System Database=d:\NorthwindSystem.mdw;User ID=*****;Password=*****;Provider=sqloledb;Data Source=MySqlServer;Initial Catalog=pubs;User Id=*****;Password=*****;(3)如果你使用传统的ODBC .Net framework 那么必须使用下面的方式:
Trusted_Connection=yes;最后我们再说一下:Persist Security Info属性。有时我们会在连接字符串中看到如下配置节:这个属性是干嘛的呢?MSDN有如下解释:Persist Security Info=False;Integrated Security=SSPI;database=Northwind;server=(local)持续安全信息(Persist Secutiry Info)连接字符串中 Persist Security Info 关键字的默认设置为 false。
Persist Security Info=false;如果将该关键字设置为 true 或 yes,将允许在打开连接后,从连接中获得涉及安全性的信息(包括用户标识和密码)。如果在建立连接时必须提供用户标识和密码,最安全的方法是在使用信息打开连接后丢弃这些信息,在Persist Security Info 设置为 false 或 no 时会发生这种情况。当您向不可信的源提供打开的连接,或将连接信息永久保存到磁盘时,这点尤其重要。如果将 Persist Security Info 保持为 false,可帮助确保不可信的源无法访问连接中涉及安全性的信息,并帮助确保任何涉及安全性的信息都不会随连接字符串信息在磁盘上持久化。
说白了,就是要我们尽量保持Persist Security Info 保持为 false。
附上MSDN关于数据库连接字符串的说明:http://msdn.microsoft.com/zh-cn/library/ms254978(VS.80).aspx