0

データグリッドビューでwinformsアプリケーションを使用しています。問題 :編集したデータをデータベースに保存しようとしています コード:

     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 の問題かどうかはわかりません。DB で更新されないことを除いて、エラーはありません。アプリケーションを停止してリロードすると、編集内容が DB に保存されます。

ありがとうサン

4

1 に答える 1

1

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();

備考欄はこちらを参考にしてください

また、変数をすべて保持することは良い習慣ではありません。
追跡が困難な副作用やバグが発生する可能性があります。特別なモードでは、ステートメント
にカプセル化して、接続をできるだけ早く破棄する必要があります。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();
        }
     }
于 2012-05-07T22:29:01.363 に答える