- ベストアンサー
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文の最後にカンマが残ってしまいます。 ですが、前カンマをやったところで構文的におかしくなってしまいます。 このようなとき、どのように対処すればよいのでしょうか? よろしければ、教えてください。
- みんなの回答 (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 泥臭く作るとこんな具合ですかね。
その他の回答 (4)
- K-Sogacchi
- ベストアンサー率53% (50/93)
既にいろいろ書かれてますが、他にも例えば… 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で十分だと思うのですが…
お礼
皆様、大変参考になる意見ありがとうございました。 自分では結構考えたつもりだったのに、こんなにたくさんの対処法があることにビックリしました。 もっと勉強したいと思います。
- KG_
- ベストアンサー率62% (34/54)
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) --------------------------------------------------
お礼
皆様、大変参考になる意見ありがとうございました。 自分では結構考えたつもりだったのに、こんなにたくさんの対処法があることにビックリしました。 もっと勉強したいと思います。
- redfox63
- ベストアンサー率71% (1325/1856)
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 といった具合です
お礼
皆様、大変参考になる意見ありがとうございました。 自分では結構考えたつもりだったのに、こんなにたくさんの対処法があることにビックリしました。 もっと勉強したいと思います。
- kokorone
- ベストアンサー率38% (417/1093)
SQL文の前で、ローカル変数で、IN句に含まれる文字列を つくり込んでおき、SQL文では、ローカル変数を参照するように すれば、いかがですか? もちろん、ローカル変数の最後のカンマは、削除しておくこと。 dim kwd as string 'kwd設定処理 kwd=left(kwd,len(kwd)-1) '最後のカンマを削除 こんなふうにね。
お礼
皆様、大変参考になる意見ありがとうございました。 自分では結構考えたつもりだったのに、こんなにたくさんの対処法があることにビックリしました。 もっと勉強したいと思います。
お礼
皆様、大変参考になる意見ありがとうございました。 自分では結構考えたつもりだったのに、こんなにたくさんの対処法があることにビックリしました。 もっと勉強したいと思います。