none
テーブルにレコードを追加するときの疑問 RRS feed

  • 質問

  • お早うございます。zen73です。テーブルにレコードを4行追加したいのですが,ひとつ少ない3行しか追加できないでいます。

    下のコードは,既存のレコードをすべて削除した後に新しくレコードを追加しています。

    10

    20

    30

    40

    となることを期待しているのですが,

    10

    20

    30

    としかなりません。data[]にダミーのデータを1個追加してやれば,10,20,30,40とすべてを追加できることになりますが,これでは単に’間に合せ’にしか過ぎません。

     

    何が原因で,最後のレコード「40」が追加できなくなっているのでしょうか?

    重ねての質問になりますが(このあとにも確定の前にいろいろと試したいことがあるものですから)

    編集の確定drv.EndEdit();はアとイのどちらにするのがよいのでしょうか?

     

    よろしくお願いします。

    コード ブロック

            private void button1_Click(object sender, EventArgs e)
            {
                int[] data = new int[] { 10, 20, 30, 40};
                DataView dv = new DataView();
                dv.Table = trialDataSet.code;
                int cnt = dv.Count;
                //すべてのレコードを削除
                for (int i = 0; i < cnt; i++)
                    dv.Delete(0);

                //レコードを追加
                DataRowView drv;
                for (int i = 0; i < data.Length; i++)
                {
                    drv = dv.AddNew();
                    drv["大科目"] = "";
                    drv["コード"] = data[i];
                    drv["小科目"] = "";
                    drv["今年度予算"] = 0;
                    drv["前年度予算"] = 0;

            ////drv.EndEdit();
                }

                ////drv.EndEdit();

            }

     

     

    2007年11月14日 22:11

回答

  • こんにちわ、

    少し補足させてもらいますね。

     

    今回、イの位置でdrv.EndEdit()としたときにエラーがでたのは

    「未割り当てのローカル変数'drv'が使用されました。」

    というメッセージだと思います。

     

    ためしに、宣言時にnullで初期化を行ってみてください。

    コンパイルエラーが消えると思います。

     

    で、今回のご質問の件ですが、ぶっちゃけていうと、どちらでも動作上は問題ないです。

    最終的な確定さえしっかり行えばいいので・・・

     

    ただ、個人的には、DataRowViewのインスタンスの値を変更している前後を

    BeginEdit()とEndEdit() でくくるのが望ましいと思っています。

    (ここでは新規登録にあたるので、BeginEditをAddNew()に置き換えて考えてみてください。)

     

    ここでは、AddNewメソッドで暗黙的に、EndEdit()が呼ばれますが、後から見た人には、

    「Endがなんでないの??」

    ということになりかねません。

    (AddNewメソッドの仕様を確認しろといわれればそれまでですが・・・)

     

    また、イのタイミングですと、dataの値如何によっては、drvのインスタンスが作成されないなど、

    もうすこし厳密なコーディングを行う必要がでてきてしまいます。

    (今後、どのような形でこのサンプルコードを実際のアプリケーションに取り込んでいくのかによりますが・・)

     

    なので・・

    AddNew とEndEditで囲むアをお勧めします。

    2007年11月15日 1:55

すべての返信

  •  Zen73さんおはようございます。

     連続してAddNewすると自動的に直前の編集をEndEditしてくれるので3件だけEndEditされます。

     この場合アの位置にEndEditを追加すると4件追加されます。イの位置だとコンパイルエラーになりました。

    2007年11月14日 23:16
  • こんにちわ、

    少し補足させてもらいますね。

     

    今回、イの位置でdrv.EndEdit()としたときにエラーがでたのは

    「未割り当てのローカル変数'drv'が使用されました。」

    というメッセージだと思います。

     

    ためしに、宣言時にnullで初期化を行ってみてください。

    コンパイルエラーが消えると思います。

     

    で、今回のご質問の件ですが、ぶっちゃけていうと、どちらでも動作上は問題ないです。

    最終的な確定さえしっかり行えばいいので・・・

     

    ただ、個人的には、DataRowViewのインスタンスの値を変更している前後を

    BeginEdit()とEndEdit() でくくるのが望ましいと思っています。

    (ここでは新規登録にあたるので、BeginEditをAddNew()に置き換えて考えてみてください。)

     

    ここでは、AddNewメソッドで暗黙的に、EndEdit()が呼ばれますが、後から見た人には、

    「Endがなんでないの??」

    ということになりかねません。

    (AddNewメソッドの仕様を確認しろといわれればそれまでですが・・・)

     

    また、イのタイミングですと、dataの値如何によっては、drvのインスタンスが作成されないなど、

    もうすこし厳密なコーディングを行う必要がでてきてしまいます。

    (今後、どのような形でこのサンプルコードを実際のアプリケーションに取り込んでいくのかによりますが・・)

     

    なので・・

    AddNew とEndEditで囲むアをお勧めします。

    2007年11月15日 1:55
  • すべてのレコードを削除するのであれば、dv.Table.Clear() でいいんじゃないでしょうか?

    またDataViewもしくはDataTableに対する変更を確定する必要があれば、AcceptChangesメソッドを呼びます。

     

    2007年11月15日 2:43
    モデレータ
  •  Toshiさんこんにちは

     nullで初期化すればエラー消えるのですが、ループが1回も回らない場合実行時エラーになるので、コンパイルエラーを消すために初期化するのもおかしいと思いましたのでそれ以上言及しませんでした。つまりToshiさんがおっしゃるdrvのインスタンスが作成されない場合になりますね。

     

    2007年11月15日 3:01
  • 三輪の牛さん、こんにちは。

     

     三輪の牛 さんからの引用

     nullで初期化すればエラー消えるのですが、ループが1回も回らない場合実行時エラーになるので、コンパイルエラーを消すために初期化するのもおかしいと思いましたのでそれ以上言及しませんでした。

     

     

    確かにおっしゃるとおりですね。コンパイルエラーを消すためだけに初期化するのも変ですよね。

    たまに、ルールで指定されることがありますが・・・

    それにしても、どこまで書くべきか、難しい・・・

     

    trapemiyaさん、こんにちは。

    AcceptChangesメソッド、盲点でした・・・

    勉強になります。

    2007年11月15日 3:31
  • zen73です。三輪の牛さん,Toshiさん,trapemiyaさん,ありがとうございました。

    2007年11月19日 3:33