• ベストアンサー

VB.NETでSQLを作る時のカンマの対処

こんにちは。 タイトルの通りなのですが、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文の最後にカンマが残ってしまいます。 ですが、前カンマをやったところで構文的におかしくなってしまいます。 このようなとき、どのように対処すればよいのでしょうか? よろしければ、教えてください。

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

  • ベストアンサー
回答No.1

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 泥臭く作るとこんな具合ですかね。

spiral1111
質問者

お礼

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

その他の回答 (4)

回答No.5

既にいろいろ書かれてますが、他にも例えば… 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で十分だと思うのですが…

spiral1111
質問者

お礼

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

  • KG_
  • ベストアンサー率62% (34/54)
回答No.4

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) --------------------------------------------------

spiral1111
質問者

お礼

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

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

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 といった具合です

spiral1111
質問者

お礼

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

  • kokorone
  • ベストアンサー率38% (417/1093)
回答No.2

SQL文の前で、ローカル変数で、IN句に含まれる文字列を つくり込んでおき、SQL文では、ローカル変数を参照するように すれば、いかがですか? もちろん、ローカル変数の最後のカンマは、削除しておくこと。 dim kwd as string 'kwd設定処理 kwd=left(kwd,len(kwd)-1) '最後のカンマを削除 こんなふうにね。

spiral1111
質問者

お礼

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

関連するQ&A