none
セルの値を変更してデータベースを更新する際の「同時実行違反」回避策? RRS feed

  • 質問

  • お早うございます、zen73です。セルの値を変更してデータベースを更新する際「同時実行違反」になってしまいます。このことを回避する方法をお尋ねします。

     

    「出納簿」を作っていますが、9列 :入金  10列 :出金  11列 :残高 としています。

    9列か10列のどちらかの列で金額を訂正したとき、残高を再計算して表示しています。

     

    このあとに、訂正した金額でデータベースを更新したいのですが、「同時実行違反」のため更新することができません。これの回避策をお教え願います。

     

    コード ブロック

            private void suitoDataGridView_CellValueChanged(

                       object sender, DataGridViewCellEventArgs e)
            {
                int iCol = e.ColumnIndex;
                int iRow = e.RowIndex;
                DataGridView dgv = (DataGridView)sender;
                switch (iCol)
                {
                    case 9:
                    case 10:
                        reCalc(iCol, iRow, sender);
                        break;
                }
            }
            private void reCalc(int iCol, int iRow, object sender)
            {
                DataGridView dgv = (DataGridView)sender;
                int a, b, c;    //残高,入金,出金
                for (int i = 0; i < dgv.Rows.Count - 1; i++)
                {
                    if (i == 0)
                    {
                        a = 0;
                    }
                    else
                    {
                        a = (dgv[11, i - 1].Value != DBNull.Value) ?

                               Convert.ToInt32(dgv[11, i - 1].Value) : 0;
                    }
                    b = (dgv[9, i].Value != DBNull.Value) ?

                               Convert.ToInt32(dgv[9, i].Value) : 0;
                    c = (dgv[10, i].Value != DBNull.Value) ?

                               Convert.ToInt32(dgv[10, i].Value) : 0;
                    dgv[11, i].Value = a + b - c;
                }
            }

     

     

    2007年10月10日 20:23

回答

  •  zen73 さんからの引用

    >AcceptChangesメソッドを実行していないでしょうか?

        このメッソドは実行していません。しかし、何かが邪魔をしているのは間違いのないことです。

        Visual C#フォーラムでもお聞きしているColumnWidthChangedイベントの実行を止めると、同

        時実行違反にはなりません。

     

    ColumnWidthChangedイベントで処理するコードはどのようになっているのでしょうか?

     

     zen73 さんからの引用

    >「同時実行違反」の制御自体を止めてしまった方が効率が良いです。

        ぜひそうたいのですが、止める方法をお教え願います。

     

    TableAdapterを使われていますか? もし、そうであれば、それを右クリックしたメニューから「構成」をクリックし、「詳細オプション」ボタンを押して開かれるウインドウで、「オプティミスティック同時実行制御」のチェックを外して下さい。

    データベースはSQL Server 2005 Express辺りでしょうか? もしそうであれば同時実行制御を行う場合でも、timestamp値で制御する方が効率が良いので、どのみちこのチェックを外した方が良いです。

    2007年10月11日 6:09
    モデレータ

すべての返信

  • データベースへ更新に行く前に、どこかでAcceptChangesメソッドを実行していないでしょうか?

     

    #複数の人間が同時にデータを更新することがなければ、「同時実行違反」の制御自体を止めてしまった方が効率が良いです。

    2007年10月11日 1:15
    モデレータ
  • trapemiyaさん、ありがとうございます。

    >AcceptChangesメソッドを実行していないでしょうか?

        このメッソドは実行していません。しかし、何かが邪魔をしているのは間違いのないことです。

        Visual C#フォーラムでもお聞きしているColumnWidthChangedイベントの実行を止めると、同

        時実行違反にはなりません。

    >「同時実行違反」の制御自体を止めてしまった方が効率が良いです。

        ぜひそうたいのですが、止める方法をお教え願います。

    2007年10月11日 3:24
  •  zen73 さんからの引用

    >AcceptChangesメソッドを実行していないでしょうか?

        このメッソドは実行していません。しかし、何かが邪魔をしているのは間違いのないことです。

        Visual C#フォーラムでもお聞きしているColumnWidthChangedイベントの実行を止めると、同

        時実行違反にはなりません。

     

    ColumnWidthChangedイベントで処理するコードはどのようになっているのでしょうか?

     

     zen73 さんからの引用

    >「同時実行違反」の制御自体を止めてしまった方が効率が良いです。

        ぜひそうたいのですが、止める方法をお教え願います。

     

    TableAdapterを使われていますか? もし、そうであれば、それを右クリックしたメニューから「構成」をクリックし、「詳細オプション」ボタンを押して開かれるウインドウで、「オプティミスティック同時実行制御」のチェックを外して下さい。

    データベースはSQL Server 2005 Express辺りでしょうか? もしそうであれば同時実行制御を行う場合でも、timestamp値で制御する方が効率が良いので、どのみちこのチェックを外した方が良いです。

    2007年10月11日 6:09
    モデレータ
  • [quote username="trapemiya"]

    「オプティミスティック同時実行制御」のチェックを外して下さい。

    こういう方法があったとは!?。以前にもこの同時実行違反への対処について実に多くのご教示をいただきましたことを思い出しています。新しいものに挑戦することが年のせいか億劫になってしまって相変わらずAccessを用いています。

     

    私の絶体絶命のピンチから脱出させてくださいましたTrapemiyaさんに感謝申します。

     

    [quote username="trapemiya"]

    ColumnWidthChangedイベントで処理するコードはどのようになっているのでしょうか?

    コード ブロック

            //列幅変更のときの処理
            private void suitoDataGridView_ColumnWidthChanged(

          object sender,DataGridViewColumnEventArgs e)
            {
                //AdjustDataGridViewWidth(11);
                DataGridView dgv = (DataGridView)sender;
                //ヘッダーの幅(22)+スクロールバーの幅(24)
                //int dgvWidth = 46;

                int dgvWidth;
                if (vsBar.Visible == true)
                {
                    textBox1.Text = "has_vsBar";
                    dgvWidth = 46;
                }
                else
                {
                    textBox1.Text = "no_vsBar";
                    dgvWidth = 22;
                }
                for (int i = 1; i < 12; i++)
                {
                    dgvWidth += dgv.Columns[i].Width;
                }
                dgv.Width = dgvWidth;
            }

     

     

    2007年10月11日 7:40