こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

SQLを連続発行する時の正しい(?)書き方は?

Microsoft Visual Basic 2010 Express の質問です。

ExcelVBAや、AccessVBAで作成したプログラムを、VBに移そうと思っています。

ネットや本のサンプルを、自分のやりたいことに修正しつつ、一応、動作としては希望通りなのですが、元々VBAで簡易に作ったものだけに、本来なら注意すべきインスタンスの管理などがおざなりになっています。

動作は一応正常ですが、果たしてこれで良いのか不安でもありますので質問させていただきます。


大抵の本やサンプルには、複数のSQLを連続で発行するようなものは載っていませんが、いくつものSQLを順次発行していく処理をする時は、どのように記述するのが正しいでしょうか?

例えば、Access2010データベース、C:\test.accdb には、別のテーブルからリンクしたテーブル genpon があるとします。これをコピーしたテーブル、tb01を作る場合、

------------------------------------
Dim com As OleDb.OleDbCommand
Dim cn As OleDb.OleDbConnection = New OleDb.OleDbConnection( _
"Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=C:\test.accdb;")

cn.Open()

''現在のデータを削除
com = New OleDb.OleDbCommand("DROP TABLE [tb01];", cn)
com.ExecuteNonQuery()

''現在のデータを削除
com = New OleDb.OleDbCommand("SELECT * INTO [tb01] FROM [genpon];", cn)
com.ExecuteNonQuery()

------------------------------------

SQLとしては、現テーブルをDROPして、SELECT * INTO を発行すれば希望通りで、上記もその通り動きますが、NEWでインスタンス作成を繰り返しているのは、やってはいけない事ではないでしょうか?


さらに、例えばこのコードの続きとして、FOR~NEXTや、DO~LOOPで繰り返しを設け、その中でINSERT INTO を発行しながら、データを登録するような処理を加える場合、このままでは NEWをループの回数分、繰り返す事になります。

プロシージャの中で、ループなどで複数のSQLを発行する場合、記述として正しい作法がありましたら、教えてください。

投稿日時 - 2014-04-09 15:33:58

QNo.8547875

困ってます

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

それぞれの最後、つまりExecuteNonQuery()の発行後、Dispose()すれば問題ありません。
が、どうせ同じインスタンスを利用するならば、2回目以降はCommandTextプロパティに設定されている
クエリを変更して発行、その後Dispose()でも良いでしょう。

また、移行ということで、元々問題ないのでしょうが、問題があるようならば
プリペアドステートメントによる発行を推奨します。(SQLインジェクション対策)
Accessはクエリキャッシュ機構はないでしょうから、パフォーマンスは変わらないでしょうけど。
http://msdn.microsoft.com/ja-jp/library/vstudio/yy6y35y8(v=vs.100).aspx

投稿日時 - 2014-04-09 16:03:59

お礼

ありがとうございます。

Dispose() を発行後にセットする事にしました。

大きなやり方の間違いでなくて、ホッとしています。

投稿日時 - 2014-04-10 10:40:43

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問