• ベストアンサー

ACCESSで一括処理する方法

Access2000以降のデータベースに、 データを一括処理したいのですが、 OLEDBではバインド配列のような物が使えないようです。 ストアドはAccessでは無理だと思うので、 それ以外で一括処理できる方法を考えています。 (なるべくFor文でぐるぐる回すのは避けたいです) ひとつ思い浮かんだのは データを分割して、 それをスレッドに振り分けて並列処理するという方法ですが 他に高速に一括処理できる方法はあるのでしょうか? 言語はC#.NETです。 

質問者が選んだベストアンサー

  • ベストアンサー
noname#182251
noname#182251
回答No.4

>スレッドに振り分けて 高速な処理は期待できないと考えます。例えばWebアプリケーションのように、通信で時間を取られているならば、結果を待たずに次の処理を開始すれば、トータルの時間を短くできます。しかしテーブルへの取り込みでは、その処理だけでCPU時間を占有しているので、並列処理しても、それぞれの時間が延びるだけでしょう。 で、一案として、とにかくアクセスのインポート(マクロのテキスト変換。VBA であれば DoCmd.TransferText acImportDelim ??)まずAccessのテーブルに取り込んでから処理してはいかがでしょう? だいぶ以前のことで記憶が曖昧ですが、ADOで接続し、CSVのデータを一件ずつAppendして行くより、インポートの方が桁違いに速かった経験があります。

fantom
質問者

お礼

回答ありがとうございました。 一度スレッドの分割で試してみましたが、 ご指摘の通りやはり遅くなる結果が出ました。 アクセスのインポート処理の中身は INSERT文の連続処理と同じと思っていたので、 そんなに速くなるとは思っていませんでした。 参考にさせて頂きます。

その他の回答 (3)

noname#79209
noname#79209
回答No.3

一回限りの処理なら、直接Accessからクエリで処理しちゃいますけど... 多分違うんでしょうね...

fantom
質問者

お礼

回答ありがとうございました。 クエリーで出来ればよかったんですが、 何度もクエリーのパラメータを変えないといけないので 難しいところです。

回答No.2

Datasetは取得できているのですね? http://support.microsoft.com/default.aspx?scid=kb;ja;317114 であれば、コマンドビルダが利用できませんか? http://support.microsoft.com/kb/307587/JA/ 例はSQL-SERVERなのでSqlCommandBuilderを利用していますが、同様にOleDbCommandBuilderも存在します。

fantom
質問者

お礼

何度もありがとうございます。 CSVファイルからデータを読み込んで、 これからテーブルに追加させるところなので Datasetはまだ取得できていない状態です。 Datsetにデータが格納さえできれば この方法で一括処理可能ですね。

回答No.1

>データを一括処理 主にどのようなパターンですか? 例があるとわかりやすいです。 単にUPDATE文の発行でできないような、複雑な処理ということですか? 複雑であればストアドであっても、カーソルセットして、グルグル回すことになると思うのですが。。。

fantom
質問者

補足

すみません。ちょっと分かりにくかったですね。 処理自体は単純なINSERT文の連続です。 INSERT INTO TEST VALUES(1,2,3,4,5,6,7)がたくさんある状態です。 バインド配列ならレコード数が多くても SQLの発行命令(DBサーバとの通信)は1回で済むんですが 普通にやるとなるとINSERT文をレコード数分を発行する必要になり 遅くなってしまうのを防ぎたいという事です。

関連するQ&A