none
DBグリッドとアクセスとの同期 RRS feed

  • 質問

  •  

    申し訳ございませんが質問させていただきます。

     

    アクセスに格納されているデータをDBグリッドへ表示するプログラムを作成しています。

     

    HasChangesでグリッド内に変更があったならば

     

    OleDbDataAdapter1.Update(Ds800f_011)

     

    でアクセスとの同期を取っています。

     

    OleDbDataAdapter1でupdatecommandのcommand.textにupdateするSQLを記述しています。

     

    command.text=UPDATE WK0800f_01 SET S_YMD = ?, KZI1 = ?, KBN1 = ?, J_YMD = ? WHERE (S_YMD = ?)

     

    この状態でプログラムを動かしDBグリッドとアクセスと同期を取るときに「1つ以上の必要なパラメータの値が設定されていません。」とプログラムが落ちます。

     

    command.text=UPDATE WK0800f_01 SET S_YMD = ?, KZI1 = ?, KBN1 = ?, J_YMD = ?

    のように where 以降の構文を省くとエラーはでません。が、もちろんすべてのデータがupdateされてしまします。

     

    where以降の記述をどのようにすれば、変更があった項目のみupdateができるようになるでしょうか?

     

    申し訳ございませんが、ご教授お願いいたします。

     

     

    2008年2月21日 5:22

回答

すべての返信

  • 正確には、リテラルですよね。

     

    command.text="UPDATE WK0800f_01 SET S_YMD = ?, KZI1 = ?, KBN1 = ?, J_YMD = ? WHERE (S_YMD = ?)"

     

    これだけみると間違いはありません。パラメータをどのように設定されているのかをご提示願えますか? また、パラメータにきちんと値が入っているのか確認されていますでしょうか?

    2008年2月21日 6:13
    モデレータ
  • 返信ありがとうございます。

     

    当方、熟知していないことが多く大変申し訳ないですが

     

    OleDbDataAdapter1.Update のupdateは

     

    指定した System.Data.DataSet 内の挿入行、更新行、または削除行に対して、INSERT、UPDATE、または DELETE ステートメントを個別に呼び出します。

     

    と書いてあるので

    command.text="UPDATE WK0800f_01 SET S_YMD = ?, KZI1 = ?, KBN1 = ?, J_YMD = ? WHERE (S_YMD = ?)"

    ?の部分に変更された行のデータが入力され更新されると思っています。

     

    なのでWHERE (S_YMD = ?)のS_YMD にデータが入力されると思っていました。set 以降の?には値が入っているがwhere以降の?には値がセットされていない。

     

     

    自分の認識は間違っているのでしょうか?

    2008年2月21日 6:52
  •  ペニー さんからの引用

    OleDbDataAdapter1でupdatecommandのcommand.textにupdateするSQLを記述しています。

     

    command.text=UPDATE WK0800f_01 SET S_YMD = ?, KZI1 = ?, KBN1 = ?, J_YMD = ? WHERE (S_YMD = ?)

     

    この状態でプログラムを動かしDBグリッドとアクセスと同期を取るときに「1つ以上の必要なパラメータの値が設定されていません。」とプログラムが落ちます。

     

    DataAdapterのUpdateCommandにUPDATE-SQL文を直接記述しているのですね。

    では、UpdateCommandのIleDbParametersへの指定はどうなっていますでしょうか。その指定個数とUPDATE-SQL文の?の数と順番は一致していますでしょうか。

     

    さて、もしParametersへはちゃんと設定しているし数もあっている。実際にステップ実行して値も確認していますよという事であれば、使用しているDataSetにはS_YMDのPrimaryKeyとして定義していますでしょうか。

    ちょっと記憶が定かではないのですが、定義していない場合は、すべての列をWHERE句に指定して行を特定するような前提になっていたと思います(ほとんど自信なし)。

     

    最後に、ウィザードで生成されるコードをみてみるのも一つの手だと思います。

    2008年2月21日 7:25
  •  

    返信ありがとうございます。

     

    ど素人的な質問で申し訳ありませんが、「実際にステップ実行して値も確認」とありますが

    どのように値を確認すれば、いいのでしょうか?

     

     

    すいませんがご教授お願いいたします。

     

    2008年2月21日 8:52
  •  ペニー さんからの引用

    ど素人的な質問で申し訳ありませんが、「実際にステップ実行して値も確認」とありますが

    どのように値を確認すれば、いいのでしょうか?

     

    このあたりが参考になると思います。

    http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard41.htm

    2008年2月21日 12:01