- PR -

VB.NETでのOracleへのINSERT

投稿者投稿内容
明智重蔵
大ベテラン
会議室デビュー日: 2005/09/05
投稿数: 127
投稿日時: 2005-12-02 09:52
http://oraclesqlpuzzle.hp.infoseek.co.jp/2-1-1.html
まとめてinsertすれば、通信回数は減りますが、

pl/sqlでファイルから1行ずつ呼んでバルクバインドで一括insertする方法もありますね
たつ
常連さん
会議室デビュー日: 2005/11/21
投稿数: 39
投稿日時: 2005-12-02 14:02
strSql ="INSERT INTO table (column1, column2, ...)" & _
"VALUES (" & val1 & "," & val2 & ","... & ")"

command.CommandText = strSql
command.ExecuteNonQuery()

↑回して
コミット

っていう作りでひとまず落ち着いています。
一応Jittaさんの提示してくださったやり方と速度は同じと考えて大丈夫ですか?
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2005-12-02 14:43
これってバインド変数使われないから毎回解析が行われちゃいますよ
バインド変数を使いましょう

strSql ="INSERT INTO table (column1, column2, ...)" & _
"VALUES (:val1, :val2, ... & ")"
たつ
常連さん
会議室デビュー日: 2005/11/21
投稿数: 39
投稿日時: 2005-12-02 19:06
バインド変数を使ったコーディングでちゃんと動作しました。
下がそのコーディングです。
もっと勉強していつか教えられる立場になれたらと思います。
ありがとうございました。

Dim sr As StreamReader = New StreamReader(filename, Encoding.GetEncoding("SHIFT-JIS"))

strSql ="INSERT INTO table (column1, column2, ...)" & _
"VALUES (:val1, :val2, ... )"

command = New OracleCommand(strSql, connection)

Dim OracleParameter1 As OracleParameter = New OracleParameter(":val1", OracleDbType.Varchar2)
Dim OracleParameter2 As OracleParameter = New OracleParameter(":val2", OracleDbType.Int64)
.
.
.
While (streamReader.Peek() <> -1)
strBuffer = streamReader.ReadLine()

strVal1 = strBuffer.Substring(0, 12)
command.Parameters.Add(":val1", strVal1 )

strVal2 = strBuffer.Substring(12, 12)
commandIns.Parameters.Add(":val2", strVal2 )

.
.
.

End While

command.ExecuteNonQuery()

streamReader.Close()

かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2005-12-02 19:36
上記方法だと.NET と Oracle の間にファイルのレコード分
ラウンドトリップが起きてしまいます。


前にも書きましたが ODP.NET には配列バインドがあります。
問題はすでに解決しているようですが、
上記の方法でパフォーマンスが出ないと思ったら試してください。
http://www.atmarkit.co.jp/fdb/rensai/odpdotnet01/odpdotnet04.html
たつ
常連さん
会議室デビュー日: 2005/11/21
投稿数: 39
投稿日時: 2005-12-02 21:20
テストミスがあり上記のコーディングでは動作しないことが分かりました。

そこで配列バインドを使って作り直そうとしているのですが、streamReaderからはファイルに何行あるか取得できないし動的配列をうまくつくれません。

調べていると、ArrayListが使えると思ったのですが、Parametersに入れるときにキャストがうまくできません。何か良い方法はないでしょうか?

何度も申し訳ございません。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2005-12-02 21:56
配列を動的に増やすなら
Redim Preserve で増やせますよ

ArrayList を使いたいなら

Dim Value As New ArrayList
Value.Add("ABCDEFG")
Value.Add("AAAAAAA")
CType(Value .ToArray(), String())

でどうですか?
たつ
常連さん
会議室デビュー日: 2005/11/21
投稿数: 39
投稿日時: 2005-12-02 22:13
内容にミスがあったので中身消しましたm(__)m

[ メッセージ編集済み 編集者: たつ 編集日時 2005-12-02 22:22 ]

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