- PR -

削除と更新を行ったデータセットの更新

1
投稿者投稿内容
Chikota
常連さん
会議室デビュー日: 2005/09/08
投稿数: 23
投稿日時: 2005-09-08 17:42
VB.NET2003 WindowsアプリケーションにてMDBに接続し、データセットを取得してこれを更新する際にうまくいきません。

DataAdaptorを使用し、1つのテーブルのデータをすべてデータセットのテーブルに取得します。
SQLコマンドはデザインビューでDataAdaptor作成のときに自動で作られるものをそのまま使用しています。

  ID(主キー)
1 AAA
2 BBB
3 CCC

このようなテーブルであったときに、まず3行目を削除し、1行目のIDを"CCC"に変更してこのデータセットを更新しようとすると、「インデックス、主キー、またはリレーションシップで値が重複しているので、テーブルを変更できませんでした。重複する値のあるフィールドの値を変更するか、インデックスを削除してください。または重複する値を使用できるように再定義してください。」となり更新ができません。

例えば、1行目を削除し、3行目のIDを「AAA」に変更してデータセットを更新すると、これは成功します。

更新直前の各行のRowStatusを調べると、
1 Modified
2 Unchanged
3 Deleted

では失敗し、

1 Deleted
2 Unchanged
3 Modified
では成功します。

DataAdapterが1行目の更新をする際に、まだ3行目が削除されておらず、主キーフィールドの値がだぶってしまうために失敗するのではと予想したのですが、どのように対処したらよいのかがわかりません。

このようなデータセットを更新するにはどうしたらよいのでしょうか。

よろしくお願いいたします。
がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2005-09-08 18:15
どもです。がると申します。
質問に対する回答ではなくて恐縮ですが。
引用:

Shirathaiさんの書き込み (2005-09-08 17:42) より:
  ID(主キー)
1 AAA
2 BBB
3 CCC
このようなテーブルであったときに、まず3行目を削除し、1行目のIDを"CCC"に変更してこのデータセットを更新しようとすると


えっと取り合えず「主キーを変更するのはやめましょう」。
理由は…取り合えず調べてみてください、ハイ。
水谷
会議室デビュー日: 2004/05/07
投稿数: 17
お住まい・勤務地: 福島県
投稿日時: 2005-09-08 18:35
水谷です。

引用:
Shirathaiさんの書き込み (2005-09-08 17:42) より:

DataAdapterが1行目の更新をする際に、まだ3行目が削除されておらず、主キーフィールドの値がだぶってしまうために失敗するのではと予想したのですが、どのように対処したらよいのかがわかりません。


Shirathaiさんの予想通り、1行ずつ順序に処理されるため PrimaryKey 違反が発生してしまいます。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconupdatingdatabasewithdataadapterdataset.asp
ここの一番下に「挿入、更新、削除の順序」という項目がありますので、参考にしてみてはいかがでしょうか。
Chikota
常連さん
会議室デビュー日: 2005/09/08
投稿数: 23
投稿日時: 2005-09-08 19:45
がるがる様、水谷様、ありがとうございました。

がるがるさんのご指摘の通り、主キーフィールドの変更はするべきでないのはわかるのですが、どうしても避けられませんでした。(ご助言いただいた後に、変更の機能はなくすことを提案してもみたのですが)
頻繁に今回のような操作が行われるわけではなく、特殊な場合なのですが、変更はできるようにする、と決まりました。

水谷さんの教えてくださったURLがまさに求めていたもので、削除行→更新行の順番でUpdateメソッドを実行することで更新することができました。
ありがとうございました。

どんぴしゃの情報があるのに探せなかったのが情けないです。
MSDNから掘り出す技術も付けなくては...
1

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