[VB6] SQLの作成について

このQ&Aのポイント
  • VB6でのSQL文字列作成時に、画面のテキストボックスの入力値に応じてWHERE句の内容を変えたいです。
  • 現在のソースでは、入力値の有無によって条件分岐させているため、他に良い方法があるか教えてください。
回答を見る
  • ベストアンサー

[VB6] SQLの作成について

お世話になります。 VB6でSQL文字列を作成しております。 そこで質問させていただきたいのですが、 画面のテキストボックスに入力した値(txtName.textおよびtxtKatakana.text )が空かどうかに応じて、 SELECT文のWHERE句の内容を変えたいのですが。 (現ソース) sSQL = "" sSQL = sSQL & "SELECT * FROM TABLE名" If txtName.text <> "" AND txtKatakana.text <>"" Then sSQL = sSQL & "WHERE 名前= ' " & txtName.text & " ' " sSQL = sSQL & " AND カタカナ= ' " & txtKatakana.text & " ' " ElseIf txtName.text <> "" AND txtKatakana.text = "" Then sSQL = sSQL & "WHERE 名前= ' " & txtName.text & " ' " ElseIf txtName.text = "" AND txtKatakana.text <> "" Then sSQL = sSQL & " WHERE カタカナ= ' " & txtKatakana.text & " ' " 何か他に良い方法がありましたら、 教えていただけないでしょうか? よろしくお願いいたします。

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

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

これで問題はないのですが、少し手を入れると 次のようになるでしょうか。 Dim 名前 As String Dim カナ As String '万一、アポストロフィが入力された時の用心 名前 = Replace(txtName.Text, "'", "''") カナ = Replace(txtKatakana.Text, "'", "''") '以前の部分は省略 sSQL = ~ If 名前 <> "" Then     sSQL = sSQL & " WHERE 名前='" & 名前 & "'"     If カナ <> "" Then         sSQL = sSQL & " AND カタカナ='" & カナ & "'"     End If Else     If カナ <> "" Then         sSQL = sSQL & " WHERE カタカナ='" & カナ & "'"     End If End If

masy0312
質問者

お礼

ありがとうございます。参考になりました。

その他の回答 (2)

  • layy
  • ベストアンサー率23% (292/1222)
回答No.3

「*」ワイルドカードや、Like文を有効に使って試してみる。 SELECT * FROM テーブル名 WHERE カラム名 LIKE '[値]' とか SELECT * FROM テーブル名 WHERE カラム名 LIKE '*[値]*' その環境で、 [値]が空のとき(*をセットしてでも)全件、 [値]があればその値に該当するもの、 になるかどうかを確認する。 うまくいけばSQLは1文で、空の判定も要らない。 引き渡すものを変えて、SQLは変えない方向はどうか。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

参考までに挙げてみます。 (1)条件の内容(テキストボックスの中身)のA,Bは文字列 (2)2条件固定として、WHERE を使い、その中間はANDで結ぶ と言う前提で、文字列を結合してなど色々やってみたが、私の力では、余りすっきりならなかった。 例えば一旦先に条件の文字列を結合して、場合により不要なx="やAND Y=を消そうとしたが、判りにくいだけのようだった。 ーー ただしCase文を使うと、少し一瞬の可読性が上がるように思うが、どうだろう。 やはり場合分けを正面から、したほうがすっきりするようだ。 ーーー 私のテスト環境の関係でエクセルVBAでやってみた。条件文字列の出方だけのテストなので、あしからず。 ユーザーフォームにテキストボックスを2つ貼り付け。 コマンドボタン(キャプションは「検索実行」とでも、つけるべきか)を1つ貼り付け そのクリックイベントに Private Sub CommandButton1_Click() test01 End Sub 標準モジュールに (Case文のネスト) Sub test01() A = UserForm1.TextBox1.Text B = UserForm1.TextBox2.Text Select Case A Case Is = "" Select Case B Case "" MsgBox "エラー条件入力もれ" Case Else MsgBox "WHERE Y = " & B End Select Case Else Select Case B Case "" MsgBox "WHERE X= " & A Case Else MsgBox "WHERE X = " & A & " AND Y=" & B End Select End Select End Sub Where以下の文字列だけを論じている。 SQL処理系によって、上記のAyaBの前後にシングルコーテーションや、ダブルコーテーションが必要なものがあると思うので 修正が必要。 SELECT・・FROM ZZZと最後の;は必要だが略している。

