ADO.NET的Connection物件的使用

javaprogramers發表於2005-04-21

        在ADO.NET物件模型中,Connection物件代表了與資料來源之間的連線。.NET框架中有兩個Connection物件:一個是OleDbConnection,用於大多數的資料庫連線,一個是SqlConnection,是MS開發的專門用於針對SQL Server的連線。在建立Connection物件之前,你必須先引用System.Data.OleDb或者System.Data.SqlClient和System.Data三個名空間。

1.SQL Server資料庫的連線   

   你可以使用Connection物件的屬性來指定資料來源的位置及其它引數來連線資料庫。如:SqConnection con=new SqlConnection("Provider=SQLOLEDB;Data Source=MyServer;Initial Catalog=database;use id=yourid,password=yourpassword;");

這是連線到本地資料庫,如果你想連到網路上的的資料庫,就要利用整合安全性,同時忽略使用者名稱和密碼。如:

SqConnection con=new SqlConnection("Provider=SQLOLEDB;Data Source=MyServer;Initial Catalog=database;Integrated Security=SSPI");

如果使用的是ODBC連線到SQL Server,可以通過使用Trusted_Connection=yes;來使用網路資料庫。

2.Oracle資料庫的連線:(前提:必須先安裝Oracle客戶端實用工具的適當版本,並建立資料庫別名,接著就可以用以下的連線字串進行連線)

SqConnection con=new SqlConnection("Provider=MSDAORA;Data Source=dbAlias;User id=yourid,password=youpwd;);

3.Access資料庫的連線:(你可以使用以下連線字串來連線)

SqConnection con=new SqlConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:/yourdb.mdb;User id=yourid,password=youpwd;);

連線到資料庫之後即可呼叫Connection物件的Open()方法來開啟與資料庫的連線,同理Close()方法用來關閉與資料庫的連線。

連線池:

      連線池是什麼?在一個三層結構(或N層)中,當一個客戶端與中間層伺服器進行通訊的時候,伺服器會建立一個與資料庫連線,並執行操作的業務物件(也就是與資料庫連線的例項),同時會建立一個Connection物件,在放在一個池中(實際上是一個執行緒)。當釋放這個例項的時候,此例項便關閉,此時並沒有真正的關閉資料連線,而是將Connection物件標記為關閉後儲存在池中。如果這時再來啟動一個新的業務物件,這時就會檢查現有的連線,如果池中有開啟的連線,即使用它,否則再建立一個新連線。

可能你會覺得很奇怪,如果這樣,那池中不是有很多的物件,豈不是會浪費很多的資源,這個問題的解決方案是你可以設定與資料庫的特定連線時間(預設60秒),如果在這個時間內未被使用,.NET提供就會關閉此連線。

      如何開啟連線池?預設情況下是開啟的.

      如何關閉連線池?可以使用OleDbConnection.ReleaseConnectionPool()方法來關閉連線池,更或者你可以在OLE DB連線字串中加上OLE DB Services= - 4;在用SqlConnection物件時可在連線符中加上Pooling=False。這時你再呼叫Close()時候便會真正地關閉與資料庫的連線。

(注1:可以使用SQL事件探查器或效能監視器來觀察連線到資料庫中的連線數目,以識別連線是否真正關閉或是隻是放入池中。)

(注2:可以顯式呼叫Dispose()方法在垃圾收集器回收之前釋放資源,但如果你只是將Connection物件設為NULL的話,是不會斷開與資料來源的連線的)

      利用Connection物件來建立Command物件:(ADO.NET中用Command物件來執行資料查詢,更新)例 :

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物件來建立Transaction物件:(Transaction物件是ADO.NET中的事務管理物件)

例:

SqConnection con=new SqlConnection("Provider=SQLOLEDB;Data Source=MyServer;Initial Catalog=database;Integrated Security=SSPI");

con.Open();

OleDbTransaction tran=con.BeginTransaction(); (注:呼叫此方法會在連線時返回一個新的開啟的Transaction物件來進行事務管理)

(注:事務是指一組單一實體執行的語句,可以確保資料的完整性,防止因系統故障或其它原因而引起的資料丟失。概念很抽象,呵呵,看下去就明白了)

事務有ACID四個屬性(即原子性,一致性,隔離性,永續性):

原子性指在執行事務過程中,這個過程要麼成功執行,要麼不執行。

一致性指事務前和事務後的資料的一致性,也就是如果事務成功執行的話,系統就返回成功的狀態,即所有資料的改變標記為已完成,如沒完成事務,即回滾,並回到先前的合法狀態。

隔離性指一個事務內的任何變化都獨立於其它的事務(相對於兩個事務的說法)

永續性指事務是持續的,也就是事務成功完成後的改變是永久的。

(注:事務有手動和自動兩種,本文的主題不在此,事務的介紹在其它篇章會涉及到)

      取得資料庫的架構資訊:

  有時你會發覺有需要獲取資料庫的架構資訊來方便程式的執行。可使用OleDbConnection物件的GetOleDbSchemaTable()方法來獲取,它需要一個引數用來作返回的架構資訊的過濾器,即只獲取表中的列或行資訊,不寫此引數則獲取整個表所有列的資訊。

例:

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());

---------------------------------------------------------------

關於AD.NET的連線物件還有很多有用的方法,具體查MSDN。

相關文章