★やりたいこと
VB内でSQLのin句に動的に値を埋め込んで、狙ったレコードを抽出したい。
★環境
VB.NET 2.0
★現在のコード
必要だと思われる部分だけ抜粋しています。
vb
1Dim param As New List(Of NpgsqlParameter) 'SQLパラメタ 2Dim targetRows as DataRow() '中身は割愛しますが、このrowsの中に、in句に入れたいkey情報が存在してます。 3Dim targetRecords(targetRows .Length - 1) As String 'key情報のみを格納する配列 4Dim indexCounter As Integer = 0 5 6'targetRowsからkey情報を抽出して、配列にため込む 7For Each dr As DataRow In sortRow 8 targetRecords(indexCounter) = CType(dr("KEY"), String) 9 indexCounter = indexCounter + 1 10Next 11 12'SQL文のkeyに対して、targetRowsのkey情報をマッピングさせる 13'Dim keys As New NpgsqlParameter("KEY", NpgsqlDbType.Array) 'これだとエラーになっちゃう;; 14Dim keys As New NpgsqlParameter("KEY", NpgsqlDbType.Text) 15keys .Value = targetRecords 16param.Add(keys) 17 18'以降、このパラメタを使ってSQLを実行 19'なおSQLは、下記のようなものを使っています。 20'SELECT * FROM TABLE_1 WHERE KEY IN ( :KEY )
★説明
下記のSQLがあります。
SELECT * FROM TABLE_1 WHERE KEY IN ( :KEY )
このIN句に入ってくるキーの数は実行のたびに異なり、固定ではありません;;
なので、VBソース内でkey情報をarrayに突っ込んで、
NpgsqlParameterに、このarrayをaddしてみました。
そのうえでこのプログラムを実行しましたが、エラーが出ずに正常終了するものの、
NpgsqlParameterに設定したarrayの内容が狙った通りに設定されていないようで、
in句に該当するレコードがHITしませんでした。
★質問
①そもそも、使うkeyの数だけin句にバインド変数を書いてあげて、対応するようにNpgsqlParameterを設定してあげないと、やりたいことが実現できない?
②in句の数が動的であっても、NpgsqlParameterが良きにマッピングしてくれるようなやり方はこの世に存在する?
③なるべくSQLはこのままいじりたくない。けどそれが無理なら弄るしかない;;
休日返上で考えてみたんですけど、
1日使っても答えが出ないのでヘルプをお願いしたいです。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/17 09:10
2018/05/17 09:16
2018/05/17 09:20
2018/05/17 09:27