全面總結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 一旦讀過該數據,該數據就不再可用。
【編輯推薦】