関連するQ&A

  • 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での書き方)がわからないです。 よろしくお願いします。

  • SQL SERVER の Where条件

    初めて質問させて頂きます。 VB内でSQL文を作成し、それをSqlServerに送り実行させているのですが、 VB内でSQL文を作成する時に、Whereの条件を入れたり入れなかったりします。 その時、都度、WhereをつけるのかAndをつけるのか判断してプログラムを書くのが億劫なので Dim SqlString as string SqlString = "SELECT * FROM テーブルA WHERE 0 = 0" IF txtA.text <> "" then SqlString = SqlString & " AND 項目A = " & txtA.text END IF IF txtB.text <> "" then SqlString = SqlString & " AND 項目B = " & txtB.text END IF こういうズボラをしてるのですが、これってSqlの実行スピードに影響したりしますか? 思うようにインデックス使ってくれなかったりしますか? ご存知の方がご教授下さい。 よろしくお願いします。

  • VBとDB連携について

    VB.NETとDB(オラクル)を使って開発をしています。 画像の左側のテキストボックスは上から  textbox1(Nameプロパティ:txt_Name)  textbox2(Nameプロパティ:txt_Tihou)  textbox3(Nameプロパティ:txt_Category) としています SQL文で textbox1~textbox3の内容が入っている項目だけWHERE句で抽出させたいです たとえば画像の例で、 textbox1に「みかん」、textbox3に「果物」と入れているとき、 赤の四角で囲った2行をdatagridviewとかに表示しようとおもっています 実際のコード(変数等は中略しています) 'textbox1、textbox2、textbox3が空白でない if textbox1.text <> "" And textbox2.text <> "" And textbox3.text <> "" SQL = "select * from ["表名"] where 名前 = " & textbox1.text & _ " and 地方 = " &textbox2.text & " and カテゴリ = " & textbox3.text" end if 'textbox1が空白でない if textbox1.text <> "" And textbox2.text = "" And textbox3.text = "" SQL = "select * from ["表名"] where 名前 = " & textbox1.text & " end if ・ ・ ・ ・ ・・・という感じで全ての組み合わせ(10通りくらい)でIF文を書いています この例では3つなのでまだいいかもしれませんが、 テキストボックスが10個とか100個とかになったらどのように判断したらいいのか分からないです 何か効率いい方法、知っている方いましたら教えてください

  • SQL分のWHERE句について

    SQLのWHERE句について ================================== ABC :入力値(2又は5バイトの可変) T.テーブル.フィールド:ABCが格納されているテーブル(格納すると同時に5桁になります。) 例:01(入力値)⇒01000(格納値) ================================== 参照時のWHERE句の作成の仕方を教えてください。 ※検索値が2桁の場合は、格納値5桁の前方2桁一致でHITさせます。  また5桁の場合は、格納値5桁の全一致です。 今考えているのでは、 IF ABC <> "" THEN IF LenB(ABC) = 2 THEN SQL_WHERE = SQL_WHERE & "AND (LEFT(T.テーブル.フィールド,2) = '" & ABC & "' )" ELSEIF SQL_WHERE = SQL_WHERE & "AND (T.テーブル.フィールド = '" & ABC & "')" END IF END IF です。 宜しくお願いします

  • SQL・・

    SQL構築で聞かせてください。 テーブル 名前    購入月   購入日 カローラ    4    18 プリウス    5     2 クラウン   12    22 なカンジです・・。 文章で表すと、例えば、 4月16日~5月15日までのデータを取りたいのです。 SELECT * FROM kounyuu WHERE 名前 = プリウス 購入月 = 4 AND 購入日 >= 16 SELECT * FROM kounyuu WHERE 名前 = プリウス 購入月 = 5 AND 購入日 <= 15 この2つの SELECT 文を1つにすることは可能ですか? (名前には、常に同じ値が入ります)

  • VBでAccessにSQL文を実行して値を取り出す

    下記のソースは、 UserIDとPasswordをDBと照らし合わせて、 そのUserが存在すればTrue、存在しなければFalse を返すというプログラムです。 しかし初めてDBに接続し、まったく右も左も分からない 状況なので処理的におかしな点を教えていただけないでしょうか。 またDB接続からSQL実行までの簡単な流れを教えていただけると助かります。 adoRs = ADODB.Recordset adoCn = ADODB.Connection adoCd = ADODB.Command Login.txtName.Text = 比較するユーザー名 Login.txtPass.Text = 比較するパスワード です。その他わかりにくい点があったら質問を お願いします。 Private Function Func_UserSerch() As Boolean Func_UserSerch = False On Error GoTo UserSerchError 'レコードセットの取得 With adoRs .ActiveConnection = adoCn .Source = "user" .CursorType = adOpenStatic .LockType = adOpenForwardOnly .Properties("IRowsetIdentity") = True .Open End With MySQL = "SELECT * FROM user " & _ "WHERE UserID = " & Login.txtName.Text & _ "AND Password = " & Login.txtPass.Text & ";" 'SQLの実行 With adoCd .ActiveConnection = adoCn .CommandType = adCmdStoreProc .CommandText = MySQL .Execute End With If adoRs.EOF = True And adoRs.BOF = True Then Func_UserSerch = False Else Func_UserSerch = True End If UserSerchError: MsgBox "SQL実行中にエラーが発生しました" End Function

  • 一つのSQLで実行できるでしょうか?

    sqliteで質問です。 今、以下のようなテーブル(table1)があったとします。 uid | date | comment 010 | 1211 | AAAAA 011 | 1211 | BBBBB 010 | 1220 | CCCCCC 011 | 1220 | DDDDDD このとき、1行目と4行目を取得や削除するようなSQLを一つで記述することは可能でしょうか? イメージてきには、 select * from table1 where {((uid = 010) and (date = 1211)), ((uid = 011) and (date = 1220))} みたいな感じにです。 つまり、where句の組み合わせを複数書いて一つのSQLで実行したいのです。 恐れ入りますが、よろしくお願いします。

  • VisualStudioでデータベースへの登録ができないので教えてください

    全くのプログラミング初心者ですが、仕事で作らなければならないため困っています。 VisualStudioで以下のように記述しましたが、Accessで作ったデータベースに登録ができません。 どこを直せば良いかアドバイスをお願いします。 'text欄の書き込み処理------------------------------------------ For intX=1 to maxanswer sSQL="select qs_no,ans_no,text from T_qs_ans where id=" & id & " and ans_no =" & intX Set AnsRs=DB.Execute(sSQL) if Not AnsRs.EOF then if AnsRs("text")=1 then 'text欄がある場合 if request("text" & intX)<>"" then 'text欄に書き込みがあった場合 sSQL="insert into T_qs_ans_text (id,qs_no,ans_no,text,kubun,votenum,kubunA) values " sSQL=sSQL & "(" & id & "," & intX & ",'" & request("text" & intX) sSQL=sSQL & "'," & kubun & "," & kubunA & "," & votenum & ")" DB.Execute(sSQL) end if end if end if '-------------------------------------------------------------- Next

  • SQL文の連結が、うまくいきません

    いつもお世話になっております。  現在、SQL文生成プログラムを作成しているのですが  エラーメッセージ 「Microsoft OLE DB Provider for SQL Server (0x80040E14)  '.' 付近に不適切な構文があります。」  表示されて、どうしても解決出来ません  ソースを記載しますのでアドバイス頂けないでしょうか?  デバッガーみたいな事をさせてしまい、本当に申し訳ありません  開発者自分一人(ほぼ初めて)で、どうにも進みませんでしたので  お願いいたします。  ※--ASPのデバッグに関して  もう一つお聞きしたいのですが (出来ればこちらの質問も答えてくださると幸いです)  皆さんは、ASPのデバッグをどの様に行っていますか?  VB6.0やVBAの場合は、ソースが不完全やエラーでも  「F8」を押して、ソースの途中まで稼働させて  「現在格納されている変数の中身」等を確認して 割とエラー解決もスムーズに出来ましたが、ASPではそれが出来ないため  難航しています(Line*** と エラーメッセージだけを頼りに)  皆さんはASPの場合、どの様にエラー解消されていますか?  (どうにかして、自分一人でも安定して成果をあげていきたいので)  我流でも結構ですので、是非アドバイスお願いします SQL生成ソース '--SQL生成  strSQL = "select * from STA040, STA500M7"  '--SQL作成(抽出場合分け)  if check = "Day" then   strSQL = strSQL + "where STA500M7.CODE040 = STA040.CODE"  '--期日空白処理   Blank_out J_days_st,N_days_st,M_days_st,J_days_ed,N_days_ed,M_days_ed  '--受注日BetWeen   if J_days_st <> "" and J_days_ed <> "" then    strSQL = strSQL + " and STA500M7.YYMMDD_1 BETWEEN " & J_days_st_sql & " and " & J_days_ed_sql & " "  '--受注日start○,End×   Elseif J_days_st <> "" and J_days_ed = "" then    strSQL = strSQL + " and STA500M7.YYMMDD_1 >= " & J_days_st_sql & " "  '--受注日start×,End○   Elseif J_days_st = "" and J_days_ed <> "" then    strSQL = strSQL + " and STA500M7.YYMMDD_1 <= " & J_days_st_sql & " "  '--受注日start×,End×   Elseif J_days_st = "" and J_days_ed = "" then   End if  '--納期BetWeen   If N_days_st <> "" and N_days_ed <> "" then    strSQL = strSQL + " and STA500M7.YYMMDD_3 BETWEEN " & N_days_st_sql & " and " & N_days_ed_sql & " "  '--受注日start○,End×   Elseif N_days_st <> "" and N_days_ed = "" then    strSQL = strSQL + " and STA500M7.YYMMDD_3 >= " & N_days_st_sql & " "  '--受注日start×,End○   Elseif N_days_st = "" and N_days_ed <> "" then    strSQL = strSQL + " and STA500M7.YYMMDD_3 <= " & N_days_st_sql & " "  '--受注日start×,End×   Elseif N_days_st = "" and N_days_ed = "" then   End if  '--見積日BetWeen   If M_days_st <> "" and M_days_ed <> "" then    strSQL = strSQL + " and STA500M7.YYMMDD_10 BETWEEN " & M_days_st_sql & " and " & M_days_ed_sql & " "  '--見積日start○,End×   Elseif M_days_st <> "" and M_days_ed = "" then    strSQL = strSQL + " and STA500M7.YYMMDD_10 >= " & M_days_st_sql & " "  '--納期start×,End○   Elseif M_days_st = "" and M_days_ed <> "" then    strSQL = strSQL + " and STA500M7.YYMMDD_10 <= " & M_days_st_sql & " "  '--納期start×,End×   Elseif M_days_st = "" and M_days_ed = "" then   End if 'strSQL = strSQL + "order by sta500m7.code ASC" 'strSQL = "select * from STA040,STA500M7 where STA500M7.CODE040 = STA040.CODE and STA500M7.YYMMDD_3 >= " & hiduke & " " 'strSQL = strSQL + " order by sta500m7.code DESC;"    End if    '↓ここがエラーだと表示されます(おそらくSQLが問題かと)    Set objRS = objCon.Execute(strSQL)'レコードセットのオープン  アドバイスお願いいたします

  • PL/SQLでのSQL文法

    こんにちは。教えてください。 PL/SQLを使うのが初めで戸惑っています。 まず、PROCEDUREで =========================== BEGIN SELECT NAME FROM TABLE1 WHERE NAME='tanaka'; END; / =========================== このように書いて実行させようとすると、「コンパイルエラー」 「INTO句はこのSELECT文に入ります」というエラーが出ます。 SQLの文法的には間違ってないと思うのですが、INTO句とはこれいかに?? ネットでPL/SQLで検索かけて調べたのですがあまりにも初歩すぎて わかりませんでした。 PL/SQLやORACLEのメーリングリストでお勧めがありましたら教えてください。 よろしくお願いいたします。