電子書籍の厳選無料作品が豊富!

こんにちは。
タイトルの通りなのですが、VB.NETでSQL文を作りたいのですが、カンマの対処について分からなかったので質問させて頂きました。
例えば、下記のようなテーブルとwindowsアプリケーションフォームがあったとします。

itemテーブル                 フォーム(□はチェックボックスだと思ってください。)
item_id  item_cd  item_name        □ りんご
---------------------------------       □ ばなな
0001    0001    りんご        □ みかん
0002    0002    ばなな        □ めろん
0003    0003    みかん
0004    0004    めろん

このフォームで、チェックボックスに印が付いているものを、SQL文の条件に加えたいと思っていますが、なかなか上手く書けません。

現在のソース
sql="SELECT item_id,item_cd,item_name " _
  & "FROM item " _
  & "WHERE item_name IN ("

If apple.checked = True Then
  sql &= "'" & label1.text & "',"
End If

If banana.checked = True Then
  sql &= "'" & label2.text & "',"
End If
        ・
        ・
        ・

このやり方だと、sql文の最後にカンマが残ってしまいます。
ですが、前カンマをやったところで構文的におかしくなってしまいます。

このようなとき、どのように対処すればよいのでしょうか?
よろしければ、教えてください。

A 回答 (5件)

dim needComma as boolean = false



If apple.checked = True Then
if needComma then
sql &= ","
end if
  sql &= "'" & label1.text & "'"
needComma = true
End If

If banana.checked = True Then
if needComma then
sql &= ","
end if
  sql &= "'" & label2.text & "'"
needComma = true
End If

泥臭く作るとこんな具合ですかね。
    • good
    • 0
この回答へのお礼

皆様、大変参考になる意見ありがとうございました。
自分では結構考えたつもりだったのに、こんなにたくさんの対処法があることにビックリしました。
もっと勉強したいと思います。

お礼日時:2008/10/23 19:03

既にいろいろ書かれてますが、他にも例えば…



Dim tmpIN As String = ""
If apple.Checked Then
  tmpIN &= IIf(tmpIN = "", "", ",").ToString & label1.Text
End If
If banana.Checked Then
  tmpIN &= IIf(tmpIN = "", "", ",").ToString & label2.Text
End If
  :
  :
sql = sql & tmpIN & ")"

とか。
わざわざToStringを使ってるのは、Option Strict Onだと、IIf関数の
戻り値がObject型(のはず)なのでエラーになるからです。
関数とか使って綺麗に組めば、もうちょっとスッキリさせられるかもですが、
とりあえず、この程度で。

余談:
もしかして、CheckBox右の文字を表示するために、わざわざLabel使ってたりします?
CheckBox.Textで十分だと思うのですが…
    • good
    • 0
この回答へのお礼

皆様、大変参考になる意見ありがとうございました。
自分では結構考えたつもりだったのに、こんなにたくさんの対処法があることにビックリしました。
もっと勉強したいと思います。

お礼日時:2008/10/23 19:02

redfox63さんと提案内容は同じですが、VB2005で同じようなことを


自分がやっていますので一例としてどうぞ。
List(Of T)クラスを使った手法です。

-------------------------------------------------
Dim whereList as New List(Of String)
Dim sql As String

sql = "select name from members "
whereList.Add("group_name='" & label1.Text & "'")
whereList.Add("class_name='" & label2.Text & "'")
sql &= "where " & String.Join(",",List.ToArray)
Debug.Print(sql)
--------------------------------------------------
    • good
    • 0
この回答へのお礼

皆様、大変参考になる意見ありがとうございました。
自分では結構考えたつもりだったのに、こんなにたくさんの対処法があることにビックリしました。
もっと勉強したいと思います。

お礼日時:2008/10/23 19:02

ArrayListと String.Jonをつかって簡素化してみてはいかがでしょう



dim ar as New ArrayList()
dim ss as string
ar = AddRange(New String() {"りんご", "ばなな", "みかん", "めろん"})
' フォームのControlsコレクションを検査
for each ctl as Contol in Controls
  if typeof ctl is CheckBox then
    ' CheckBoxでチェックが無い場合
    if CType(ctl,CheckBox).Checked=False then
      dim n as Integer = ar.IndexOf( ctl.Text )
      ' arにアイテムが登録されているならば削除
      if n > -1 then ar.RemoveAt(n)
    end if
  end if
next
if ar.Length > 0 then
  ' アイテムが残っているなら ',' でアイテム同士をつなぐ
  ss = String.Format( " WHERE IN ( '{0}' )", _
    String.Join( "','", ar.ToArray( GetType( String ) ) ) )
end if
といった具合です
    • good
    • 0
この回答へのお礼

皆様、大変参考になる意見ありがとうございました。
自分では結構考えたつもりだったのに、こんなにたくさんの対処法があることにビックリしました。
もっと勉強したいと思います。

お礼日時:2008/10/23 19:03

SQL文の前で、ローカル変数で、IN句に含まれる文字列を


つくり込んでおき、SQL文では、ローカル変数を参照するように
すれば、いかがですか?
もちろん、ローカル変数の最後のカンマは、削除しておくこと。
dim kwd as string
'kwd設定処理

kwd=left(kwd,len(kwd)-1) '最後のカンマを削除

こんなふうにね。
    • good
    • 0
この回答へのお礼

皆様、大変参考になる意見ありがとうございました。
自分では結構考えたつもりだったのに、こんなにたくさんの対処法があることにビックリしました。
もっと勉強したいと思います。

お礼日時:2008/10/23 19:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!