ADO.NET 提供兩種存取模式:
| 實體資料庫 | 記憶體模型 (ADO.NET) |
|---|---|
| Database | DataSet |
| Table / View | DataTable / DataView |
| Row | DataRow |
| Column | DataColumn |
| Relation (FK) | DataRelation |
| Constraint (PK/Unique) | UniqueConstraint / ForeignKeyConstraint |
`SqlConnection` (SQL Server)、`OleDbConnection` (Access/其他)。關鍵:連線字串、開啟/關閉、連線池 (`Pooling=true` 預設開啟)。
using (var conn = new SqlConnection(connStr))
{
conn.Open(); // 從連線池取得或建立實體連線
// 執行命令...
} // 自動釋放回連線池
執行 SQL/預存程序。`CommandType`:`Text` (預設)、`StoredProcedure`、`TableDirect`。參數化查詢防 SQL Injection。
using (var cmd = new SqlCommand("SELECT * FROM Users WHERE Age > @Age", conn))
{
cmd.Parameters.AddWithValue("@Age", 18);
// ExecuteReader / ExecuteScalar / ExecuteNonQuery
}
`SqlDataReader`:高效能、低記憶體、只能向前讀取一筆。`Read()` 推進至下一筆,`GetXxx(ordinal)` 取值。
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
int id = reader.GetInt32(0);
string name = reader.GetString(1);
}
}
`SqlDataAdapter`:`SelectCommand`/`InsertCommand`/`UpdateCommand`/`DeleteCommand`。`Fill(DataSet)` 載入資料,`Update(DataSet)` 批次寫回資料庫。
包含 `Tables` (DataTableCollection)、`Relations` (DataRelationCollection)。支援 XML 序列化 (`WriteXml`/`ReadXml`)、異動追蹤 (`GetChanges`/`AcceptChanges`/`RejectChanges`)。
核心屬性:`Columns` (DataColumnCollection)、`Rows` (DataRowCollection)、`Constraints`、`PrimaryKey`、`DefaultView` (DataView)。支援 `Select(filter)`、`Compute(agg, filter)`、`ImportRow`、`Merge`。
永不拼接字串。`Parameters.Add("@Name", SqlDbType.NVarChar, 50).Value = val;` 明確指定型別長度可重用执行计划。
-- SQL Server 2012+ OFFSET FETCH
SELECT * FROM Users ORDER BY UserId OFFSET @PageSize * (@PageIndex - 1) ROWS FETCH NEXT @PageSize ROWS ONLY;
-- 通用 CTE 分頁 (2005+)
WITH Paged AS (SELECT *, ROW_NUMBER() OVER (ORDER BY UserId) AS RN FROM Users)
SELECT * FROM Paged WHERE RN BETWEEN @Start AND @End;
using (var conn = new SqlConnection(connStr))
{
conn.Open();
using (var tran = conn.BeginTransaction())
{
try
{
// 多個命令共用 tran
tran.Commit();
}
catch { tran.Rollback(); throw; }
}
}
ADO.NET 以 `Connection`/`Command`/`DataReader` 構建高效連線模式,以 `DataAdapter`/`DataSet`/`DataTable` 構建豐富離線模型。根據場景選擇:大量唯讀串流用 `DataReader`;複雜關聯、UI 繫結、多層傳遞用 `DataSet`。參數化查詢、連線池、交易控制是寫出健壯資料存取程式的鐵律。