- PR -

VB.NETでのOracleへのINSERT

投稿者投稿内容
たつ
常連さん
会議室デビュー日: 2005/11/21
投稿数: 39
投稿日時: 2005-12-01 20:21
いつもお世話になっております。
今、ファイルからデータを一行づつ取得して文字数で分割しDBに登録するというプログラムを作成しております。

一行づつINSERT文を実行するという方法はすぐ思いついたのですがパフォーマンスが悪いということぐらいは分かります。

そこで質問なのですが、
トランザクションでくくればコミットのタイミングでのみDBアクセスし、パフォーマンスがよくなるのでしょうか?
また、空のDataSetにデータを入れ、一括して送ることはできるのでしょうか?
みなさんはこのような時はどのように処理されていますか?
ご教授よろしくおねがいします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-12-01 20:35
 Oracle なら、SQL Loader という選択肢も…
たつ
常連さん
会議室デビュー日: 2005/11/21
投稿数: 39
投稿日時: 2005-12-01 20:55
迅速な対応ありがとうございます。

SQL Loader はデータがカンマなどで区切られていない場合でも使用できるのですか?
たつ
常連さん
会議室デビュー日: 2005/11/21
投稿数: 39
投稿日時: 2005-12-01 21:15
すみません。
SQL Loader についてほとんど調べもせずに投稿してしまいました。

SQL Loader を使うと管理するファイルが増えてしまうのでできれば使いたくないです。
ほかによい方法はありませんか?
桜緋女
常連さん
会議室デビュー日: 2004/09/15
投稿数: 46
投稿日時: 2005-12-01 21:34
バインド変数は使用していらっしゃいますか?
バインド変数を利用すると、SQL文のコンパイルが都度行われなくて済むため、
多少なりともパフォーマンスが良くなるのだったと記憶しておりますが。

(ちなみに今やっているプロジェクトでは、バインド変数は使っているくせに
おかしな共通ルールで一行ずつバインドしなおしされています・・・(泣))
たつ
常連さん
会議室デビュー日: 2005/11/21
投稿数: 39
投稿日時: 2005-12-01 21:56
複数行の場合バインド配列になるんでしょうか?

取り敢えずINSERTしまくってからCOMMITしようってことに落ち着いてしまいそうですが、先にバインド変数調べて試してみます。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-12-01 22:02
INSERT INTO table (column1, column2, ...) VALUES (?, ?, ...)

という SQL 文を用意して、

OracleCommand.CommandText にセット
OracleCommand.Parameters に、それぞれの値をセット

これを CSV ファイルの行の数だけぶん回せばいいです。
___________________________________________________________________
□ written by Jitta on 2005/12/01
□ Microsoft MVP :Visual Developer ASP/ASP.NET Oct.2005-Sept.2006
_________________
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2005-12-02 09:13
DBMS が oracle なら 配列バインド という手も
これならラウンドとリップは一回ですね

何行追加してから COMMIT とかの細かい制御は苦手ですが
パフォーマンスに関しては何度も プロシージャ 呼び出すよりも
効率がいいです。

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