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

C# OleDbCommand 更新 Access 數據庫:缺少 WHERE 條件導致全表更新的經典錯誤與參數化修正

     編輯:程式設計綜合問答

錯誤現場


string accesstr = "update [管理員] set [用戶]='" + text1 + "'";  // ❌ 無 WHERE
OleDbCommand cmd = new OleDbCommand(accestr, cnn);
cmd.ExecuteNonQuery();  // 導致所有行 [用戶] 列都變為 text1

根因

SQL `UPDATE` 無 `WHERE` 子句 → **更新表中所有行**。

修正方案:主鍵定位 + 參數化查詢


// 假設表有主鍵 [編號] (AutoNumber/主鍵)
string sql = "UPDATE [管理員] SET [用戶] = @user WHERE [編號] = @id";

using (OleDbConnection cnn = new OleDbConnection(connStr)) {
    cnn.Open();
    using (OleDbCommand cmd = new OleDbCommand(sql, cnn)) {
        // 參數化:防注入、處理特殊字符、類型安全
        cmd.Parameters.AddWithValue("@user", text1);
        cmd.Parameters.AddWithValue("@id", targetId);  // 從 UI 獲取:DataGridView 選中行、TextBox 輸入等
        
        int rows = cmd.ExecuteNonQuery();
        if (rows > 0) MessageBox.Show("更新成功");
        else MessageBox.Show("未找到指定記錄");
    }
}

參數獲取來源

UI 場景獲取 ID 方式
DataGridView 選中行`int id = Convert.ToInt32(dgv.CurrentRow.Cells["編號"].Value);`
ListBox 選中項`int id = ((DataRowView)listBox.SelectedItem).Row.Field("編號");`
TextBox 手動輸入`int id = int.Parse(txtId.Text);` (需驗證)
ComboBox 選中`int id = (int)comboBox.SelectedValue;` (ValueMember="編號")

完整最佳實踐模板


public bool UpdateUser(int adminId, string newUserName) {
    const string sql = "UPDATE [管理員] SET [用戶] = @user WHERE [編號] = @id";
    string connStr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\test.mdb";
    
    try {
        using (var cnn = new OleDbConnection(connStr))
        using (var cmd = new OleDbCommand(sql, cnn)) {
            cmd.Parameters.Add("@user", OleDbType.VarWChar).Value = newUserName;
            cmd.Parameters.Add("@id", OleDbType.Integer).Value = adminId;
            
            cnn.Open();
            return cmd.ExecuteNonQuery() > 0;
        }
    } catch (OleDbException ex) {
        // 記錄日誌
        throw new ApplicationException("數據庫更新失敗", ex);
    }
}

常見錯誤對比

錯誤寫法問題正確寫法
字符串拼接 SQL注入風險、格式錯誤參數化 `@param`
無 WHERE 條件全表更新主鍵 WHERE
不釋放連接/命令連接泄漏、鎖表`using` 自動釋放
AddWithValue 類型推斷隱式轉換可能錯誤顯式 `Add(type).Value`

總結

**UPDATE 必須帶 WHERE**,定位主鍵。**參數化查詢**是底線。Access (Jet/ACE) 同樣支持參數化,語法 `@param` / `?` 均可。`using` 確保資源釋放,拒絕手動 `Dispose()`。

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