SqlDataReader 是 ADO.NET 中用於從 SQL Server 以「向前、唯讀」方式快速讀取資料流的核心類別。相較於 DataSet,它犧牲了排序、分頁等豐富功能,換取極佳的效能與低記憶體占用,常被稱為「火管游標」。對應其他資料來源,亦有 OleDbDataReader(Oracle、Access)與 OdbcDataReader(ODBC 來源)可用。
| 屬性 | 型別 | 說明 |
|---|---|---|
| Depth | int | 目前資料列的巢狀深度 |
| FieldCount | int | 目前資料列的欄位數 |
| IsClosed | bool | 資料閱讀器是否已關閉 |
| RecordsAffected | int | 執行 INSERT/UPDATE/DELETE 影響的列數 |
| 方法 | 回傳型別 | 說明 |
|---|---|---|
| Read() | bool | 前移到下一列並讀取,若無資料回傳 false |
| GetValue(int) | object | 取得指定欄位的值 |
| GetValues(object[]) | int | 將目前列所有欄位值複製到陣列,回傳複製數量 |
| NextResult() | bool | 移至下一個結果集(多重結果集時使用) |
| Close() | void | 關閉 DataReader,釋放連接 |
| GetInt32、GetDateTime 等 | 強型別 | 直接以對應型別取值,型別不符會拋出 InvalidCastException |
using (SqlConnection conn = new SqlConnection(connStr))
using (SqlCommand cmd = new SqlCommand("SELECT Id, Name FROM Products", conn))
{
conn.Open();
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
int id = reader.GetInt32(0);
string name = reader.GetString(1);
// 處理資料...
}
}
}
提醒:DataReader 佔用連接期間連接保持開啟,務必在 using 區塊或 finally 中確實呼叫 Close(),避免連線洩漏。