- - PR -
DataRowのAcceptChangeについて
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2003-04-10 13:30
いつも拝見して勉強させていただいております。
現在VisualBasic.NET+SQLServer2000にて開発していますが、 OleDbDataAdapter.Update(DataRow)にてDataRowにAcceptChangeが適用され rowStateがunchangedになり困っています。 やりたいことは、 ・DataTable1に新規行を追加し、Updateメソッドにて追加する ・DataTable2にDataTable1の新規行に関連する新規行をUpdateメソッドにて追加する なのです。 しかし、DataTable1のUpdateメソッドが正常終了し、 DataTable2のUpdateメソッドが失敗したときにおかしなことになっています。 このときRollBackしてデータベース上は問題ないのですが、 DataTable1のUpdateメソッドは正常に終了しているため、 DataTable1の新規行のrowStateがunchangedになっています。 DataSetにもトランザクションをきかせる方法、もしくは UpdateメソッドにてrowにAcceptChangeが適用されなくする 方法はないのでしょうか? 皆様のお知恵を拝借できれば幸いです。 よろしくお願いいたします。 |
|
投稿日時: 2003-04-10 15:35
こんにちは。
試していないので、やってみてください。 DataSetにGetChangesというメソッドがあります。これで、変更があるものを取り出して2つ目のDataSetを作ることができるそうです。この2つ目のDataSetに対してUpdateをかけると、どうなりますか?1つ目の(オリジナルの)DataSetのRowStateも、変更されるでしょうか? |
|
投稿日時: 2003-04-10 23:21
早速のご回答ありがとうございます。
GetChangesですが、現在、GetChangesにて変更データを取得した後 Update処理を行うように作成しています。 Update処理にてRowErrorにエラー情報をセットした後、 Margeを行っています。 エラー内容を確認し、エラーが発生しないようにデータ修正した後、 もう一度同じ処理をしようとするとrowStateがAddでないため データがないにもかかわらずUpdate文が走ってしまうわけです... エラー内容だけコピーすれば問題ないのですが、DataSet上ではキーなしデータも ありうるのでエラー内容のコピーはできません... ヘルプと格闘しているのですが、UpdateメソッドではAcceptChangeが Callされる旨が書かれています... やはり考え方を変えないとダメですかね... ちなみにオリジナルのDataSetのRowStateは変わりません。 |
|
投稿日時: 2003-04-11 08:42
えっと、まず、処理の順番を考えてみましょう。
DbDataAdapter.Updateには、DataTableだけでなく、DataSetを渡すことができます。これは、DataSet中の全てのDataTableに対して有効です。 最初のポストより、DataSet内に2つのテーブルがあり、1つに対してUpdateメソッドを実行した後、2つ目のDataTableに行を追加してUpdateメソッドを実行している、と理解しています。 また、2つ目のDataTableでエラーが発生した際に、1つ目のテーブルのデータも元に戻したい、と理解しています。 そこで提案ですが、実行手順を次のように変更してみてはいかがでしょうか。 1.1つ目のDataTableの内容により、2つ目のDataTableの内容を更新する 2.2つのDataTableが入ったDataSetに対してDbDataAdapter.Updateメソッドを実行する DataSetにはデータベースのコピーが保存できます。RDBMSと同じような制約を付けることもできます。RDBMSに反映してデータの有効性を検証するのではなく、DataSetでデータの有効性を検証できるような作り方ができないか、検討されることをお薦めします。 |
1