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()
@id)防 SQL 注入,原代碼字串拼接極度危險。using 區塊確保連接/指令/讀取器正確 Dispose,即使拋異常也能釋放資源。ExecuteNonQuery 返回值 確認是否真正影響資料列。SqlTransaction 包裹。SqlCommand 物件**(更改 CommandText、Parameters)可減少物件分配。SqlBulkCopy 或 Table-Valued Parameters (TVP)。總結: new SqlCommand(...) 只是造指令物件,**必須呼叫 ExecuteNonQuery() 等執行方法**才會發送 SQL 到資料庫。配合參數化查詢、using 區塊、返回值檢查,即為標準 .NET ADO.NET 最佳實踐。