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