質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

1回答

8128閲覧

VB.NET NpgsqlParameterを使って動的にin句を生成したうぃ

nabeskitchen

総合スコア8

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2018/05/17 06:39

編集2018/05/17 06:40

★やりたいこと
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日使っても答えが出ないのでヘルプをお願いしたいです。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

本件、in句を使うのはあきらめました!
以下、回避方法です。この回避方法にコメント等あればドシドシくださいぃぃぃ

SQLを以下に修正。

  • Before

SELECT * FROM TABLE_1 WHERE KEY IN ( :KEY )

  • After

SELECT * FROM TABLE_1 WHERE KEY SIMILAR TO :KEY

":KEY"には、パイプライン区切りで抽出したいレコードのPKを指定しました。

つまり、

抽出したいもののPKが、 PK_1 PK_2 PK_3 だった場合、

SELECT * FROM TABLE_1 WHERE KEY SIMILAR TO 'PK_1|PK_2|PK_3'

というSQLを作るようにプログラムを改めて、’雰囲気だけin句’ということで回避することにしました。

この実装になにか問題点を発見された方は教えてください。
「パフォーマンス的観点」でも、
「そもそもバグあるじゃん?」でも、
「おおなるほど!君は天才か!」でもなんでもOKです。

誰かから反応がきたらこの質問をcloseします。

以上、よろしくお願いします。

投稿2018/05/17 09:04

nabeskitchen

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2018/05/17 09:10

質問タイトルの「うぃ」が気になって仕事が手につかないので修正していただけませんか?
nabeskitchen

2018/05/17 09:16

注目してもらうための工夫です。見てくれてありがとうございます。
nabeskitchen

2018/05/17 09:27

ふふふふっ。コメントあざした!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問