有四種類型的連接類:SqlConnection、OleDbConnection、OdbcConnection和OracleConnection。
SqlConnection類的對象連接到SQL Server數據庫;OracleConnection類的對象連接到Oracle數據庫;
OleDbConnection類的對象連接到支持OLE DB的數據庫,如Access;OdbcConnection類的對象連接到任何支持ODBC的數據庫。所有與數據庫的通信最終都是通過連接對象完成的。
SqlConnection類
連接用於與數據庫“對話”,由特定提供程序的類表示,如SqlConnection。盡管SqlConnection類是針對Sql Server的,但該類的許多屬性和方法與OleDbConnection和OdbcConnection等事件和類的屬性和方法相似。本章將重點介紹SqlConnection的具體屬性和方法,其他連接類可以參考相應的幫助文檔。
註意:使用不同的連接對象需要導入不同的名稱空間。OleDbConnection的命名空間是System。SqlConnection的命名空間是System。OdbcConnection的命名空間是System。OracleConnection的名稱空間是System。OracleClinet
SqlConnection屬性:
屬性描述
返回類型為string的Connectionstring獲取或設置用於打開SQL Server數據庫的字符串。
ConnectionTimeOut的返回類型是int,它獲取在嘗試建立連接時終止嘗試並生成錯誤之前等待的時間。
Database,其返回類型為string,獲取當前數據庫或連接打開後要使用的數據庫的名稱。
DataSource的返回類型是string,它獲取要連接的SQL Server實例的名稱。
State,其返回類型為ConnectionState,獲取當前連接狀態:斷開、關閉、正在連接、正在獲取或打開。
ServerVersion的返回類型為string,它獲取包含客戶端連接的SQL Server實例的版本的字符串。
PacketSize獲取用於與SQL Server實例通信的網絡數據包的大小(以字節為單位)。該屬性僅適用於SqlConnection類型。
SqlConnection方法:
方法描述
Close(),其返回類型為void,關閉與數據庫的連接。
CreateCommand()的返回類型是SqlCommand,它創建並返回壹個與SqlConnection關聯的SqlCommand對象。
Open(),其返回類型為void,使用連接字符串屬性指定的屬性打開數據庫連接。
SqlConnection事件:
事件描述
當事件的狀態改變時,發生StateChange。(繼承自DbConnection。)
當SQL Server返回警告或信息性消息時,會出現InfoMessage。
提示:您可以使用事件讓壹個對象以某種方式通知另壹個對象某事。比如我們在Windows系統中選擇“開始”菜單,壹旦點擊鼠標,就會發生壹個事件通知操作系統顯示“開始”菜單。
使用SqlConnection對象連接到SQL Server數據庫
我們可以使用SqlConnection()構造函數生成壹個新的SqlConnection對象。這個函數是重載的,也就是我們可以調用不同版本的構造函數。下表顯示了SqlConnection()的構造函數:
構造函數描述
SqlConnection()初始化SqlConnection類的新實例。
如果給定了包含連接字符串的字符串,SqlConnection (String)將初始化SqlConnection類的新實例。
假設我們導入系統。Data.SqlClient命名空間,我們可以使用以下語句生成壹個新的SqlConnection對象:
SqlConnection MySQL connection = new SQL connection();
程序代碼描述:在上述語法示例的程序代碼中,我們通過使用“new”關鍵字生成了壹個新的SqlConnection對象,並將其命名為mySqlConnection。
現在我們可以使用以下兩種方式連接數據庫,即使用集成Windows身份驗證和使用Sql Server身份驗證進行數據庫登錄。
集成Windows身份驗證語法示例
string connectionString = " server = localhost;數據庫= Northwind
綜合安全= SSPI”;
程序代碼描述:在上述語法示例的程序代碼中,我們為Sql Server數據庫設置了壹個連接字符串。Server代表運行Sql Server的計算機的名稱。因為本書中ASP.NET程序和數據庫系統位於同壹臺計算機中,所以我們可以用localhost來代替當前的計算機名。Database表示所用數據庫的名稱,它被設置為Sql Server - Northwind附帶的示例數據庫。因為我們想要采用集成Windows身份驗證方法,所以我們只需要將集成安全性設置為SSPI。
Sql Server 2005中的Windows身份驗證模式如下:
註意:使用集成Windows身份驗證方法時,我們不需要輸入用戶名和密碼,而是將登錄Windows時輸入的用戶名和密碼傳遞給Sql Server。然後,Sql Server檢查用戶列表,查看他們是否有權訪問數據庫。並且數據庫連接字符串不區分大小寫。
使用Sql Server身份驗證的語法示例
string connectionString = " server = localhost;數據庫= Northwinduid = sapwd = sa ";
程序代碼描述:在上述語法示例的程序代碼中,通過使用已知的用戶名和密碼認證來執行數據庫登錄。Uid是指定的數據庫用戶名,pwd是指定的用戶密碼。為了安全起見,代碼中壹般不包含用戶名和密碼。您可以通過使用集成Windows身份驗證方法或加密Web中的連接字符串來提高程序的安全性。配置文件。
Sql Server 2005中的Sql Server身份驗證模式如下:
如果使用其他數據提供程序,生成的連接字符串具有類似的形式。例如,我們希望以OLE DB的形式連接到Oracle數據庫。連接字符串如下所示:
string connectionString = " data source = localhost;初始目錄=銷售;
使用id = sa密碼=;provider = MSDAORA ";
程序代碼描述:在上述語法示例的程序代碼中,數據庫的連接是通過專門針對Oracle數據庫的OLE DB provider實現的。數據源表示運行Oracle數據庫的計算機的名稱,初始目錄表示所使用的數據庫的名稱。Provider表示使用的OLE DB提供程序是MSDAORA。
Access數據庫的連接字符串采用以下形式:
string connectionString = " provider = Microsoft。Jet . OLEDB.4.0
@ "數據源= c:\ data source \ north wind . MDB ";
程序代碼描述:在上述語法示例的程序代碼中,數據庫的連接是通過專門針對Access數據庫的OLE DB provider實現的。用於此目的的OLE DB提供程序是Microsoft。Jet.OLEDB.4.0,數據庫存儲在c:\DataSource目錄下,其數據庫文件為Northwind.mdb
現在,我們可以將數據庫連接字符串傳遞給SqlConnection()構造函數,例如:
string connectionString = " server = localhost;數據庫= Northwinduid = sapwd = sa ";
SqlConnection MySQL connection = new SqlConnection(connectionString);
或者寫
SqlConnection MySQL connection = new SqlConnection(
“server = localhost數據庫= Northwinduid = sapwd = sa”);
在前面的示例中,使用“new”關鍵字生成了壹個新的SqlConnection對象。因此,我們還可以設置對象的ConnectionString屬性,並為其指定壹個數據庫連接字符串。這與將數據庫連接字符串傳遞給SqlConnection()構造函數的功能相同。
SqlConnection MySQL connection = new SQL connection();
mySqlConnection。ConnectionString = " server = localhost;數據庫= Northwinduid = sapwd = sa ";
註意:ConnectionString屬性只能在Connection對象關閉時設置。
打開和關閉數據庫連接。
在生成Connection對象並將其設置ConnectionString屬性設置為數據庫連接的相應詳細信息後,可以打開數據庫連接。您可以通過調用Connection對象的Open()方法來實現這壹點。該方法如下:
mySqlConnection。open();
數據庫連接完成後,我們可以調用Connection對象的Close()方法來關閉數據庫連接。例如:
mySqlConnection。close();
以下是壹個示例程序,顯示了如何使用SqlConnection對象連接Sql Server Northwind數據庫,並顯示了此SqlConnection對象的壹些屬性。
示例程序代碼如下:
01公共部分class _Default : System。網頁界面
02 {
03受保護的void Page_Load(對象發送方,EventArgs e)
04 {
05 //建立數據庫連接字符串
06 string connectionString = " server = localhost;數據庫= Northwind
07綜合安全= SSPI”;
08 //將連接字符串傳入SqlConnection對象的構造函數。
09 SqlConnection MySQL connection = new SqlConnection(connectionString);
10試試
11 {
12 //打開連接
13 mySqlConnection。open();
14 //用標簽控件顯示mySqlConnection對象的ConnectionString屬性。
15 lb info . text = " < b > MySQL連接對象的ConnectionString屬性是:< b >"+
16 mySqlConnection。ConnectionString+" < br > ";
17 LBL info . text+= " < b > MySQL連接對象的ConnectionTimeout屬性是< b >"+
18 mySqlConnection。connection time out+" < br > ";
19 LBL info . text+= " < b > MySQL連接對象的數據庫屬性是< b >"+
20 mySqlConnection。數據庫+" < br > ";
21 lblinfo . text+= " < b > MySQL連接對象的DataSource屬性是< b >"+
22 mySqlConnection。數據源+" < br > ";
23 LBL info . text+= " < b > MySQL連接對象的PacketSize屬性是< b >"+
24 mySqlConnection。packet size+" < br > ";
25 LBL info . text+= " < b > MySQL連接對象的ServerVersion屬性是< b >"+
26 mySqlConnection。server version+" < br > ";
27 LBL info . text+= " < b > MySQL連接對象的當前狀態是< b >"+
28 mySqlConnection。state+" < br > ";
29 }
30捕捉(異常錯誤)
31 {
32磅林福。Text = "讀取數據庫時出錯";
33 lblInfo。文本+=錯誤。消息;
34 }
終於35了
36 {
37 //關閉與數據庫的連接
38 mySqlConnection。close();
39 LBL info . text+= " < br > < b > MySQL connection對象關閉連接後的狀態為:";
40磅林福。Text += mySqlConnection。state . ToString();
41 }
42 }
43 }
程序代碼描述:在上面例子的程序代碼中,我們使用try catch finally來處理數據庫連接的異常。當無法連接數據庫時,將引發異常並顯示錯誤消息,如catch代碼塊所示。在該程序中,無論有無異常,都可以通過finally block關閉數據庫的連接,從而節省計算機資源,提高程序的效率和可擴展性。
實施結果:
當然,我們也可以用更簡單的方法來實現上述程序的功能。這是為了在using塊中包含SqlConnection對象,這樣程序會自動調用Dispose()方法釋放SqlConnection對象占用的系統資源,而不需要使用SqlConnection對象的Close()方法。
示例程序代碼如下:
01公共部分class _Default : System。網頁界面
02 {
03受保護的void Page_Load(對象發送方,EventArgs e)
04 {
05 string connectionString = " server = localhost;數據庫= Northwind
06綜合安全= SSPI”;
07 SqlConnection MySQL connection = new SqlConnection(connectionString);
08使用(mySqlConnection)
09 {
10 mySqlConnection。open();
11 lblinfo . text = " < b > MySQL連接對象的ConnectionString屬性為:< b >"+
12 mySqlConnection。ConnectionString+" < br > ";
13 LBL info . text+= " < b > MySQL連接對象的ConnectionTimeout屬性是< b >"+
14 mySqlConnection。connection time out+" < br > ";
15 lb info . text+= " < b > MySQL連接對象的數據庫屬性是< b >"+
16 mySqlConnection。數據庫+" < br > ";
17 LBL info . text+= " < b > MySQL連接對象的DataSource屬性是< b >"+
18 mySqlConnection。數據源+" < br > ";
19 LBL info . text+= " < b > MySQL連接對象的PacketSize屬性是< b >"+
20 mySqlConnection。packet size+" < br > ";
21 lb info . text+= " < b > MySQL連接對象的ServerVersion屬性是< b >"+
22 mySqlConnection。server version+" < br > ";
23 LBL info . text+= " < b > MySQL連接對象的當前狀態是< b >"+
24 mySqlConnection。state+" < br > ";
25 }
26 LBL info . text+= " < br > < b > MySQL connection對象關閉連接後的狀態為:";
27 lblInfo。Text += mySqlConnection。state . ToString();
28 }
29 }
程序代碼描述:在上面例子的程序代碼中,使用(mySqlConnection)使得代碼更加簡潔,它最大的優點是可以自動關閉與數據庫的連接,而不需要編寫finally block代碼。
連接池
打開和關閉數據庫非常耗時。因此,ADO.NET自動將數據庫連接存儲在連接池中。連接池可以大大提高程序的性能和效率,因為我們不必等待建立壹個全新的數據庫連接過程,而是直接使用現有的數據庫連接。請註意,當使用Close()方法關閉連接時,連接實際上並沒有關閉,而是被標記為未使用,並放在連接池中供下次重用。
如果在連接字符串中提供相同的細節,即相同的數據庫、用戶名、密碼等。,可以直接獲取並返回連接池中的連接。然後,您可以使用此連接來訪問數據庫。
使用SqlConnection對象時,可以在連接字符串中指定最大池大小,這意味著連接池允許的最大連接數(默認值為100),也可以指定最小池大小,這意味著連接池允許的最小連接數(默認值為0)。以下代碼指定SqlConnection對象的最大池大小為10,最小池大小為5。
SqlConnection MySQL connection = new SqlConnection(" server = localhost;數據庫= Northwind
綜合安全= SSPI;"+"最大池大小= 10;最小池大小= 5”);
程序代碼描述:在上面示例的程序代碼中,程序最初在池中生成五個SqlConnection對象。壹個池最多可以存儲10個SqlConnection對象。如果當要打開新的SqlConnection對象時,池中的所有對象都在使用中,則要求在可以使用新的SqlConnection對象之前關閉SqlConnection對象。如果請求等待的時間超過ConnectionTimeout屬性指定的秒數,將引發異常。
下面通過壹個程序展示了連接池的性能優勢。在應用這個程序的過程中,首先要參考系統。數據。SqlClinet和系統。文本名稱空間。
示例程序代碼如下:
01公共部分class _Default : System。網頁界面
02 {
03受保護的void Page_Load(對象發送方,EventArgs e)
04 {
05 //將連接池中的最大連接數設置為5,最小連接數設置為1。
06 SqlConnection MySQL connection = new SqlConnection(
07 " server = localhost數據庫= Northwind綜合安全= SSPI;”+
08英寸最大池大小= 5;最小池大小= 1”);
09 //創建新的StringBuilder對象。
10 StringBuilder htmStr = new StringBuilder(" ");
11 for(int count = 1;計數< = 5;count++)
12 {
13 //使用Append()方法將字符串追加到StringBuilder對象的末尾。
14 htmStr。Append("連接對象"+count);
15 htmStr。追加(" < br > ");
16 //設置連接的開始時間。
17日期時間開始=日期時間。現在;
18 mySqlConnection。open();
19 //連接時間
20 TimeSpan timeTaken =日期時間。現在-開始;
21 htmStr。Append("連接時間是"+timeTaken。毫秒+“毫秒”);
22 htmStr。追加(" < br > ");
23 htmstr。append(" MySQL連接對象的狀態是"+mySqlConnection。狀態);
24 htmStr。追加(" < br > ");
25 mySqlConnection。close();
26 }
27 //顯示標簽控件中StringBuilder對象包含的字符串。
28磅林福。Text = htmStr。ToString();
29 }
30 }
程序代碼描述:在上面例子的程序代碼中,我們將在連接池中打開壹個SqlConnection對象五次,DateTime。現在表示當前時間。TimeTaken表示從連接開始到連接打開的時間間隔。可以看出,打開第壹個連接比打開後續連接花費的時間更長,因為第壹個連接實際上是連接到數據庫的。關閉後,此連接存儲在連接池中。當妳再次打開連接的時候,直接從池中讀取就可以了,速度非常快。
提示:字符串對象是不可變的。每次妳使用系統中的壹個方法。String類,需要在內存中創建新的string對象,所以需要為新對象分配新的空間。當需要重復修改字符串時,與創建新的字符串對象相關聯的開銷可能非常昂貴。如果要修改字符串而不創建新對象,可以使用系統。StringBuilder類。例如,當許多字符串在壹個循環中連接在壹起時,使用StringBuilder類可以提高性能。Append方法可用於將文本或對象的字符串表示形式添加到由當前StringBuilder對象表示的字符串的末尾。
在ASP.NET 2.0中,壹種在運行時解析為連接字符串值的新的聲明性表達式語法用於按名稱引用數據庫連接字符串。連接字符串本身存儲在Web.config文件中的< < connectionStrings > >配置節下,因此很容易在壹個位置維護應用程序中的所有頁面。
示例程序代碼如下:
<配置>
<連接字符串>
< add name = " Pubs " connectionString = " Server = localhost;
集成安全性= True數據庫= pubs持久安全信息=True "
providerName="System。Data.SqlClient" />
< add name = " north wind " connectionString = " Server = localhost;
集成安全性= True數據庫= Northwind持久安全信息=True "
providerName="System。Data.SqlClient" />
< system.web >
< pages style sheet theme = " Default "/>
配置>
程序代碼描述:在上面例子的程序代碼中,我們在Web中的<連接字符串>配置節點下設置了兩個數據庫連接字符串。Config文件,分別指向兩個示例數據庫pubs和Northwind。請註意,數據源控件(如SqlDataSource控件)是在2.0中引入的。我們可以將SqlDataSource控件的ConnectionString屬性設置為表達式,該表達式在運行時由ASP.NET分析器解析為連接字符串。還可以為SqlDataSource的ProviderName屬性指定壹個表達式,如。它的具體用法和新特性將在後面的章節中詳細介紹。現在只是有個基本的了解。
當然,我們也可以通過以下方式直接從配置文件中讀取數據庫連接字符串。首先,我們需要參考使用系統。Web.Configuration命名空間,它包含用於設置ASP.NET配置的類。
字符串connectionString = configuration manager。ConnectionStrings["Northwind"]。ConnectionString
程序代碼描述:在上面例子的程序代碼中,我們可以使用connection strings[“Northwind”]讀取對應的north wind字符串。類似地,可以使用connection strings[“Pubs”]來讀取相應的Pubs字符串。