- PR -

DataRowのAcceptChangeについて

1
投稿者投稿内容
のっぴー
会議室デビュー日: 2003/04/10
投稿数: 5
投稿日時: 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が適用されなくする
方法はないのでしょうか?

皆様のお知恵を拝借できれば幸いです。
よろしくお願いいたします。

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-04-10 15:35
こんにちは。

 試していないので、やってみてください。

 DataSetにGetChangesというメソッドがあります。これで、変更があるものを取り出して2つ目のDataSetを作ることができるそうです。この2つ目のDataSetに対してUpdateをかけると、どうなりますか?1つ目の(オリジナルの)DataSetのRowStateも、変更されるでしょうか?
のっぴー
会議室デビュー日: 2003/04/10
投稿数: 5
投稿日時: 2003-04-10 23:21
早速のご回答ありがとうございます。

GetChangesですが、現在、GetChangesにて変更データを取得した後
Update処理を行うように作成しています。
Update処理にてRowErrorにエラー情報をセットした後、
Margeを行っています。
エラー内容を確認し、エラーが発生しないようにデータ修正した後、
もう一度同じ処理をしようとするとrowStateがAddでないため
データがないにもかかわらずUpdate文が走ってしまうわけです...

エラー内容だけコピーすれば問題ないのですが、DataSet上ではキーなしデータも
ありうるのでエラー内容のコピーはできません...

ヘルプと格闘しているのですが、UpdateメソッドではAcceptChangeが
Callされる旨が書かれています...

やはり考え方を変えないとダメですかね...

ちなみにオリジナルのDataSetのRowStateは変わりません。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)