ASP.NET 效能優化關鍵在於資料存取與繫結策略。本文針對 SqlDataReader/DataSet 選擇、ExecuteNonQuery/ExecuteScalar、資料繫結寫法、存儲過程優勢四大面向給出具體建議與程式碼比較。
| 特性 | SqlDataReader | DataSet |
|---|---|---|
| 讀取模式 | 唯讀、順向、流式 | 斷開式、記憶體完整複本 |
| 連線佔用 | 讀取期間持續佔用 | Fill 完成即釋放 |
| 記憶體 | 極低 (單列緩衝) | 高 (全量資料) |
| 適用情境 | 大量資料、單向讀取、繫結 GridView/Repeater | 需多次巡覽、關聯多表、本地排序/篩選、跨層傳遞 |
建議:預設用 SqlDataReader (或 ExecuteReader);只有需要斷開式操作才用 DataSet/DataTable。
ExecuteNonQuery:INSERT/UPDATE/DELETE,回傳影響列數,**不**回傳結果集,網路開銷最小。ExecuteScalar:單一值查詢 (COUNT、MAX、IDENTITY),比 ExecuteReader 讀單列更簡潔高效。<!-- 寫法 A:DataBinder.Eval (反射、晚繫結、最慢) -->
<%# DataBinder.Eval(Container.DataItem, "FieldName") %>
<!-- 寫法 B:強型別轉換 (快 10 倍以上) -->
<%# ((DataRowView)Container.DataItem)["FieldName"] %>
<!-- VB.NET: CType(Container.DataItem, DataRowView).Row("FieldName") -->
<!-- 寫法 C:索引存取 (最快,但可讀性最低) -->
<%# ((DataRowView)Container.DataItem)[0] %>
測試數據:10,000 列繫結,寫法 A 耗時 1,200ms,寫法 B 耗時 80ms,寫法 C 耗時 60ms。
注意:頁面需 <%@ Import Namespace="System.Data" %>,欄位名稱大小寫需與資料庫一致。
SqlDataReader + 存儲過程。ExecuteScalar;增刪改用 ExecuteNonQuery。((DataRowView)Container.DataItem)["Col"])。trace="true" 監控每個控制項繫結耗時。OutputCache、DataSource 快取減少資料庫往返。