• ベストアンサー

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

  • VB.Netのテキストボックスのコントロール

    VB2010を使用しています。チェックボックスのon/offでテキストボックスの入力を制限しようとしています。 If Check1.Checked = True Then For Each Cont As Control In Me.Groupko顧客数.Controls If Cont.Name Like "Text*" Then ここの記述ですが         『Cont.ReadOnly = True』と書いても構文が違うのか認識しません?? End If Next Else           逆のコードの予定 End If 大量のテキストボックスがあるので一つ一つコードを書くのは面倒なので ご教授お願いします。

  • 行数をカウントするSQLにつきまして

    行数をカウントするSQLにつきまして いつもお世話になっております。 下記の売上テーブルから りんご=3(行) みかん=2(行) メロン=1(行) というようなデータを抽出するSQLはどのように記述したら良いのでしょうか? ・・・・売上テーブル・・・ 売上番号 品名 単価 1     りんご 100 2     りんご 100 3     りんご 100 4     みかん 150 5     みかん 150 6     メロン 250

  • 表をtxtで書き出して行内に任意の文字を入れたい

    Excelで以下のような空セルに記入を求めるシートを作成し、 入力後、txtで書き出すと下段のように任意の文字を挿入してくれるシートを作りたいのですが、 この場合、Excelの"フォーム"等という箇所を勉強すれば良いのでしょうか。 ラベル1はなんですか | (空セル) | (空セル) ラベル2はなんですか | (空セル) | (空セル) ↓入力 ラベル1はなんですか | りんご | メロン ラベル2はなんですか | イチゴ | みかん ↓txtで書き出すと・・・ label01,りんご,メロン,label01end label01,イチゴ,みかん,label02end

  • if文からcase文への置き換え

    ピクチャボックスをクリックしたら、チェック ボックスがチェックされるメソッドを作りたいと 思っています。 Private Sub PictureBox_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click,PictureBox2.Click 'ここから If sender Is PictureBox1 Then If Me.CheckBox1.Checked = False Then Me.CheckBox1.Checked = True Else Me.CheckBox1.Checked = False End If ElseIf sender Is PictureBox2 Then If Me.CheckBox2.Checked = False Then Me.CheckBox2.Checked = True Else Me.CheckBox2.Checked = False End If End If 'ここまで End Sub 上記のif文をCase文に置き換えたくて、 'ここから Select Case sender Case PictureBox1 If Me.CheckBox1.Checked = False Then Me.CheckBox1.Checked = True Else Me.CheckBox1.Checked = False End If Case PictureBox2 If Me.CheckBox2.Checked = False Then Me.CheckBox2.Checked = True Else Me.CheckBox2.Checked = False End If End Select 'ここまで 上記のように書き換えたのですが、エラーが出てしまいます(ビルドは通るのですが)。 Case文の使い方が間違っているんだとは思いますが、どこがどう 間違っているのがよくわかりません。 ご教授いただけないでしょうか?

  • 行数をカウントするSQLにつきまして

    行数をカウントするSQLにつきまして いつもお世話になっております。 下記の売上テーブルから みかん=3(行目) というようなデータを抽出するSQLはどのように記述したら良いのでしょうか? ・・・・売上テーブル・・・ 売上番号 品名 単価 101   りんご 100 102   りんご 100 103   みかん 150 104   りんご 100 105   みかん 150 106   メロン 250 postgre8.3のためrow_numberが使えません

  • PHP SQL 問合せについて

    SQLについて質問いたします。SQL 全般でも結構です。 No,name 1,ばなな 2,りんご 3,ばなな 4,みかん 5,ばなな 6,りんご 上記テーブルで 1,ばなな 3,ばなな 5,ばなな 2,りんご 6,りんご 4,みかん の結果を得るSQLはどのように記述すればよいでしょうか?

  • 条件判断について教えて下さい。

    VB2008を使用している初心者です。 現在、RichTextBoxとCheckBoxとそれに対応したTextBoxを準備し、CheckBoxがTrueのTextBox.TextをRichTextBoxに代入するプログラムを作成しています。RichTextBoxにはCheckBoxをTrueにした分だけ複数のTextBox.Textを代入させています。ここまでのプログラムは下記コードで問題なく作動しています。 Button1を押す。 RichTextBox1.Clear() If Me.CheckBox1.Checked = True Then RichTextBox1.Text = TextBox1.Text End If If Me.CheckBox2.Checked = True Then If RichTextBox1.Text <> "" Then RichTextBox1.Text = RichTextBox1.Text & "・" End If RichTextBox1.Text = RichTextBox1.Text & TextBox2.Text End If ・ ・ ・ If Me.CheckBox20.Checked = True Then If RichTextBox1.Text <> "" Then RichTextBox1.Text = RichTextBox1.Text & "・" End If RichTextBox1.Text = RichTextBox1.Text & TextBox20.Text End If ここで問題なのですが、RichTextBox1への代入完了後、FalseにしたCheckBoxを再度True(代入時に選択したもののみ)にするコードをButton2に作成したいのですが上手くいきません。例えば下記のコードですと、RichTextBoxに1つだけTextBoxが入っている場合しかCheckBoxのTrueが戻りません。 If Me.CheckBox1.Checked = False Then If RichTextBox1.Text = TextBox1.Text Then Me.CheckBox1.Checked = True End If End If ・ ・ ・ If Me.CheckBox20.Checked = False Then If RichTextBox1.Text = TextBox20.Text Then Me.CheckBox2.Checked = True End If End If これはIf RichTextBox1.Text = TextBox1.Text Thenにしてしまっているためだと思いますが、これをどう修正したら良いかわかりません。もしお時間がある方みえましたらご教授お願いいたします。

  • チェックボックス/ラジオボタン

    CGIを勉強中です。 まだ無料で配布されているCGIをカスタムするくらいしかできないレベルです。 今度やりたいのが、チェックボックス/ラジオボタンどじらでもいいのですが、 こちらに送られてくるメールフォームで選択されているものは仮に「Y」 選択されていないものは「N」という形で受け取りたい場合はどのように したらできるのでしょうか? よろしくお願いします。 <input type="checkbox" name="みかん" value="みかん" />みかん <input type="checkbox" name="りんご" value="りんご" />りんご <input type="checkbox" name="メロン" value="メロン" />メロン <input type="radio" name="みかん" value="みかん">みかん  <input type="radio" name="りんご" value="りんご">りんご

    • ベストアンサー
    • CGI
  • VBでSQL

    SQLでテーブル1に該当レコードがなければインサート あればアップデートをする処理をしたいのです IF ??? THEN UPDATE テーブル1 SET SELECT * FROM テーブル2 WHERE 条件 ELSE INSERT INTO テーブル1(SELECT * FROM テーブル2) END IF ???はプライマリキーで判定をしようと考えています こんな感じでやろうとしたところ うまくいきませんでした VB上で実行しよううとしているからなのでしょうか? ADOでSQLサーバに接続しています 条件分岐もどういう条件(VBでの書き方)がわからないです。 よろしくお願いします。

  • VBでの質問です

    VBでの質問です 5分を計るタイマーを作っていて5分たつと止まるプログラムを作っていて、コンマ以下のケタが長くて、しかも止まらない( Label1.Text = n5.Subtract(Now).ToStringをLabel1.Text = n5.Subtract(Now).TotalMinutesにしてIf Label1.Text = "00:00:00" ThenをIf Label1.Text = "0" Thenにした時は止まりました)ので止まるようにするにはどこを変えればいいですか? 教えてください 以下コードです Public Class Form1 Dim n5 As DatePrivate Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load n5 = Now.AddMinutes(5) Timer1.Interval = 1000 Timer1.Start() End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Label1.Text = n5.Subtract(Now).ToString If Label1.Text = "00:00:00" Then MsgBox("時間になりました。") Timer1.Stop() End If End Sub 長文ですいません

専門家に質問してみよう