2012-05-07 61 views
0

我正在使用winforms應用程序和datagridview。 問題:嘗試編輯的數據保存在數據庫中 代碼:DataGridview未更新至DB

 private void FillData(string selectCommand) 
     { 
      SQLiteConnection conn = new SQLiteConnection(connString); 
      dataGridView1.AutoGenerateColumns = true; 
      string selectCommand = "select * from Table1"; 
      da = new SQLiteDataAdapter(selectCommand, connString); 
      conn.Open(); 
      ds = new DataSet(); 
      SQLiteCommandBuilder commandBuilder = new SQLiteCommandBuilder(da); 
      da.Fill(ds,"Design1"); 
      dataGridView1.DataSource = ds.Tables[0] ; 
      dataGridView1.DataMember = "Design1"; 
     } 
private void btnSave_Click(object sender, EventArgs e) 
     { 
      SQLiteConnection conn = new SQLiteConnection(connString); 
      try 
      { 

       dataGridView1.EndEdit(); 

       for (int i = 0; i < ds.Tables[0].Rows.Count; i++) 
       { 
        ds.Tables[0].Rows[i].AcceptChanges(); 
       } 

       da.Update(ds.Tables[0]); 


      } 
      catch (Exception ex) 
      { 

       throw ex; 
      } 

     } 

不知道這是SQLite的一個問題。 沒有錯誤,但它不在數據庫中更新。一旦我停止了應用程序並重新加載它,編輯就保存在數據庫中。

謝謝 孫

+0

你的意思是你沒有看到的變化是在WinForm?但他們被保存/更新在數據庫中? – feco

+0

@feco:我沒有看到數據庫中的更改。一旦我重新啓動應用程序的形式加載與初始值 – user575219

回答

1

我想你應該扭轉的AcceptChanges和更新行的順序

  dataGridView1.EndEdit(); 
      da.Update(ds.Tables[0]); 
      // Just accept on the table, no need to do row by row 
      ds.Tables[0].AcceptChanges(); 

See the Remarks here for a reference

我還要說一下,保持所有瓦爾周圍是不是一個好實踐。
他們可能會引入難以跟蹤的副作用和錯誤。
在特殊模式下,應儘可能快地處理連接,並在using語句中進行封裝。 (前提是你明確地請求連接池功能 - >"Pooling=True;Max Pool Size=100;"

例如:

 private void SaveData(DataGridView dgv, string selectCommand) 
    { 
     using(SQLiteConnection conn = new SQLiteConnection(connString)) 
     { 
      conn.Open(); 
      SQLiteDataAdapter da = new SQLiteDataAdapter(selectCommand, connString); 
      SQLiteCommandBuilder commandBuilder = new SQLiteCommandBuilder(da); 
      DataTable dt = dgv.DataSource as DataTable; 
      da.Update(dt); 
      dt.AcceptChanges(); 
     } 
    } 
+0

我顛倒了以上建議的順序。但是會引發DBConcurrencyException。併發衝突:UpdateCommand影響了預期的1條記錄中的0個。 – user575219

+0

在FillData中,我看不到連接關閉。在你的點擊事件中,你打開另一個連接,但使用在click事件中創建的SqLiteDataAdapter。正如我所說,不要保持連接打開。 – Steve