ADO.NET的數據提供程序和數據連接——ADO.NET學習&應用筆記之二

類似於ADODB連接模式的數據庫操作程序的,是ADO.NET的數據提供程序。.NET Framework 1.1版的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數據提供程序。下圖爲兩者的數據訪問比較圖:
o_SQL_OLEDB-Provider.gif


二、使用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"
它們常用屬性可以參考下表:

SqlConnection OleDbConnection OdbcConnection OracleConnection 說明
Data Source/Server Data Source Server Data Source/Server 數據源名稱或者網絡地址
Initial Catalog/Database Initial Catalog Database 數據庫名
User ID User ID User ID User ID 服務代理用戶
Password Password Password Password 用戶密碼
Provider OLE DB數據提供程序,OleDbConnection連接字符串所必需的參數
DSN OdbcConnection專用的連接字符串參數,DSN名稱

更多的連接對象的連接字符串參數可以參考FCL SDK。
SqlConnection.ConnectionString屬性參考:
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemDataSqlClientSqlConnectionClassConnectionStringTopic.asp
OleDbConnection.ConnectionString屬性參考:
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemDataOleDbOleDbConnectionClassConnectionStringTopic.asp
OdbcConnection.ConnectionString屬性參考:
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemDataOdbcOdbcConnectionClassConnectionStringTopic.asp
OracleConnection.ConnectionString屬性參考:
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemDataOracleClientOracleConnectionClassConnectionStringTopic.asp

(二)應用程序中連接字符串的存儲
爲了方便管理數據連接,通常數據連接字符串不寫爲硬碼,而存儲在應用程序之外。
《.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後多了一個空格

參考資源:
1、Bob Beauchemin《Essential ADO.NET》
2、.Net Framework SDK《開發人員指南》
3、Dino Esposito《剖析 .NET 託管提供程序》
4、Alex Mackman《.NET 數據訪問架構指南》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章