ADO.NET 核心類別 SqlConnection、SqlCommand、SqlDataAdapter、SqlDataReader 組合出三種最常見的資料操作模式。掌握這三套路,即可應付 90% 的 WinForms/WebForms 資料存取需求。
適用於不需回傳結果集的 INSERT/UPDATE/DELETE/Stored Procedure。
using (SqlConnection conn = new SqlConnection(connStr)) {
string sql = "UPDATE Products SET UnitPrice = @price WHERE ProductID = @id";
using (SqlCommand cmd = new SqlCommand(sql, conn)) {
cmd.Parameters.AddWithValue("@price", 123.45);
cmd.Parameters.AddWithValue("@id", 1);
conn.Open();
int affected = cmd.ExecuteNonQuery(); // 回傳影響列數
}
}
要點:務必使用參數化查詢防 SQL Injection;ExecuteNonQuery 亦可執行 DDL(CREATE TABLE 等)。
適合需編輯、排序、分頁的表格式資料呈現。
using (SqlConnection conn = new SqlConnection(connStr)) {
string sql = "SELECT ProductID, ProductName, UnitPrice FROM Products";
using (SqlDataAdapter da = new SqlDataAdapter(sql, conn)) {
DataSet ds = new DataSet();
da.Fill(ds, "Products");
dataGridView1.DataSource = ds.Tables["Products"];
// 若需支援使用者編輯後寫回資料庫
// 1. 查詢必須包含主鍵欄位
// 2. 使用 SqlCommandBuilder 自動產生 UPDATE/INSERT/DELETE 指令
SqlCommandBuilder cb = new SqlCommandBuilder(da);
da.Update(ds.Tables["Products"]); // 將 DataSet 異動批次寫回
}
}
關鍵:Fill 會自動開關連線;Update 依 RowState 決定執行 INSERT/UPDATE/DELETE。
SqlDataReader 唯讀、前進、低記憶體,適合大量資料的唯讀顯示。
using (SqlConnection conn = new SqlConnection(connStr)) {
string sql = "SELECT ProductID, ProductName, UnitPrice FROM Products";
using (SqlCommand cmd = new SqlCommand(sql, conn)) {
conn.Open();
using (SqlDataReader dr = cmd.ExecuteReader()) {
while (dr.Read()) {
ListViewItem lvi = new ListViewItem(dr["ProductName"].ToString());
lvi.Tag = dr["ProductID"]; // 存放主鍵供後續操作
lvi.SubItems.Add(dr["UnitPrice"].ToString());
listView1.Items.Add(lvi);
}
}
}
}
優勢:記憶體佔用極低,適合百萬列以上資料;可搭配 dr.GetInt32(0) 強型別讀取避免裝箱。
ExecuteNonQueryAsync、ExecuteReaderAsync、FillAsync 避免阻塞 UI 執行緒。SqlDbType 與 Size 可避免隱含轉換導致的計畫快取污染。