DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Select文のテーブル名に変数を

環境/言語:[VB.NET2008 Access2007]
分類:[.NET]

Accessからレコードを引き出したいのですが、その際テーブル名に変数を当てて切り替えを行いたいのですが、

テーブル名 S8164-E10P
抽出条件  S8164

command.CommandText = "SELECT * FROM [S8164-E10P] Where ShipNo = S8164"

で、うまくいったのでこれを変数に変えて


Dim key1, DbTable As String

DbTable = "S8164-E10P"
key1 = "S8164"

command.CommandText = "SELECT * FROM '" + DbTable + "' Where ShipNo = '" + key1 + "'"

とすると、Where句のkey1はうまく動作しているようなのですが、テーブル名の方は
クエリの構文エラーになります。

テーブル名を変数にする正しい記述はどうなるのでしょうか?
2014/10/12(Sun) 06:54:09 編集(投稿者)

■No32661に返信(Lalaさんの記事)
> command.CommandText = "SELECT * FROM [S8164-E10P] Where ShipNo = S8164"
> で、うまくいったのでこれを変数に変えて
一つ確認。
 『 SELECT * FROM [S8164-E10P] Where ShipNo = S8164 』
ではなく
 『 SELECT * FROM [S8164-E10P] Where ShipNo = 'S8164' 』
の問い合わせではないのでしょうか?

前者は「ShipNo 列の値が S8164 列の値と一致するデータ」で、
後者は「ShipNo 列の値が S8164 という 5文字であるデータ」です。

提示されたその後のコードでも、ShipNo に渡すデータの両端を
「'」で囲まれているようですが…。


> command.CommandText = "SELECT * FROM '" + DbTable + "' Where ShipNo = '" + key1 + "'"

前者の意味であれば、
 command.CommandText = "SELECT * FROM [" & DbTable & "] Where ShipNo = [" & key1 & "]"
と書きます。また、後者の意味であれば、
 command.CommandText = "SELECT * FROM [" & DbTable & "] Where ShipNo = '" & key1.Replace("'", "''") & "'"
とします。


元の SQL では、テーブル名を [S8164-E10P] と指定していたのですから、それを
変数を絡めたからといって、'S8164-E10P' に変更する必要は無い、ということです。


なお、テーブル名や列名を [〜] で囲む代わりに、`〜` で囲むパターンもあります。
>  『 SELECT * FROM [S8164-E10P] Where ShipNo = 'S8164' 』

その通りです。記述ミスでした。申し訳ありません。

> 元の SQL では、テーブル名を [S8164-E10P] と指定していたのですから、それを
> 変数を絡めたからといって、'S8164-E10P' に変更する必要は無い、ということです。

うまくいきました。解説までしていただき、ありがとうございました。
解決済み!
■No32663に返信(Lalaさんの記事)

解決したようですが、 &演算子や+演算子での文字列連結だと
全体が分かりにくいので

command.CommandText = String.Format("SELECT * FROM [{0}] Where ShipNo = '{1}'", DbTable, key1)

とした方が固定部分と可変部分を分かりやすく出来ると思います。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板