vb2010でmdbデータの任意の項目で検索

このQ&Aのポイント
  • VB初心者でソフト開発をやり始めたのですが行き詰まって困っています。助けてください。
  • ACCESSのmdb形式のデータは下記の構成になっています。1列:ID integer サイズ指定無し 自動設定 2列:名前 string サイズ指定無し 3列:性別 string サイズ指定無し 4列:電話番号 string サイズ指定無し テーブル名:sampleTable フォームにテキストボックスを項目数配置してIDを設定してボタンを押すと各テキストボックスに検索されたデータが帰ってきて表示されるものです。
  • 下記のようなプログラムで「ID」を指定して検索が出来るのは確認済みです。これを「名前」を指定して検索出来るように改造したいのですがどのようにすれば良いのかお教え頂きたくお願いいたします。たぶん ”strSelectSql =・・・・・の部分かと思うのですがよろしくお願い致します。(色々試しましたがうまくいきません・・・。)
回答を見る
  • ベストアンサー

vb2010でmdbデータの任意の項目で検索

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

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

  • ベストアンサー
  • Picosoft
  • ベストアンサー率70% (274/391)
回答No.3

> where 名前= "+ MjstrSimei ではだめなのでしょうか? SQL実行前に、メッセージボックス等でSQLを表示するようにしてみてください。 その書き方では、望むSQLが発行されていないことがわかります。 "where 名前= " + MjstrSimei → where 名前= 太郎 "where 名前= '" + MstrSimei + "'" → where 名前= '太郎'

19lalatombo52
質問者

お礼

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

その他の回答 (2)

回答No.2

フィールドのデータ型が理解できていないようです。 「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 "を追加する。

19lalatombo52
質問者

お礼

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

  • Picosoft
  • ベストアンサー率70% (274/391)
回答No.1

いきなりプログラムで考えるのではなく、「どういったSQLを生成したいか」をまず考えましょう。 IDが「1」のレコードを検索する場合は   Select * from sampleTable   where ID = 1 です。 では、名前が「太郎」のレコードを検索する場合はどうなるでしょうか?   Select * from sampleTable   where 名前 = 太郎 ではなく、   Select * from sampleTable   where 名前 = '太郎' とすべきなのは理解しておられますか?

19lalatombo52
質問者

補足

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

