| 維度 | DataReader | DataSet |
|---|---|---|
| 連線模式 | 連線導向 (Connected) —— 全程佔用 Connection | 離線導向 (Disconnected) —— 讀完即釋放 Connection |
| 資料載入 | 單行緩衝,唯讀、唯前向 (Forward-only) | 一次性載入記憶體,可隨機存取、可修改 |
| 記憶體佔用 | 極低(單行) | 較高(全量資料 + 結構描述) |
| 效能 | 極快,適合大量資料流式處理 | 較慢,適合中小量資料多次操作 |
| 功能豐富度 | 基礎讀取 | 關聯、約束、序列化、XML、批次更新 |
| 建構方式 | cmd.ExecuteReader() | adapter.Fill(dataset) |
| 關閉連線時機 | Reader 關閉前不可關閉 Connection(除非 CommandBehavior.CloseConnection) | Fill 完成後立即可關閉 Connection |
using (var conn = new OracleConnection(connStr))
using (var cmd = new OracleCommand(sql, conn))
{
conn.Open();
using (var reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
while (reader.Read())
{
// 處理單行
var id = reader.GetInt32(0);
var name = reader.GetString(1);
}
}
} // 自動關閉 reader & connection
var ds = new DataSet();
using (var conn = new OracleConnection(connStr))
using (var adapter = new OracleDataAdapter(sql, conn))
{
adapter.Fill(ds); // 連線自動開啟/關閉
}
// 此時 conn 已關閉,ds 在記憶體中可隨意操作
foreach (DataRow row in ds.Tables[0].Rows) { ... }
ds.Tables[0].Rows[0]["Name"] = "NewName"; // 修改
adapter.Update(ds); // 批次寫回資料庫
using 或 finally 確保關閉。NextResult() 處理;DataSet 自動填充多 Tables。// DataTable 封裝
public static DataTable GetTable(string sql, OracleParameter[] paras = null, CommandType type = CommandType.Text) {
var dt = new DataTable();
using (var conn = new OracleConnection(connStr))
using (var adapter = new OracleDataAdapter(sql, conn)) {
adapter.SelectCommand.CommandType = type;
if (paras != null) adapter.SelectCommand.Parameters.AddRange(paras);
adapter.Fill(dt);
}
return dt;
}
// DataReader 封裝(注意:呼叫端負責關閉 reader 及 connection)
public static OracleDataReader GetReader(string sql, OracleParameter[] paras = null, CommandType type = CommandType.Text) {
var conn = new OracleConnection(connStr);
var cmd = new OracleCommand(sql, conn) { CommandType = type };
if (paras != null) cmd.Parameters.AddRange(paras);
conn.Open();
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
DataReader = 高效水管,水過管空,適合大流量單向輸送。
DataSet = 多功能水池,水存池中,可隨時取用、加工、回灌,但挖池子(填充)與存水(記憶體)有成本。
根據業務場景選擇,而非習慣偏好。