アプリ版:「スタンプのみでお礼する」機能のリリースについて

VB初心者でソフト開発をやり始めたのですが行き詰まって困っています。
助けてください。よろしくお願いします。
・ACCESSのmdb形式のデータは下記の構成になっています。
 1列: ID      integer サイズ指定無し 自動設定 
 2列: 名前    string  サイズ指定無し
 3列: 性別    string  サイズ指定無し
 4列: 電話番号 string  サイズ指定無し
 テーブル名:sampleTable
 フォームにテキストボックスを項目数配置してIDを設定してボタンを押すと各テキストボックスに
 検索されたデータが帰ってきて表示されるものです。

・下記のようなプログラムで「ID」を指定して検索が出来るのは確認済みです。
 これを「名前」を指定して検索出来るように改造したいのですがどのようにすれば
 良いのかお教え頂きたくお願いいたします。
 たぶん ”strSelectSql =・・・・・の部分かと思うのですがよろしくお願い致します。
  (色々試しましたがうまくいきません・・・。)

Public Class Form1
Dim MjstrPath As String
Dim MjstrID As String 'ID
Dim MjstrSimei As String '名前
Dim MjstrSexnam As String '性別
Dim MjstrTel As String '電話番号
 '-----------------------------
 'データを検索する
 '-----------------------------
Function MDB_SELECT(ByVal PistrMakPath As String) As Boolean
MDB_SELECT = False
Dim strDatbasePara As String 'データベースパラメータ
Dim ObjCnn As New ADODB.Connection
Dim ObjRst As New ADODB.Recordset
Dim strSelectSql As String
    MjstrSimei= TextBox4

strDatbasePara = "Provider=Microsoft.Jet.OLEDB.4.0;" + _
"Data Source=" + PistrMakPath + ";" + _
"Jet OLEDB:Engine Type=5;"
Try
ObjCnn.Open(strDatbasePara)
' strSelectSql = "Select * from sampleTable" _
' + " where ID = " + MjstrID
strSelectSql = "Select * from sampleTable" _
+ " where ID = " + MjstrID  '<--- 問題か? ---
       ’where 名前= "+ MjstrSimei ではだめでした
ObjRst.Open(strSelectSql, ObjCnn, _
ADODB.CursorTypeEnum.adOpenKeyset, _
ADODB.LockTypeEnum.adLockOptimistic)
If ObjRst.EOF Then
MjstrSimei = ""
MjstrSexnam = ""
MjstrTel = ""
Else
MjstrID = ObjRst.Fields("ID").Value
MjstrSimei = ObjRst.Fields("名前").Value
MjstrSexnam = ObjRst.Fields("性別").Value
MjstrTel = ObjRst.Fields("電話番号").Value
MDB_SELECT = True
End If
ObjRst.Update()
ObjRst.Close()
Catch ex As Exception
End Try
ObjCnn = Nothing
ObjRst = Nothing
End Function
 '-------------------------------------------------------------
 'データを検索する
 '-------------------------------------------------------------
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button2.Click
Dim strMdbpath As String
Dim intRecQuery As Integer
strMdbpath = TextBox1.Text + "\" + TextBox2.Text
MjstrID = TextBox3.Text
If MDB_SELECT(strMdbpath) Then
MsgBox("検索該当しました")
Else
MsgBox("該当ありません")
End If
TextBox4.Text = MjstrSimei
TextBox5.Text = MjstrSexnam
TextBox6.Text = MjstrTel
End Sub
End Class

A 回答 (3件)

> where 名前= "+ MjstrSimei ではだめなのでしょうか?


SQL実行前に、メッセージボックス等でSQLを表示するようにしてみてください。
その書き方では、望むSQLが発行されていないことがわかります。


"where 名前= " + MjstrSimei
→ where 名前= 太郎

"where 名前= '" + MstrSimei + "'"
→ where 名前= '太郎'
    • good
    • 0
この回答へのお礼

出来ました!、本当にありがとうございました。
信じられない! 3日間調べ回ったのに解決策を探せ出せなかったことが・・・・。
この結果を基に文字列と数値の扱いをきっちり整理して認識を高めたいと思います。
簡潔明瞭な回答ほんとにありがとうございました。

お礼日時:2013/12/20 10:39

フィールドのデータ型が理解できていないようです。


「ID」フィールドは数値型、「名前」「性別」「電話番号」フィールドは文字列型です。
SQL文で文字列型の条件を記述する場合は、シングルコーテーションで囲む必要があります。

以下の手順で、必要なSQL文の検索条件部分を構築出来ます。

条件を入力するテキストボックスの名称を「ID条件」「名前条件」「性別条件」「電話条件」とする。
Where条件の文字列を、strWhere とする。
・strWhere を空にする。
・もしID条件が空でなければ
・□□strWhereの追加前処理()
・□□strWhereに、"(ID="+ID条件+")"を追加する。
・もし名前条件が空でなければ
・□□strWhereの追加前処理()
・□□strWhereに、"(名前='"+名前条件+"')"を追加する。
・もし性別条件が空でなければ
・□□strWhereの追加前処理()
・□□strWhereに、"(性別='"+性別条件+"')"を追加する。
・もし電話条件が空でなければ
・□□strWhereの追加前処理()
・□□strWhereに、"(電話番号='"+電話条件+"')"を追加する。
・もしstrWhereが空でなければ
・□□SQL文に、" WHERE "+strWhere を追加する。

ここで、strWhereの追加前処理()とは、2つ目以降の条件を追加する場合の前処理です。
・もしstrWhereが空でなければ、strWhereに" AND "を追加する。
    • good
    • 0
この回答へのお礼

3人目の方の短刀直入・単純明快な回答でやっと出来ました。その上で、貴殿の内容が初めて理解でき情報の豊富さに感動、ありがとうございました。頂いた情報は多いので今後の開発に役立てたいと思います。今後ともよろしくお願い致します。

お礼日時:2013/12/20 10:47

いきなりプログラムで考えるのではなく、「どういったSQLを生成したいか」をまず考えましょう。




IDが「1」のレコードを検索する場合は
  Select * from sampleTable
  where ID = 1
です。

では、名前が「太郎」のレコードを検索する場合はどうなるでしょうか?
  Select * from sampleTable
  where 名前 = 太郎
ではなく、
  Select * from sampleTable
  where 名前 = '太郎'
とすべきなのは理解しておられますか?

この回答への補足

おっしゃることは理解しているつもりです。
”ID”、”名前”共に MDB の項目名です。
"ID" も "名前" もフォームのTEXTBOXから参照してデータを入れる構造にしています。
’where 名前= "+ MjstrSimei ではだめなのでしょうか?

補足日時:2013/12/19 17:48
    • good
    • 0

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