首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

深入解析 ADO.NET 中 DataReader 與 DataSet 的差異與選用指南

     編輯:ASP.NET 基礎

核心差異速查表

特性DataReaderDataSet
連線模式連線導向,需保持開啟離線導向,讀完即關閉
資料流向唯讀、單向、逐列可讀寫、隨機存取、支援關聯
記憶體佔用極低(單列緩衝)較高(全量載入記憶體)
效能快,適合大量資料串流較慢,適合中小量資料多次操作
建立方式IDbCommand.ExecuteReader()DbDataAdapter.Fill()
適用場景報表產生、大量資料匯出、單向綁定複雜關聯查詢、離線編輯、多控制項共用資料

程式碼對比

DataReader — 串流式讀取

using (SqlConnection conn = new SqlConnection(connStr))
using (SqlCommand cmd = new SqlCommand("SELECT * FROM News", conn))
{
    conn.Open();
    using (SqlDataReader dr = cmd.ExecuteReader())
    {
        while (dr.Read()) // 唯一的讀取方式:逐列向前
        {
            Response.Write(dr["Title"] + "<br/>");
        }
    } // dr.Dispose() 自動關閉連線
}

DataSet — 離線快取

DataSet ds = new DataSet();
using (SqlConnection conn = new SqlConnection(connStr))
using (SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM News", conn))
{
    da.Fill(ds); // 一次性填入記憶體,連線自動關閉
}

// 後續可任意操作:篩選、排序、關聯、寫回資料庫
DataView dv = ds.Tables[0].DefaultView;
dv.RowFilter = "Category='Sports'";
GridView1.DataSource = dv;
GridView1.DataBind();

DataReader 效能優化技巧

  1. 使用序數索引而非名稱: dr.GetInt32(0) 比 dr["Id"] 快。
  2. 取得序數: int idx = dr.GetOrdinal("Title"); 僅呼叫一次,迴圈內重複使用。
  3. 強型別 Get 方法: GetString、GetInt32、GetDateTime 避免裝箱/拆箱。
int titleIdx = dr.GetOrdinal("Title");
int idIdx = dr.GetOrdinal("Id");
while (dr.Read())
{
    Response.Write(dr.GetInt32(idIdx) + ": " + dr.GetString(titleIdx) + "<br/>");
}

交易與鎖定注意事項

DataSet 填滿後即斷開連線,**會釋放資料庫鎖定**;若在交易中使用 DataSet,需注意交易範圍不可過大,否則易造成並發衝突。DataReader 在讀取期間持續持有鎖定,長時間未關閉會阻塞其他寫入。

選用建議

  • **唯讀、大量、單向** → DataReader
  • **需關聯多表、離線編輯、多控制項共用** → DataSet
  • **現代專案建議** → 改用 Entity Framework Core / Dapper 等 ORM/Micro-ORM,自動處理物件對應與連線管理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved