ADO.NET的数据提供程序和数据连接——ADO.NET学习&应用笔记之二
一、ADO.NET的数据提供程序
ADO.NET配套的四种数据提供程序,分别是用于SQL Server7.0及更高版本的SqlClient数据提供程序,对应的名字空间是System.Data.SqlClient;用于OLE DB数据源的OleDb数据提供程序,对应的名字空间是System.Data.OleDb;用于ODBC数据源的Odbc数据提供程序,对应的名字空间是System.Data.Odbc;用于Oracle数据源的OracleClient数据提供程序,对应的名字空间是System.Data.OracleClient。(注意:.NET Framework1.0版本不包括Odbc和OracleClient数据提供程序,需要从微软官方站点下载安装)
ADO.NET的SQL Server数据提供程序比OLE DB数据提供程序有着更优异的性能。前者专用于SQL Server,并有针对的优化,通过TDS数据包与SQL Server直接对话,后者必须通过一个COM组件集,即数据源的OLE DB提供程序和OLE DB服务组件来与数据源进行交流。因此对于SQL Server的访问,推荐使用SQL Server数据提供程序。下图为两者的数据访问比较图:
二、使用Connection对象连接数据库
需要访问数据源的数据,首先要通过Connection对象,连接到指定的数据源,FCL数据提供程序的Connection类是一个通用接口System.Data.IDBConnection的实现。
Connection的构造函数通常都有一个连接字符串作为参数,连接字符串也可以使用Connction.ConnectionString属性设置,如果使用c#表示,它们创建连接语句形式通常如下:
IDBConnection conn = new xxxConnection("connection string");
conn.Open();
Connection的Close方法能够关闭数据连接,但是有些时候Close不能够物理性质的中断到数据库的连接。除了Close方法,还有一个Dispose方法,它会调用Close方法,此外通过设置一个Boolean参数指定非托管资源是否应该释放(包括COM接口指针、ODBC句柄等),该方法调用之后,Connection对象就完全释放而无法重用了。
(一)连接字符串的差异
对于不同的数据提供程序,连接字符串存在着差异。
SqlConnection的数据库连接字符串通常如下:
"Server=mySQLServer;Database=northwind;User ID=sa;Password=mypwd;"
OleDbConnection的数据库连接字符串如下:
"Provider=SQLOLEDB;Data Source=mySqlServer;Initial Catalog=northwind;User ID=sa;Password=mypwd;"
OdbcConnection的数据库连接字符串如下:
"Driver={SQL Server};Server=localhost;Database=northwind"或者"DSN=dsnname"
OracleConnection的数据库连接字符串如下:
"Data Source=Oracle8i;User ID=sa;pwd=mypwd"
(二)应用程序中连接字符串的存储
为了方便管理数据连接,通常数据连接字符串不写为硬码,而存储在应用程序之外。
《.NET 数据访问架构指南》一文用一节讨论了链接字符串的存储。链接字符串的存储可以采用下面5种方式:
1、应用程序配置文件 例如用于ASP.NET Web应用程序的Web.config文件。
2、通用数据链接文件(UDL) (只被OLE DB .NET 数据供应器所支持)
3、Windows 注册表
4、定制文件
5、COM+ 目录,通过过使用构造字符串(只用于服务组件)
这些方式各有优缺点,在ASP.NET中最常见的是使用Web.config存储连接字符串,包含在元素appSettings的一个add节点当中。
<appSettings>
<add key="DBConnStr"
value="server=(local);Integrated Security=SSPI;database=northwind"/>
</appSettings>
在ASP.NET应用程序当中使用System.Configuration.ConfigurationSettings类的AppSettings静态属性,可以获取应用程序的定制设置。
(三)连接池(Connection pooling)
连接池能让数据库中使用同一个帐号的不同会话共享连接,避免频繁的打开和关闭连接,它能够显著的提高应用程序的性能。
使用SQL Server数据提供程序的连接池需要注意,每当应用打开一个连接,.NET Framework将创建池,每个连接池都和一个不同的连接字符串相关联。也就是说,如果新创建的一个连接使用的连接字符串和现有的池中连接相匹配,将创建新的池。注意:池化机制对名称-值对间的空格敏感。
下面的三个连接创建了三个不同的池:
SqlConnection conn = new SqlConnection("Integrated Security=SSPI;Initial Catalog=pubs");
conn.Open(); //创建池A
SqlConnection conn = new SqlConnection("Integrated Security=SSPI;Initial Catalog=Northwind");
conn.Open(); //创建池B,和前面的连接字符串不一样
SqlConnection conn = new SqlConnection("Integrated Security=SSPI ;Initial Catalog=Northwind");
conn.Open(); //创建池C,SSPI后多了一个空格