天天看點

ADO.NET DataReader使用技巧搜集總結

經常上網收集資料,自己看多了也能總結出一些東西,在這裡究一些使用ADO.NET DataReader 獲得最佳性能的技巧來說誰,同時還回答了一些關于使用ADO.NET DataReader的常見問題。

◆在通路相關 Command 的任何輸出參數之前,必須關閉 DataReader。

◆完成讀資料之後總是要關閉 DataReader。如果使用 Connection 隻是用于傳回 DataReader,那麼關閉 DataReader 之後立刻關閉它。

另外一個顯式關閉 Connection 的方法是把 CommandBehavior.CloseConnection 傳遞給 ExecuteReader 方法,以確定相關的連接配接在關閉 ADO.NET DataReader 時被關閉。如果從一個方法傳回DataReader,而且不能控制 DataReader 或相關連接配接的關閉,則這樣做特别有用。

◆不能在層之間遠端通路 DataReader。DataReader 是為已連接配接好的資料通路設計的。

◆當通路列資料時,使用類型化通路器,例如,GetString、GetInt32 等。這使您不用進行将 GetValue 傳回的 Object 強制轉換成特定類型所需的處理。

◆一個單一連接配接每次隻能打開一個 DataReader。在 ADO 中,如果打開一個單一連接配接,并且請求兩個使用隻進、隻讀遊标的記錄集,那麼 ADO 會在遊标生存期内隐式打開第二個、未池化的到資料存儲區的連接配接,然後再隐式關閉該連接配接。對于 ADO.NET,“秘密”完成的動作很少。如果想在相同的資料存儲區上同時打開兩個 DataReaders,就必須顯式建立兩個連接配接,每個 DataReader 一個。這是 ADO.NET 為池化連接配接的使用提供更多控制的一種方法。

◆ExecuteReader 調用。這将 DataReader 的預設行為更改為僅在請求時将資料加載到記憶體。注意,CommandBehavior.SequentialAccess 要求順序通路傳回的列。也就是說,一旦讀過傳回的列,就不能再讀它的值了。

◆如果已經完成讀取來自 DataReader 的資料,但仍然有大量挂起的未讀結果,就在調用 DataReader 的 Close 之前先調用 Command 的 Cancel。調用 DataReader 的 Close 會導緻在關閉遊标之前檢索挂起的結果并清空流。調用 Command 的 Cancel 會放棄伺服器上的結果,這樣,DataReader 在關閉的時候就不必讀這些結果。如果要從 Command 傳回輸出參數,還要調用 Cancel 放棄它們。如果需要讀取任何輸出參數,不要調用 Command 的 Cancel,隻要調用 DataReader 的 Close 即可。

二進制大對象 (BLOB)

用 DataReader 檢索二進制大對象 (BLOB) 時,應該把 CommandBehavior.SequentialAccess 傳遞給 ExecuteReader 方法調用。因為 DataReader 的預設行為是每次 Read 都把整行加載到記憶體,又因為 BLOB 值可能非常大,是以結果可能由于單個 BLOB 而使大量記憶體被用光。SequentialAccess 将 DataReader 的行為設定為隻加載請求的資料。然後還可以使用 GetBytes 或 GetChars 控制每次加載多少資料。

記住,使用 SequentialAccess 時,不能不按順序通路 DataReader 傳回的不同字段。也就是說,如果查詢傳回三列,其中第三列是 BLOB,并且想通路前兩列中的資料,就必須在通路 BLOB 資料之前先通路第一列的值,然後通路第二列的值。這是因為現在資料是順序傳回的,并且 DataReader 一旦讀過該資料,該資料就不再可用。

來源:http://www.xker.com/page/e2009/1029/83607.html

繼續閱讀