掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
VB2010でAccess2003に接続後、データの更新 (ID:147586)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> 初心者でADO と ADO.NETの違いに戸惑っています。よろしくお願いします。 従来の DAO、ADODB、RDO 等とは異なり、ADO.NET では 「スクロールと更新が可能なサーバー側カーソル」はサポートされていません。 .NET データプロバイダによっては、個別に実装されている場合もありますが、 少なくとも System.Data.OleDb 名前空間のものはそうではありません。 > フィールドの値(整数型)を1行ずつ読み込む所まではできたのですが、 > 読み込んだ値に数値を加えて更新したいと考えています。 数値を加えるだけならば、ループ処理せずとも UPDATE の SQL で 一括更新できそうですが、実際にはもう少し複雑な処理なのでしょうか。 > 下記の構文で、Accessへ接続はできましたが、While 〜 End Whileの間で、 OleDbDataReader として開いたカーソルは読み込み専用であり、 ADO の時のように行単位で更新処理していくようなことはできません。 一行ずつ更新結果を反映させていくのではなく、 下記のような流れで処理することを検討してみてください。 (1) DataAdapter の Fill メソッドを呼び出して、SELECT 結果の全件を DataSet に格納する。 (2) DataSet/DataTable の内容を編集する(行の追加、編集、削除)。 (3) それを DataAdapter の Update メソッドに渡して、データベースに反映させる。 大雑把な処理イメージを書いてみます。 'SELECT 句には主キーを含めておくこと Dim da As New OleDbDataAdapter(strConn, SQL) '下記により、INSERT/DELETE/UPDATE に必要な SQL が DataAdapter に埋め込まれる Dim cb As New OleDbCommandBuilder(da) ' da.SelectCommand … SELECT クエリー ' da.InsertCommand … INSERT クエリー ' da.DeleteCommand … DELETE クエリー ' da.UpdateCommand … UPDATE クエリー 'データを取得 Dim table As New DataTable() da.Fill(table) 'ループ処理等を用いて、行更新・行追加・行削除等を実施 table.Rows(行番号)(列名) = 新しい値 '編集結果を反映 da.Update(table) ------------ ちなみに、ADO.NET での更新処理手順を VB6 の ADODB で置き換えると このような感じになります。 (1) adUseClient, adOpenStatic, adBatchOptimistic な Recordset で開きます。 これにより、SELECT 結果全件が Recordset 内にキャッシュされます。 (ADO.NET では、DataAdapter.Fill などがこれに相当します) (2) Recordset の ActiveConnection に Nothing を Set します。 これにより、Recordset がオフラインモードとなります。 (ADO.NET の DataTable というのは、この状態の Recordset に近い存在です) (3) データベースに接続されていない状態のまま、Recordset の内容を編集する (ADO.NET では、DataSet / DataTable の内容を編集することに相当) (4) Recordset の ActiveConnection を再度繋ぎなおし、UpdateBatch を呼び出して反映させる (ADO.NET では、DataAdapter の Update メソッド呼び出しに相当します) http://msdn.microsoft.com/ja-jp/library/dd297827.aspx http://msdn.microsoft.com/ja-jp/library/aa302325.aspx http://code.msdn.microsoft.com/DataAccess-howto-59dfd086
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.