ADO.NET 是 .NET Framework 資料存取核心技術,採用斷連式架構,核心物件包括 Connection、Command、DataReader、DataAdapter、DataSet。本文以 Northwind Access 資料庫為例,示範完整資料庫連線、命令執行、資料讀取與繫結顯示流程。
| 物件 | 命名空間 | 用途 | 特點 |
| OleDbConnection | System.Data.OleDb | 建立資料庫連線 | 支援 OLE DB 提供者(Access、Excel、SQL Server 等) |
| OleDbCommand | System.Data.OleDb | 執行 SQL 指令/預存程序 | 支援參數化查詢防止 SQL Injection |
| OleDbDataReader | System.Data.OleDb | 唯讀、順向資料流 | 效能最佳、佔用記憶體少、需保持連線開啟 |
| OleDbDataAdapter | System.Data.OleDb | 填充 DataSet/更新資料庫 | 斷連式、自動開關連線 |
| DataSet | System.Data | 記憶體資料集合 | 包含多個 DataTable、關聯、條件約束 |
完整資料存取流程範例
1. 匯入命名空間
<%@ Import Namespace="System.Data.OleDb" %>
<%@ Import Namespace="System.Data" %>
2. 建立連線字串與開啟連線
<script runat="server">
OleDbConnection dbconn;
void Page_Load() {
// 連線字串:Provider=Microsoft.Jet.OLEDB.4.0 (Access 2003 .mdb)
// Access 2007+ .accdb 使用 Provider=Microsoft.ACE.OLEDB.12.0
string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=" + Server.MapPath("~/App_Data/northwind.mdb");
dbconn = new OleDbConnection(connStr);
dbconn.Open(); // 開啟連線
}
</script>
注意:連線字串必須為單行連續字串,Server.MapPath 將虛擬路徑轉換為實體路徑。
3. 建立命令與執行查詢
<script runat="server">
OleDbCommand dbcomm;
OleDbDataReader dbread;
void Page_Load() {
// ... 連線程式碼 ...
string sql = "SELECT CustomerID, CompanyName, ContactName, City, Country FROM Customers";
dbcomm = new OleDbCommand(sql, dbconn);
dbread = dbcomm.ExecuteReader(); // 傳回 DataReader
}
</script>
4. 繫結至 Repeater 控制項顯示
<script runat="server">
void Page_Load() {
if (!IsPostBack) {
string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
Server.MapPath("~/App_Data/northwind.mdb");
using (OleDbConnection conn = new OleDbConnection(connStr)) {
string sql = "SELECT CustomerID, CompanyName, ContactName, City, Country FROM Customers";
using (OleDbCommand cmd = new OleDbCommand(sql, conn)) {
conn.Open();
using (OleDbDataReader reader = cmd.ExecuteReader()) {
rptCustomers.DataSource = reader;
rptCustomers.DataBind();
}
}
}
}
}
</script>
<html><body>
<form runat="server">
<asp:Repeater ID="rptCustomers" runat="server">
<HeaderTemplate>
<table class="grid">
<tr><th>客戶代碼</th><th>公司名稱</th><th>聯絡人</th><th>城市</th><th>國家</th></tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td><%# Eval("CustomerID") %></td>
<td><%# Eval("CompanyName") %></td>
<td><%# Eval("ContactName") %></td>
<td><%# Eval("City") %></td>
<td><%# Eval("Country") %></td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
</form>
</body></html>
現代化寫法優勢
- 使用
using 區塊確保連線、命令、讀取器正確釋放(即使發生例外)
- 採用
Eval("欄位名") 資料繫結語法,比 Container.DataItem("欄位名") 更簡潔
!IsPostBack 避免回傳時重複查詢資料庫
關鍵資源釋放模式
// 傳統寫法(需手動關閉)
dbread.Close();
dbconn.Close();
// 推薦寫法:using 區塊自動呼叫 Dispose()
using (OleDbConnection conn = new OleDbConnection(connStr)) {
conn.Open();
using (OleDbCommand cmd = new OleDbCommand(sql, conn)) {
using (OleDbDataReader reader = cmd.ExecuteReader()) {
// 資料繫結...
}
}
} // 區塊結束自動關閉連線並釋放資源
參數化查詢防止 SQL Injection
string sql = "SELECT * FROM Customers WHERE Country = @Country AND City = @City";
using (OleDbCommand cmd = new OleDbCommand(sql, conn)) {
cmd.Parameters.AddWithValue("@Country", "USA");
cmd.Parameters.AddWithValue("@City", "Seattle");
// 執行查詢...
}
參數化查詢將 SQL 邏輯與資料分離,是資安基本要求。
常見提供者連線字串參考
| 資料庫 | Provider | 連線字串範例 |
| Access 2003 (.mdb) | Microsoft.Jet.OLEDB.4.0 | Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\db.mdb |
| Access 2007+ (.accdb) | Microsoft.ACE.OLEDB.12.0 | Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\db.accdb |
| SQL Server | SQLOLEDB / SQLNCLI11 | Server=myServer;Database=myDB;User Id=sa;Password=pwd; |
| SQL Server (SqlClient) | System.Data.SqlClient | Data Source=myServer;Initial Catalog=myDB;Integrated Security=SSPI; |
| Oracle | OraOLEDB.Oracle | Provider=OraOLEDB.Oracle;Data Source=myTNS;User Id=scott;Password=tiger; |
| MySQL | MySQLProv | Server=localhost;Database=test;Uid=root;Pwd=password; |
效能優化建議
- 連線共用:ADO.NET 預設啟用連線池,相同連線字串自動重用
- 僅選取需要欄位:避免
SELECT *,減少網路傳輸與記憶體佔用
- 大量資料分頁:搭配 SQL
TOP / OFFSET-FETCH 或 DataAdapter Fill(DataSet, start, max)
- 非同步執行:.NET 4.5+ 支援
ExecuteReaderAsync()、OpenAsync() 提升 Web 應用延展性
掌握 ADO.NET 基礎操作後,下一節將介紹 DataList、Repeater、GridView 等資料繫結控制項的進階應用與樣式客製化。
- 上一篇文章: ASP.NET Web Forms 母版頁完整教學:版面重複使用、ContentPlaceHolder 與巢狀母版頁
- 下一篇文章: ASP.NET Web Forms DataList 控制項完整指南:XML 繫結、樣式客製化、AlternatingItemTemplate 與分頁
Copyright ©
程式碼之家 All Rights Reserved