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

ASP.NET Web Forms 資料庫連線與 ADO.NET 實戰:OleDb 存取 Access、DataReader 與 Repeater 繫結

     編輯:ASP.NET 基礎

ASP.NET Web Forms 資料庫連線與 ADO.NET 實戰:OleDb 存取 Access、DataReader 與 Repeater 繫結

ADO.NET 是 .NET Framework 資料存取核心技術,採用斷連式架構,核心物件包括 Connection、Command、DataReader、DataAdapter、DataSet。本文以 Northwind Access 資料庫為例,示範完整資料庫連線、命令執行、資料讀取與繫結顯示流程。

ADO.NET 核心物件架構

完整資料存取流程範例

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 邏輯與資料分離,是資安基本要求。

常見提供者連線字串參考

物件命名空間用途特點
OleDbConnectionSystem.Data.OleDb建立資料庫連線支援 OLE DB 提供者(Access、Excel、SQL Server 等)
OleDbCommandSystem.Data.OleDb執行 SQL 指令/預存程序支援參數化查詢防止 SQL Injection
OleDbDataReaderSystem.Data.OleDb唯讀、順向資料流效能最佳、佔用記憶體少、需保持連線開啟
OleDbDataAdapterSystem.Data.OleDb填充 DataSet/更新資料庫斷連式、自動開關連線
DataSetSystem.Data記憶體資料集合包含多個 DataTable、關聯、條件約束
資料庫Provider連線字串範例
Access 2003 (.mdb)Microsoft.Jet.OLEDB.4.0Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\db.mdb
Access 2007+ (.accdb)Microsoft.ACE.OLEDB.12.0Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\db.accdb
SQL ServerSQLOLEDB / SQLNCLI11Server=myServer;Database=myDB;User Id=sa;Password=pwd;
SQL Server (SqlClient)System.Data.SqlClientData Source=myServer;Initial Catalog=myDB;Integrated Security=SSPI;
OracleOraOLEDB.OracleProvider=OraOLEDB.Oracle;Data Source=myTNS;User Id=scott;Password=tiger;
MySQLMySQLProvServer=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 等資料繫結控制項的進階應用與樣式客製化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved