http://blog.csdn.net/jabby12/archive/2004/08/03/59602.aspx 在ADO.NET對(duì)象模型中,Connection對(duì)象代表了與數(shù)據(jù)源之間的連接。.NET框架中有兩個(gè)Connection對(duì)象:一個(gè)是OleDbConnection,用于大多數(shù)的數(shù)據(jù)庫(kù)連接,一個(gè)是SqlConnection,是MS開(kāi)發(fā)的專(zhuān)門(mén)用于針對(duì)SQL Server的連接。在創(chuàng)建Connection對(duì)象之前,你必須先引用System.Data.OleDb或者System.Data.SqlClient和System.Data三個(gè)名空間。
1.SQL Server數(shù)據(jù)庫(kù)的連接
你可以使用Connection對(duì)象的屬性來(lái)指定數(shù)據(jù)源的位置及其它參數(shù)來(lái)連接數(shù)據(jù)庫(kù)。如:SqConnection con=new SqlConnection("Provider=SQLOLEDB;Data Source=MyServer;Initial Catalog=database;use id=yourid,password=yourpassword;");
這是連接到本地?cái)?shù)據(jù)庫(kù),如果你想連到網(wǎng)絡(luò)上的的數(shù)據(jù)庫(kù),就要利用集成安全性,同時(shí)忽略用戶(hù)名和密碼。如:
SqConnection con=new SqlConnection("Provider=SQLOLEDB;Data Source=MyServer;Initial Catalog=database;Integrated Security=SSPI");
如果使用的是ODBC連接到SQL Server,可以通過(guò)使用Trusted_Connection=y(tǒng)es;來(lái)使用網(wǎng)絡(luò)數(shù)據(jù)庫(kù)。
2.Oracle數(shù)據(jù)庫(kù)的連接:(前提:必須先安裝Oracle客戶(hù)端實(shí)用工具的適當(dāng)版本,并創(chuàng)建數(shù)據(jù)庫(kù)別名,接著就可以用以下的連接字符串進(jìn)行連接)
SqConnection con=new SqlConnection("Provider=MSDAORA;Data Source=dbAlias;User id=yourid,password=youpwd;);
3.Access數(shù)據(jù)庫(kù)的連接:(你可以使用以下連接字符串來(lái)連接)
SqConnection con=new SqlConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\yourdb.mdb;User id=yourid,password=youpwd;);
連接到數(shù)據(jù)庫(kù)之后即可調(diào)用Connection對(duì)象的Open()方法來(lái)打開(kāi)與數(shù)據(jù)庫(kù)的連接,同理Close()方法用來(lái)關(guān)閉與數(shù)據(jù)庫(kù)的連接。
連接池:
連接池是什么?在一個(gè)三層結(jié)構(gòu)(或N層)中,當(dāng)一個(gè)客戶(hù)端與中間層服務(wù)器進(jìn)行通訊的時(shí)候,服務(wù)器會(huì)創(chuàng)建一個(gè)與數(shù)據(jù)庫(kù)連接,并執(zhí)行操作的業(yè)務(wù)對(duì)象(也就是與數(shù)據(jù)庫(kù)連接的實(shí)例),同時(shí)會(huì)創(chuàng)建一個(gè)Connection對(duì)象,在放在一個(gè)池中(實(shí)際上是一個(gè)線程)。當(dāng)釋放這個(gè)實(shí)例的時(shí)候,此實(shí)例便關(guān)閉,此時(shí)并沒(méi)有真正的關(guān)閉數(shù)據(jù)連接,而是將Connection對(duì)象標(biāo)記為關(guān)閉后存儲(chǔ)在池中。如果這時(shí)再來(lái)啟動(dòng)一個(gè)新的業(yè)務(wù)對(duì)象,這時(shí)就會(huì)檢查現(xiàn)有的連接,如果池中有打開(kāi)的連接,即使用它,否則再創(chuàng)建一個(gè)新連接。
可能你會(huì)覺(jué)得很奇怪,如果這樣,那池中不是有很多的對(duì)象,豈不是會(huì)浪費(fèi)很多的資源,這個(gè)問(wèn)題的解決方案是你可以設(shè)置與數(shù)據(jù)庫(kù)的特定連接時(shí)間(默認(rèn)60秒),如果在這個(gè)時(shí)間內(nèi)未被使用,.NET提供就會(huì)關(guān)閉此連接。
如何打開(kāi)連接池?默認(rèn)情況下是打開(kāi)的.
如何關(guān)閉連接池?可以使用OleDbConnection.ReleaseConnectionPool()方法來(lái)關(guān)閉連接池,更或者你可以在OLE?。模逻B接字符串中加上OLE DB Services= - 4;在用SqlConnection對(duì)象時(shí)可在連接符中加上Pooling=False。這時(shí)你再調(diào)用Close()時(shí)候便會(huì)真正地關(guān)閉與數(shù)據(jù)庫(kù)的連接。
(注1:可以使用SQL事件探查器或性能監(jiān)視器來(lái)觀察連接到數(shù)據(jù)庫(kù)中的連接數(shù)目,以識(shí)別連接是否真正關(guān)閉或是只是放入池中。)
(注2:可以顯式調(diào)用Dispose()方法在垃圾收集器回收之前釋放資源,但如果你只是將Connection對(duì)象設(shè)為NULL的話,是不會(huì)斷開(kāi)與數(shù)據(jù)源的連接的)
利用Connection對(duì)象來(lái)創(chuàng)建Command對(duì)象:(ADO.NET中用Command對(duì)象來(lái)執(zhí)行數(shù)據(jù)查詢(xún),更新)例 :
SqConnection con=new SqlConnection("Provider=SQLOLEDB;Data Source=MyServer;Initial Catalog=database;Integrated Security=SSPI");
using (OleDbCommand cmd=con.CreateCommadn())
{
cmd.CommandText="select * from table";
cmd.ExecuteNonQuery();
}
(注:此處使用using 的好處是在進(jìn)行此次操作后便可釋放資源。)
利用Connection對(duì)象來(lái)創(chuàng)建Transaction對(duì)象:(Transaction對(duì)象是ADO.NET中的事務(wù)管理對(duì)象)
例:
SqConnection con=new SqlConnection("Provider=SQLOLEDB;Data Source=MyServer;Initial Catalog=database;Integrated Security=SSPI");
con.Open();
OleDbTransaction tran=con.BeginTransaction(); (注:調(diào)用此方法會(huì)在連接時(shí)返回一個(gè)新的打開(kāi)的Transaction對(duì)象來(lái)進(jìn)行事務(wù)管理)
(注:事務(wù)是指一組單一實(shí)體運(yùn)行的語(yǔ)句,可以確保數(shù)據(jù)的完整性,防止因系統(tǒng)故障或其它原因而引起的數(shù)據(jù)丟失。概念很抽象,呵呵,看下去就明白了)
事務(wù)有ACID四個(gè)屬性(即原子性,一致性,隔離性,持久性):
原子性指在執(zhí)行事務(wù)過(guò)程中,這個(gè)過(guò)程要么成功執(zhí)行,要么不執(zhí)行。
一致性指事務(wù)前和事務(wù)后的數(shù)據(jù)的一致性,也就是如果事務(wù)成功執(zhí)行的話,系統(tǒng)就返回成功的狀態(tài),即所有數(shù)據(jù)的改變標(biāo)記為已完成,如沒(méi)完成事務(wù),即回滾,并回到先前的合法狀態(tài)。
隔離性指一個(gè)事務(wù)內(nèi)的任何變化都獨(dú)立于其它的事務(wù)(相對(duì)于兩個(gè)事務(wù)的說(shuō)法)
持久性指事務(wù)是持續(xù)的,也就是事務(wù)成功完成后的改變是永久的。
(注:事務(wù)有手動(dòng)和自動(dòng)兩種,本文的主題不在此,事務(wù)的介紹在其它篇章會(huì)涉及到)
取得數(shù)據(jù)庫(kù)的架構(gòu)信息:
有時(shí)你會(huì)發(fā)覺(jué)有需要獲取數(shù)據(jù)庫(kù)的架構(gòu)信息來(lái)方便程序的運(yùn)行??墒褂肙leDbConnection對(duì)象的GetOleDbSchemaTable()方法來(lái)獲取,它需要一個(gè)參數(shù)用來(lái)作返回的架構(gòu)信息的過(guò)濾器,即只獲取表中的列或行信息,不寫(xiě)此參數(shù)則獲取整個(gè)表所有列的信息。
例:
OleDbConnectioncon=new OleDbConnection("Provider=SQLOLEDB;Data Source=MyServer;Initial Catalog=database;Integrated Security=SSPI");
con.Open();
DataTable dt=con.GetOleDbSchemaTable(OleDbSchamaGuid,null);
foreach(DataRow row in dt.Rows)
Console.WriteLine(row["column_name"].ToString());
---------------------------------------------------------------
關(guān)于AD.NET的連接對(duì)象還有很多有用的方法,具體查MSDN。