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

DataGridView 修改資料後資料庫未更新的排查步驟

     編輯:程式設計綜合問答

問題現象

在 Windows Forms 應用程式中使用 DataGridView 顯示並編輯 Access 資料庫資料,雖然介面上修改了資料,但呼叫 OleDbDataAdapter.Update 後資料庫並未同步更新,且未拋出明顯例外。

原始程式碼片段

string connstr = "Provider=Microsoft.Jet.OleDb.4.0;";
connstr += @"Data Source=D:\Merger201503016caohuan\GEARCNC.mdb";

OleDbConnection tempconn = new OleDbConnection(connstr);
tempconn.Open();

OleDbDataAdapter DressingWheelDA = new OleDbDataAdapter(
    "select * from DressingWheel order by 修整輪名稱", tempconn);

DataSet ds = new DataSet();
DressingWheelDA.Fill(ds, "DressingWheel");

OleDbCommandBuilder builder = new OleDbCommandBuilder(DressingWheelDA);

if (ds.HasChanges())
{
    try
    {
        DressingWheelDA.Update(ds, "DressingWheel");
    }
    catch (Exception ex)
    {
        MessageBox.Show("修整輪名稱重複", "信息提示");
    }
}

核心問題分析

  1. Catch 區塊吞沒例外:只顯示固定訊息「修整輪名稱重複」,真正的錯誤資訊 ex.Message 被忽略,導致無法得知實際失敗原因(如主鍵衝突、欄位型別不符、資料庫鎖定等)。
  2. 缺乏主鍵定義:OleDbCommandBuilder 需要資料表有主鍵才能自動產生 UPDATE/DELETE 指令。若 DressingWheel 資料表無主鍵,builder 將無法生成有效命令,Update 會靜默失敗。
  3. 資料集狀態未正確追蹤:DataGridView 編輯結束時需呼叫 EndEdit 或確認 BindingSource.EndEdit,否則 ds.HasChanges() 可能為 false。
  4. 連接字串權限:Access 檔案若為唯讀、或放在受保護目錄(如 Program Files),寫入會失敗。

修正建議

1. 完善例外處理,記錄詳細錯誤

catch (Exception ex)
{
    MessageBox.Show($"更新失敗:{ex.Message}\n堆疊:{ex.StackTrace}", "錯誤");
    // 或寫入 Log 檔案
}

2. 確認資料表有主鍵,或手動指定命令

在 Access 中為 DressingWheel 設定主鍵(如 ID 欄位)。若無法修改資料庫結構,請手動設定 UpdateCommand:

builder = new OleDbCommandBuilder(DressingWheelDA);
// 檢查自動生成的命令
Console.WriteLine(builder.GetUpdateCommand().CommandText);

3. 強制提交編輯

// 在呼叫 Update 前
dataGridView1.EndEdit();          // 若直接繫結 DataGridView
bindingSource1.EndEdit();         // 若使用 BindingSource

4. 檢查資料庫檔案權限

確認 .mdb 檔案未設為「唯讀」,且執行身分有寫入權限。建議將資料庫放在 AppData 或專案輸出目錄下。

完整修正範例

private void SaveData()
{
    try
    {
        this.Validate();                 // 觸發驗證
        this.bindingSource1.EndEdit();   // 提交編輯

        if (ds.HasChanges())
        {
            int rows = DressingWheelDA.Update(ds, "DressingWheel");
            MessageBox.Show($"成功更新 {rows} 筆資料");
        }
        else
        {
            MessageBox.Show("無資料變更");
        }
    }
    catch (OleDbException odbEx)
    {
        MessageBox.Show($"資料庫錯誤:{odbEx.Message}", "錯誤");
    }
    catch (Exception ex)
    {
        MessageBox.Show($"系統錯誤:{ex.Message}", "錯誤");
    }
}

總結

DataGridView 資料不回寫資料庫,最常見原因是 例外被吞沒、資料表缺主鍵導致 CommandBuilder 失效、編輯未提交。優先加上詳細錯誤訊息、確認主鍵存在、呼叫 EndEdit,即可解決 90% 以上案例。

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