- PR -

Adapter.Updateで更新に失敗したDataRowを取得したい

1
投稿者投稿内容
未記入
大ベテラン
会議室デビュー日: 2006/05/19
投稿数: 125
投稿日時: 2007-12-20 12:55
VS2005

DataTableのデータをAdapter.UpdateにてDBに更新しようとしています。

DataTableのRowState=Modifiedのデータを更新する際に、
そのデータが他ユーザに削除されていた場合、
Adapter.Update後、更新に失敗したデータを取得したいのですが
DataTable.GetErrorsは0件になり
RowStateはUnChangedになって取得できません。

どうすれば更新に失敗したデータを取得できますか?


かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2007-12-26 11:07
どのDataAdapter(というかDBは何?)を使用しているか分からないですが、
使用しているDataAdapterがDbDataAdapterクラスの派生クラスの場合、

int Update(DataRow[] rows)

なるメソッドがあります。
詳細はMSDN(msdn2.microsoft.com)読んでね。

RowState=Modifiedの行だけ抜き出し、ループを回して一行ずつ更新を試み、戻り値で更新したかどうかを判断してみてはいかがでしょう?

コード:
DataTable table = _dataset.Tables["table"].GetChanges(DataRowState.Modified);
if (table != null)) {
    foreach (DataRow row in table.Rows) {
        int count = _adapter.Update(new DataRow[] {row});
        if (count == 0) {
            // 更新しろやゴルァ
        }
    }
}


C#スマソ
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 2007-12-26 13:07
更新対象レコードが存在していなくても、
update 文はデータベースエラーを発生させません。
そのため、アダプターも「エラーあり」とは判断しません。

アダプターに RowUpdated というイベントがあります。
これは各行に対してSQL文が実行されるたびに発生するイベントで、
RecordsAffected プロパティで実際に更新されたレコード数が取得できます。
1 レコードずつ更新していく処理であれば、
このプロパティの値が 1 になっているはずです。
削除されていたりなどの理由で更新対象がなかった場合にはゼロになります。

この方法でどのレコードが更新されなかったかを調べることはできますが、
後でまとめて何かを行いたいなら一度コレクションなどに格納する必要がありますね。


[ メッセージ編集済み 編集者: masa 編集日時 2007-12-26 13:08 ]
1

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