関連するQ&A

  • VBでSQLを使い検索をしたいのですが。

    VBでSQLを使い検索をしたいのですが、SELECT文の使い方が分かりません。 下記の記述で、番号、氏名、電話番号をそれぞれのTEXTBOX1,TEXTBOX2,TEXTBOX3の ように各容器にいれたいのでが分かりません。 文をその文増やせばいいのでしょうか、SELECT文1行で複数の結果を受け取る方法を教えて下さい。 宜しくお願い致します。 Dim Adapter As New OleDbDataAdapter(SQLCm) Dim Table As New DataTable Dim name As String Dim selcomd As String Dim Value As String name = TextBox11.Text selcomd = "SELECT 番号,氏名,電話番号  FROM meishi WHERE 氏名 like '" & name & "' " SQLCm.CommandText = selcomd

  • VB ファイルの検索について

    VB ファイルの検索について こんにちは VB2008でファイルの種類を指定して、検索するプログラムを作っています。 要求: 1ボタンをクリックして、検索対象のフォルダを指定 2事前に決めたファイル種類(*.txt)を検索する 3(*.txt)がある場合はディスクトップにコピーする 今は1ができましたが、2と3について、どうやって書くのかわからないです。 --------------------ソース------------ Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim SourcePath As String Dim fdb As New FolderBrowserDialog With fdb 'Select to Folder and open it .Description = "Please Select Folder" .RootFolder = System.Environment.SpecialFolder.MyComputer SourcePath = TextBox1.Text .SelectedPath = SourcePath If fdb.ShowDialog() = DialogResult.OK Then TextBox1.Text = fdb.SelectedPath End If End With End Sub End Class ------------------------------------------------------- 以上  宜しくお願い致します。(^@^)

  • excel vba で .mdb のデータ抽出

    excel vba で postdata.mdbのpostレコードから条件に合うデータを抽出しようとしています。 数日間、いろいろ調べていますが分かりません。 おそらく、SQLの部分だと思うのですが・・・ adoは初めて使う素人なので教えていただけないでしょうか。 On Error GoTo ErrGyo Set cn = New ADODB.Connection cn.Provider = "Microsoft.Jet.OLEDB.4.0" cn.Open ThisWorkbook.Path & "\postdata.mdb" Dim Rs As ADODB.Recordset Dim SQL As String Dim T_ken As String Dim T_si As String Dim T_mati As String Dim i As Long T_ken = TextBox1.Value  ’フォームにテキストボックス T_si = TextBox2.Value T_mati = TextBox3.Value SQL = "SELECT * FROM post WHERE ken like '" & T_ken & "' and si LIKE '" & T_si & "' and mati LIKE '" & T_mati & "'" Set Rs = New ADODB.Recordset Rs.Open SQL, cn, adOpenForwardOnly, adLockReadOnly MsgBox Rs.RecordCount  ’ここでチェックすると -1 となる??? If Rs.RecordCount = 0 Then MsgBox "該当するレコードは見つかりませんでした。", vbInformation Else For i = 1 To Rs.RecordCount Cells(i, 1) = Rs!num Cells(i, 2) = Rs!ken Cells(i, 3) = Rs!si Cells(i, 4) = Rs!mati Rs.MoveNext Next End If Rs.Close: Set Rs = Nothing cn.Close: Set cn = Nothing Exit Sub ErrGyo: MsgBox "postdataへの接続に失敗しました", vbCritical

  • VB.NET、mdbに新しいデータを追加したい

    超初心者で申し訳ありません。下のプログラムにおいてオペレータ名が一致する場合には 更新(UPDATE)する。一致するデータが無い場合には新規登録を行いたいのですが どのように書いたらいいのかさっぱりでNETを相当探したのですが回答が見つかりません。 お手数ですがどなたか助けていただけませんでしょうか。なお、一致する場合には 更新(UPDATE)は動作するようになりました。 VBを始めて2ケ月になります。Microsoftの文献を見ても難しくてまだ理解できるレベルに達していません。どなたか、よろしくお願い致します。 「データ構造」 ID          integer オペレータ名   string ランク       integer パスワード    string 補足       string Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click '■■■■■■■■■■■■■■■■■■■■■■■■ '■■■   オペレータの新規/更新登録   ■■■  '■■■■■■■■■■■■■■■■■■■■■■■■ '----------------------------------------------------------- 'コネクションを作成 Dim CurrentDir As String = System.IO.Directory.GetCurrentDirectory() Dim cn As New OleDbConnection( _ "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & CurrentDir & "\operator.mdb" '**************** コマンドを作成 **************** Dim OPE As String Dim PWORD As String Dim HOSOKU As String Dim RANK As Integer OPE = オペレータ名.Text RANK = ランク.Text HOSOKU = 補足.Text PWORD = パスワード.Text Dim cmd As New OleDbCommand( "UPDATE table1 " & "SET ランク = ? " & "," & "パスワード = ? " & "," & "補足 = ? " & " WHERE オペレータ名 = ? ", cn) '************** パラメータを作成 **************** cmd.Parameters.Add("ランク", OleDbType.Integer).Value = RANK cmd.Parameters.Add("パスワード", OleDbType.Char).Value = PWORD cmd.Parameters.Add("補足", OleDbType.Char).Value = HOSOKU cmd.Parameters.Add("オペレータ名", OleDbType.Char).Value = OPE '実行 cn.Open() cmd.ExecuteNonQuery() '-------------------------- Dim COUNTC As Integer COUNTC = cmd.ExecuteNonQuery()   '************************************ elseの中に簡単に記載すのって難???*** If COUNTC > 0 Then MessageBox.Show("更新 完了")     Else 'INSERTの手順       ’★ ここにmdbの中に 項目値 OPE、RANK、HOSOKU、PWORDを挿入(追加)        する命令を入れたい。   '実行 cmd.ExecuteNonQuery() End If ’********************************** '-------------------------- cn.Close() End Sub

  • データ型が一致しない?

    エクセルのVBAでユーザーフォームから、アクセスのデータを取得して ユーザーフォームのテキストボックス、コンボボックスに取得させたデータ を表示させようとしています。 TextBox1に顧客IDを0001234のように7桁の数字を入力すると、アクセスの 「T_メイン」テーブルからIDが一致するレコードを取得して、フィールド「クライアント名」、 フィールド「営業所」、フィールド「担当者」のデータをテキストボックスや コンボボックスに表示させたいのです。 それで、以下のようなコードを記入しました。 Private Sub TextBox1_Change() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim SelCmd As String If Len(TextBox1.Value) = 7 Then Set cn = New ADODB.Connection cn.ConnectionString = "Provider=Microsoft.jet.OLEDB.4.0;" _ & "Data Source=D:\管理表.mdb" cn.Open SelCmd = "SELECT * FROM T_メイン " _ & "WHERE 顧客ID = " & TextBox1.text Set rs = New ADODB.Recordset rs.Open SelCmd, cn, adOpenKeyset, adLockOptimistic TextBox2.Value = rs!クライアント名 ComboBox2.Value = rs!営業所 ComboBox3.Value = rs!担当者 rs.Close Set rs = Nothing cn.Close Set cn = Nothing End If End Sub しかし、これを実行させると、 rs.Open SelCmd, cn, adOpenKeyset, adLockOptimistic の部分でエラーがでてしまいます。 「抽出条件でデータ型が一致しません」のエラーメッセージです。 アクセス側の顧客IDの部分はテキスト型ですし、TextBoxもテキスト ですから、一致しているのでないでしょうか? なぜなんでしょう? 参考書とかネットとか見様見真似でやってるので、ものすごく変な部分が あるのかもしれませんが、どうかご教授願います。

  • VB.netでパスワード変更

    下記のようなパスワードを変更するフォームをVB.netで作成したのですが、 実行すると、いつも異なるretValの値がかえってきて変更できません。 retValの値もよくわからない大きな数値がかえってくるのでどのようなエラーかも 判断つかず。 どこが間違っているかお分かりになる方いらっしゃいますでしょうか。 Public Class Form1 Private Declare Function NetUserChangePassword Lib "netapi32.dll" (ByVal Domain As String, ByVal User As String, ByVal OldPass As String, ByVal NewPass As String) As Long Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim retVal As Long Dim sDomain As String Dim sUser As String Dim sOldPass As String Dim sNewPass As String sDomain = "xxxxxxx" ←ここはサーバのIPアドレス sUser = TextBox1.Text sOldPass = TextBox2.Text sNewPass = TextBox3.Text retVal = NetUserChangePassword(sDomain, sUser, sOldPass, sNewPass) MsgBox(retVal) End Sub End Class

  • 【ADO】mdbのレコードの条件検索

    日付+特定のレコードの値が優のレコードをExcelのセルに表示するマクロを組んでいます。 Option Explicit Const cnsADO_CONNECT1 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" Dim dbCon As New ADODB.Connection Dim dbRes As New ADODB.Recordset Dim dbCols As ADODB.Fields Dim strStartData As String, strEndData As String Dim strsql As String Dim Gyo As Long Public Sub testテスト() 'テスト用 strStartData = 20120401 strEndData = 20130331 '接続mdb名 FileName = \\~~テスト.mdb dbCon.Open cnsADO_CONNECT1 & FileName strsql = "SELECT * FROM テーブル名 WHERE 日付 BETWEEN '" & strStartData & "' AND '" & strEndData & "' ORDER BY 日付"   dbRes.Open strsql, dbCon, adOpenKeyset, adLockReadOnly strsql = Replace(strsql, "strEndData", strEndData) strsql = Replace(strsql, "strStartData", strStartData) dbRes.Filter = "座学判定  = '優' or WHERE 実技判定  = '優' "   dbRes.Open strsql, dbCon, adOpenKeyset, adLockReadOnly ←ここでエラー Gyo = 1 Rows("2:65536").ClearContents dbRes.MoveFirst Do Until dbRes.EOF ' 行の変数を加算し必要項目を選択してセルにセット Gyo = Gyo + 1 Set dbCols = dbRes.Fields 'DT_P_点検Tblテーブルよりを抜き出す Cells(Gyo, 1).Value = dbCols("ID").Value Cells(Gyo, 2).Value = dbCols("日付").Value Cells(Gyo, 3).Value = dbCols("座学判定").Value Cells(Gyo, 4).Value = dbCols("実技判定").Value ' 次のレコードに移る dbRes.MoveNext Loop ' レコードセット、データベースを閉じる dbRes.Close Set dbRes = Nothing dbCon.Close Set dbCon = Nothing End Sub dbRes.Open strsql, dbCon, adOpenKeyset, adLockReadOnly の部分でエラーになってしまいます。 「CommandオブジェクトのCommandTextが設定されていません」と表示されます。 dbRes.Filter = "座学判定  = '優' or WHERE 実技判定  = '優' "   ここの部分が無ければ、指定の期間のデータを抽出してくれています。 指定期間 + 特定の部分がTrueの場合の抜き出しをしたいのですが、どこかで指定が不足しているのでしょうか?

  • VBのテキスト書き込み読み出し

    VB初心者です。 VBのテキスト書き込み読み出しについて質問させていただきます。 ~使用オブジェクト~ textbox1 textbox2 button1 button2 現在下記の通りtextbox1とtextbox2に書いた文字(length 10まで)をbutton1 clickで C:\test.txtに書き出し、 button2 clickでtextbox1 と textbox2に戻すプログラムを書いてみました。 読み込みのところが現在は2個ですが、実用的には膨大な数にしたいと思っています。 単純に沢山書けばいいのでしょうが現実的ではないのでスッキリと書く書き方はないでしょうか? さらに、例としてtextbox1にAさんの名前textbox2にAさんの年齢をいれたとします。 その際、Bさん以降を登録したいのですがその場合テキストへの書き込みを次行に書き込み 次行を読み込むにはどのように書けばよろしいでしょうか? ご教授お願い致します。 Public Class Form1 '##################################################### '"C:\test.txt"へ書き込み '##################################################### Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Dim write_data As New System.IO.StreamWriter("C:\test.txt", False, _ System.Text.Encoding.Default) Dim str As String Dim str1 As String str = String.Format("{0, -10}", TextBox1.Text) str1 = String.Format("{0, -10}", TextBox2.Text) write_data.Write(str & str1) write_data.Close() End Sub '##################################################### '"C:\test.txt"の読み込み '##################################################### Private Sub Button2_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button2.Click Dim Reader As New IO.StreamReader("C:\test.txt", System.Text.Encoding.GetEncoding("Shift-JIS")) While Reader.Peek() > -1 '10文字取得 Dim c(9) As Char Dim d(9) As Char Reader.ReadBlock(c, 0, c.Length) Reader.ReadBlock(d, 0, d.Length) TextBox1.Text = c TextBox2.Text = d End While Reader.Close() End Sub End Class

  • Vb2010にアクセスのデータを出力

    前回、似たような質問をさせて頂いたのですが、私の説明が悪く、解決には至らなかったので、再度練った説明で質問させていただきます。 ・visual basic 2010 設置コントロール TextBox1、TextBox2、TextBox3 Button1 ・アクセスのテーブル  ID(数字)、氏名(テキスト)、性別(テキスト) TextBox1にアクセスのID入力し、その横に設置したButtomを押したら、そのIDのデータ(名前、性別)がTextBox2,TextBox3に出力される、というプログラムを書き方のヒントを教えていただけないでしょうか。 Imports System.Data.OleDb Public Class Form1 Private Sub Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Enter '▼データの取得 Dim Cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Database\Animals.mdb") Dim SQLCm As OleDbCommand = Cn.CreateCommand Dim Adapter As New OleDbDataAdapter(SQLCm) Dim Table As New DataTable SQLCm.CommandText = "SELECT * FROM T_akusesu" Adapter.Fill(Table) '▼データの連結 textbox.DataBindings.Add("Text", Table, "名前") textbox2.DataBindings.Add("Text", Table, "性別") Table.Dispose() Adapter.Dispose() SQLCm.Dispose() Cn.Dispose() End Sub End Class また、Buttonのイベントには何を書くべきなのでしょうか? 以上、よろしくお願い致します。

  • Excel VBA : Accessのデータを検索

    Excel VBA を使って、Accessのデータを検索したい。 除外テーブルには「管理ID」レコードが在り、ユニークな番号を登録してあります。 やりたいことは、除外テーブルの管理IDに在るであろう、"E003"の有無を確認したいと思います。 作ってみたソースコードは、以下の通り。 Private Sub aSearch_Click() DB.TableOpen ("db_name.mdb") 'Accessのファイル DB.FindRecode ("E003")  ' 検索対象文字列 DB.TableClose End Sub ------------------------------ここから、標準モジュール Public adoCn As ADODB.Connection Public adoRs As ADODB.Recordset Public fSql As String Public fRow As Integer 'データ ソースへの接続と、レコードセットへの接続 Sub TableOpen(ByVal mdb_name As String) Set adoCn = New ADODB.Connection 'データ ソースへの接続 adoCn.Provider = "Microsoft.Jet.OLEDB.4.0" 'Accessへ接続プロバイダ名 adoCn.Open mdb_name '接続するmdbファイル名" fSql = "select 管理ID from 除外テーブル" Set adoRs = New ADODB.Recordset 'レコードセットへの接続 adoRs.Open fSql, adoCn, adOpenKeyset, adLockReadOnly 'クエリーの実行 ' adoRs.Open "除外テーブル", adoCn, adOpenKeyset, adLockReadOnly 'クエリーの実行 End Sub 'レコード(管理ID)の検索 Function FindRecode(ByVal findName As String) As String adoRs.Find adoRs.Fields("管理ID") & "=" & findName     '← ここでエラーとなる  If adoRs.RecordCount = 0 Then MsgBox "該当するレコードは存在しません" FindRecode = "" Exit Function Else Do     ' Doループは、要らないかも??? Debug.Print adoRs.Fields("管理ID") & "/" & adoRs.Fields("登録日") adoRs.MoveNext Loop Until adoRs.EOF End If FindRecode = adoRs.Fields("管理ID") End Function 'データ ソースへの接続と、レコードセットを切断する Sub TableClose() adoRs.Close 'クエリーを閉じる adoCn.Close 'データ接続を閉じる Set adoRs = Nothing Set adoCn = Nothing End Sub ------------- ここまで データのソースから、検索する方法が良く判っておらず、Open / find の使い方はこれで良いのでしょうか。 以上、よろしくお願いします。

専門家に質問してみよう