none
Visual Basic 2005 DataAdapter経由でSQLサーバーにデータを書き込めない RRS feed

  • 質問

  • VB6ADOからの移行を試みています、ADOでできたAddNewメソッドとUpdateメソッドを使ってデータの挿入を試みているのですがデータセットのテーブルの中に追加されているのは確認できるのですが、実際のデータベースには反映されません。列数がINSERT文を書くと見にくくなるのでこの方法を使いたいと思います。

    Using CT As New SqlConnection(cnnStr)
    CT.Open()
    Dim Da As New SqlDataAdapter("SELECT TOP 1 * FROM TB1", CT)
    Dim DS As DataSet = New DataSet
    Da.Fill(DS, "TB1")
    Dim RW As DataRow = DS.Tables("TB1").NewRow
    RW("JGCODE") = "0091"
    RW("SECODE") = "099999"
    RW("GZCODE") = "000999999"
    RW("SHIYOU") = 1.99
    RW("UPDDATE") = Now()
    DS.Tables("TB1").Rows.Add(RW)
    DS.AcceptChanges()
    Da.Update(DS, "TB1")

    End Using

    2009年3月30日 6:36

回答

  • AcceptChangesメソッドを呼び出したタイミングで,DataSet中の変更がすでにデータベースに反映されたことになっています。
    AcceptChangesメソッドを呼び出さずに,Updateメソッドを呼び出してください。

    なお,AcceptChangesメソッドは,Updateメソッドの中で自動的に呼ばれます (DataSetではなくDataRowのではあるが)。

    • 回答としてマーク sk7474 2009年4月9日 9:25
    2009年3月30日 7:30
  • DS.AcceptChanges()

    この行が不要ですのでコメントアウトしてみてください。

    また、SqlDataAdapterにINSERT文、DELETE文、UPDATE文のSQL文を設定していないようです。CommandBuilderなどを使って設定してください。
    以下、参考まで
    http://hatsune.wankuma.com/seminer/tokyo20/25.PNG

    更に、上記参考にあるように全体をトランザクションで囲んでください。ADO.NETのUpdateメソッドは内部的にINSERT文、DELETE文、UPDATE文を実行します。その判断にはDataRowの状態により自動的に判断しまので、INSERT文、DELETE文、UPDATE文が組み合わされて実行される可能性があるのでトランザクション処理が必要です。

    http://blogs.wankuma.com/hatsune/
    • 回答としてマーク sk7474 2009年4月9日 9:25
    2009年3月30日 8:27
  • テーブルに主キーが設定されていないと更新されなかったかと思いますが、...
    Try Catch でエラー個所や原因が推定できるのではありませんか。
    • 回答としてマーク sk7474 2009年4月9日 9:25
    2009年3月31日 2:09

すべての返信

  • AcceptChangesメソッドを呼び出したタイミングで,DataSet中の変更がすでにデータベースに反映されたことになっています。
    AcceptChangesメソッドを呼び出さずに,Updateメソッドを呼び出してください。

    なお,AcceptChangesメソッドは,Updateメソッドの中で自動的に呼ばれます (DataSetではなくDataRowのではあるが)。

    • 回答としてマーク sk7474 2009年4月9日 9:25
    2009年3月30日 7:30
  • DS.AcceptChanges()

    この行が不要ですのでコメントアウトしてみてください。

    また、SqlDataAdapterにINSERT文、DELETE文、UPDATE文のSQL文を設定していないようです。CommandBuilderなどを使って設定してください。
    以下、参考まで
    http://hatsune.wankuma.com/seminer/tokyo20/25.PNG

    更に、上記参考にあるように全体をトランザクションで囲んでください。ADO.NETのUpdateメソッドは内部的にINSERT文、DELETE文、UPDATE文を実行します。その判断にはDataRowの状態により自動的に判断しまので、INSERT文、DELETE文、UPDATE文が組み合わされて実行される可能性があるのでトランザクション処理が必要です。

    http://blogs.wankuma.com/hatsune/
    • 回答としてマーク sk7474 2009年4月9日 9:25
    2009年3月30日 8:27
  • テーブルに主キーが設定されていないと更新されなかったかと思いますが、...
    Try Catch でエラー個所や原因が推定できるのではありませんか。
    • 回答としてマーク sk7474 2009年4月9日 9:25
    2009年3月31日 2:09
  • こんにちは。中川俊輔です。

    皆様、回答ありがとうございます。

    yondelicaさん、フォーラムのご利用ありがとうございます。
    その後いかがでしょうか?問題は解決しましたか?

    勝手ながら、有用な情報と思われる回答へ回答マークをつけさせていただきました。

    今後ともフォーラムをよろしくお願いします。
    それでは!
    マイクロソフト株式会社 フォーラム オペレータ 中川 俊輔
    2009年4月9日 9:29