2012-05-07 20 views
0

私はwinformsアプリケーションをdatagridviewで使用しています。 問題:データベース コードで編集したデータを保存しようとすると:これはSqliteを持つ問題である場合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; 
      } 

     } 

わかりません。 DB内で更新されない点を除き、エラーはありません。アプリケーションを停止してリロードすると、編集内容がDBに保存されます。

は、私はあなたの周りvarsはそのすべてを維持することは良くありません、私も言ってみましょうれるAcceptChangesとUpdateライン

  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

の順序を逆にすべきだと思うあなた 日

+0

変更を見ていけないことをあなたは意味がWinフォームがありますか?しかし、それらはDBに保存/更新されていますか? – feco

+0

@feco:DBの変更は表示されません。アプリケーションを再起動すると、初期値のフォームがロードされます – user575219

答えて

1

ありがとうございました練習。
これらは、副作用やバグの追跡が困難な場合があります。
特殊モードでは、できるだけ早く接続を取り、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はraiseです。並行性違反:UpdateCommandは、期待される1レコードの0に影響を与えました。 – user575219

+0

FillDataでは、接続が閉じないと表示されません。 clickイベントでは、別の接続を開きますが、clickイベントで作成されたSqLiteDataAdapterを使用します。私が言ったように、接続を開いたままにしないでください。 – Steve

関連する問題