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

.NET 一次資料庫連接執行多條 SQL:缺少 ExecuteNonQuery 是關鍵

     編輯:程式設計疑難解答

錯誤代碼片段

SqlCommand cmd2 = new SqlCommand(sql2, conn);
// 缺少 cmd2.ExecuteNonQuery();
SqlCommand cmd1 = new SqlCommand(sql1, conn);
// 缺少 cmd1.ExecuteNonQuery();

建立 SqlCommand 只是**準備指令**,**必須呼叫執行方法**才會真正送往資料庫:

  • ExecuteNonQuery():執行 INSERT/UPDATE/DELETE/DDL,**回傳影響列數**(int)。
  • ExecuteScalar():執行單一值查詢(如 COUNT(*), MAX(id)),回傳 object。
  • ExecuteReader():執行 SELECT 回傳 SqlDataReader(串流讀取)。
  • ExecuteXmlReader():回傳 XmlReader。

修正代碼

using (SqlConnection conn = new SqlConnection(connStr)) {
    conn.Open();
    // 1. 查詢是否存在
    string sqlCheck = "SELECT 編號 FROM CS WHERE 編號 = @id";
    using (SqlCommand cmdCheck = new SqlCommand(sqlCheck, conn)) {
        cmdCheck.Parameters.AddWithValue("@id", TextBox1.Text.Trim());
        object result = cmdCheck.ExecuteScalar();
        if (result != null) {
            // 2. 存在 → 更新數量
            string sqlUpdate = "UPDATE CS SET 數量 = 數量 + 1 WHERE 編號 = @id";
            using (SqlCommand cmdUpdate = new SqlCommand(sqlUpdate, conn)) {
                cmdUpdate.Parameters.AddWithValue("@id", TextBox1.Text.Trim());
                int rows = cmdUpdate.ExecuteNonQuery();  // 關鍵!
                if (rows > 0) Response.Write("<script>alert('更新成功')</script>");
            }
        } else {
            // 3. 不存在 → 插入新記錄
            string sqlInsert = "INSERT INTO CS (編號, 索書號, 書名, 作者, 數量) VALUES (@id, @isbn, @title, @author, 1)";
            using (SqlCommand cmdInsert = new SqlCommand(sqlInsert, conn)) {
                cmdInsert.Parameters.AddWithValue("@id", TextBox1.Text.Trim());
                cmdInsert.Parameters.AddWithValue("@isbn", TextBox2.Text.Trim());
                cmdInsert.Parameters.AddWithValue("@title", TextBox3.Text.Trim());
                cmdInsert.Parameters.AddWithValue("@author", TextBox4.Text.Trim());
                int rows = cmdInsert.ExecuteNonQuery();  // 關鍵!
                if (rows > 0) Response.Write("<script>alert('插入成功')</script>");
            }
        }
    }
} // using 區塊結束自動 conn.Close()、Dispose()

關鍵改進點

  1. 參數化查詢(@id)防 SQL 注入,原代碼字串拼接極度危險。
  2. using 區塊確保連接/指令/讀取器正確 Dispose,即使拋異常也能釋放資源。
  3. 檢查 ExecuteNonQuery 返回值 確認是否真正影響資料列。
  4. 事務控制(可選): 若多條 SQL 需原子性,用 SqlTransaction 包裹。

效能提示

  • 同一連接執行多條指令時,**重用 SqlCommand 物件**(更改 CommandText、Parameters)可減少物件分配。
  • 批次大量操作考慮 SqlBulkCopy 或 Table-Valued Parameters (TVP)。

總結: new SqlCommand(...) 只是造指令物件,**必須呼叫 ExecuteNonQuery() 等執行方法**才會發送 SQL 到資料庫。配合參數化查詢、using 區塊、返回值檢查,即為標準 .NET ADO.NET 最佳實踐。

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