掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
VB2010でAccess2003に接続後、データの更新 (ID:147591)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> 調べてみると、まず主キーの設定が必要とのことで ですます。先にも書いていますね。 >> 'SELECT 句には主キーを含めておくこと > ADOのときは主キーなしでプログラムを組んでいました。 たとえば、キーセットカーソル(adUseServer + adOpenKeyset)などでは そういったことも可能でしょう。 しかし ADO.NET の DataAdatper 経由での更新作業は、 >> adUseClient, adOpenStatic, adBatchOptimistic な Recordset に相当する動作です。(ADO に関する知識はあるものという前提で回答しています) 繰り返しになりますが、 >> 従来の DAO、ADODB、RDO 等とは異なり、ADO.NET では >> 「スクロールと更新が可能なサーバー側カーソル」はサポートされていません。 であるということを覚えておいてください。 もしもサーバーカーソルとして開かれているのであれば、主キー無しでも 「現在の行を更新する」ことは可能でしょうが、DataTable 自体は データベースとの接続を保持していないため、それはできません。 (DataTable とデータベースを繋ぐのは、OleDbCommand や OleDbDataAdapter の仕事です) そのため更新時には、どの行を変更すれば良いのかを特定するために、 主キー/ユニークキー/行バージョン(TimeStamp/RowVersrion/ROWID等)が必要になります。 ピンと来ないと思うので、もう少し細かい話をすると… DataTable の各行には、「編集前の値と編集後の値(DataRowVersion)」と、 「現在の行の状態(RowState)」が管理されています。RowState とは、 各行が 未編集の行/変更された行/新規追加行/削除された行の いずれであるかを表しています。 (ちなみに Recordset も、これと同様に変更前後の値を保持しています) DataAdapter は、それらの編集状況を察知し、各行のデータを一行分ずつ UpdateCommand / DeleteCommand / InsertCommand の パラメータクエリーに渡すという働きをします。 この時の UpdateCommand の内容は、たとえば以下のようになります。 (UserId が主キーです) UPDATE UserList Set UserId = [変更後のUserId] , UserName = [変更後のUserName] , EMail = [変更後のEMail] , Birthday = [変更後のBirthday] WHERE UserId = [取得時点のUserId] AND UserName = [取得時点のUserName] AND EMail = [取得時点のEMail] AND Birthday = [取得時点のBirthday] なお、同時更新を検出する必要が無く、主キー以外は 後書き優先で更新して良い場合には、下記のような 単純化した SQL を割り当てることもできます。 UPDATE UserList Set UserName = [変更後のUserName] , EMail = [変更後のEMail] , Birthday = [変更後のBirthday] WHERE UserId = [取得時点のUserId] この行単位の更新の時に、主キー(あるいはそれに相当する情報)が 必要になるというわけです。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.