詳讀ADO.NET特性相關(guān)技巧
要設(shè)置ADO.NET時(shí),需要注意的是:如果你沒有明確地提供參數(shù)信息,ADO.NET特性使用每一個(gè)命令執(zhí)行重新建立OLE DB參數(shù)存取程序。 這樣就刪除了在命令執(zhí)行前分析命令的需求,明確地把它標(biāo)識(shí)為存儲(chǔ)過程了。
在訪問任何與命令(Command)相關(guān)的輸出參數(shù)前DataReader必須關(guān)閉。 在讀完數(shù)據(jù)后就關(guān)閉DataReader。如果你正在使用的連接只返回該DataReader,在關(guān)閉DataReader后立即關(guān)閉連接。
另一種明確地關(guān)閉連接的方法是給ExecuteReader方法傳遞CommandBehavior.CloseConnection以確保當(dāng)DataReader關(guān)閉時(shí)相關(guān)的連接關(guān)閉了。如果你從某個(gè)方法返回DataReader,并且沒有辦法控制DataReader或者相關(guān)的連接關(guān)閉的情況下特別有用。
DataReader不能在層之間遠(yuǎn)程訪問。ADO.NET特性是設(shè)計(jì)用于連接數(shù)據(jù)訪問的。 使用類型化的存取程序(例如GetString、GetInt32等等)來訪問列數(shù)據(jù)。這節(jié)省了將GetValue返回的對(duì)象作為特定類型的必要的處理。 #t#
在某一時(shí)刻只有一個(gè)DataReader能夠打開。。在ADO中,如果你打開一個(gè)連接并請(qǐng)求兩個(gè)使用只向前的只讀游標(biāo)的記錄集,ADO隱性地為游標(biāo)的生命周期的數(shù)據(jù)存儲(chǔ)打開第二個(gè)不在連接池中的連接,接著隱性地關(guān)閉它。在ADO.NET中,如果你想在同一個(gè)數(shù)據(jù)存儲(chǔ)上同時(shí)打開兩個(gè)DataReader,你必須明確地建立兩個(gè)連接,每個(gè)DataReader一個(gè)。通過這種方法ADO.NET給了你對(duì)連接池使用的更多控制。
默認(rèn)情況下,ADO.NET特性在每個(gè)Read方法中把整個(gè)行載入內(nèi)存中。這允許你隨機(jī)訪問當(dāng)前行的任意列。如果隨機(jī)訪問是不必要的,ADO.NET特性為了提高性能,把CommandBehavior.SequentialAccess傳遞給ExecuteReader調(diào)用。這改變了DataReader的默認(rèn)行為,只在需要時(shí)才把數(shù)據(jù)載入內(nèi)存。注意CommandBehavior.SequentialAccess要求你按次序訪問返回的列。也就是,一旦你讀過了返回的某個(gè)列,就不能再次讀取它的值了。
如果你結(jié)束了從DataReader中讀取數(shù)據(jù),但是仍然有大量的未讀取的結(jié)果等待,那么調(diào)用Command的Cancel比調(diào)用DataReader 的Close好。調(diào)用DataReader 的Close引起它檢索等待的結(jié)果并且先清空流后關(guān)閉游標(biāo)。調(diào)用Command的 Cancel刪除服務(wù)器上的結(jié)果,因此當(dāng)DataReader關(guān)閉時(shí),它不需要再讀取結(jié)果。如果你從ADO.NET特性返回輸出參數(shù),則調(diào)用Cancel刪除它們。如果你要讀取任何輸出參數(shù),不要調(diào)用Command 的Cancel;***調(diào)用DataReader的 Close。






