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

ADO.NET CRUD 三大經典模式:增刪改、DataGridView 綁定、ListView 讀取

     編輯:更多程式設計知識

前言

ADO.NET 核心類別 SqlConnection、SqlCommand、SqlDataAdapter、SqlDataReader 組合出三種最常見的資料操作模式。掌握這三套路,即可應付 90% 的 WinForms/WebForms 資料存取需求。

模式一:增、刪、改 —— ExecuteNonQuery

適用於不需回傳結果集的 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 等)。

模式二:查詢並綁定 DataGridView —— SqlDataAdapter + DataSet

適合需編輯、排序、分頁的表格式資料呈現。

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。

模式三:查詢並填充 ListView —— SqlDataReader 逐列讀取

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) 強型別讀取避免裝箱。

進階補充

  • 非同步操作:.NET 4.5+ 可用 ExecuteNonQueryAsync、ExecuteReaderAsync、FillAsync 避免阻塞 UI 執行緒。
  • 連線重用:ADO.NET 連線池預設啟用,同一連線字串會自動重用實體連線。
  • 參數化最佳實務:明確指定 SqlDbType 與 Size 可避免隱含轉換導致的計畫快取污染。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved