• ベストアンサー

VB2005とADO.NETを使った時のSELECT文の書き方で分らないことがあり困っています

VB2005とADO.NETを本で勉強中の超初心者です。本のサンプルを参考に以下のようなコ-ドを作って動作させるとDataGridViewにDBの内容が正しく表示されますが、 Dim cn As New OleDbConnection cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=C:\VB2005\Order.mdb" Dim da As OleDbDataAdapter da = New OleDbDataAdapter("SELECT * FROM Goods;", cn) Dim ds As New DataSet da.Fill(ds, "Goods") DataGridView1.DataSource = ds.Tables("Good 特定のコ-ドをFormのテキストボックスから入力して、表示させたいと思い"SELECT * FROM Goods WHERE GoodsId = TextBox1.Text;"とするとエラ-になってしまいました。ちなみに"SELECT * FROM Goods WHERE GoodsId = 'A0001';として動作させるとA0001だけを表示することはできました。 どのようにすればテキストボックスや変数で、表示したいコ-ドを指定したら良いか教えて頂けないでしょうか。

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

"SELECT * FROM Goods WHERE GoodsId = TextBox1.Text;" "SELECT * FROM Goods WHERE GoodsId = 'A0001';" とで何が違うのかよく考えて見ましょう 『"SELECT * FROM Goods WHERE GoodsId = 』までは同じですよね "SELECT * FROM Goods WHERE GoodsId = TextBox1.Text;" ですと GoodsIdが『TextBox1.Text』というMDBが理解できる何かと一致しないといけません TextBox1.Textを知っているのはVB側でありMDB側ではありません "SELECT * FROM Goods WHERE GoodsId = 'A0001';" の場合は GoodsIdが『A0001』という文字列のレコードを取得します となると "SELECT * FROM Goods WHERE GoodsId = '検索対象';" とすれば良いようです 前半部分は"SELECT * FROM Goods WHERE GoodsId = '" 検索対象を TextBox1.Text 末尾を"';" として文字列を連結してやれば良いでしょう 結果として "SELECT * FROM Goods WHERE GoodsId = '" & TextBox1.Text & "';" で期待する結果が得られそうです

SIPPOPAPA
質問者

お礼

分り易く回答して頂きありがとうございました。 教えて頂いたとおりに直して、希望する結果が得られました。

その他の回答 (1)

noname#259269
noname#259269
回答No.1

変数について学習するとよいでしょう。 「"」で囲んだ文字は、純粋に文字列として認識されます。つまり「"」と「"」の間に TextBox1.Text と書いても当然それは、「TextBox1.Text」という文字列を指定しているだけで、TextBox1 の Text プロパティの値を取り出している事にはなりません。 文字列の連結には & か + を使います。つまり "SELECT ~ GoodsId = '" + TextBox1.Text + "'" といった感じです。

SIPPOPAPA
質問者

お礼

回答ありがとうござました。 メッセ-ジボックスで文字列の間に変数の値を表示する時に 使っていた方法と、今回の内容とが結びつかなかったのは まだ基本的なことが分っていないと痛感しました。 教えて頂いた内容で希望通りの結果が得られました。

関連するQ&A

  • VB2008でMDBのオ-トナンバの項目をキ-にして読み込めなくて困っています

    VB2008とADO.NETを勉強中の超初心者です。 MDBのオ-トナンバの項目をキ-にして、読み込みたいと思って以下のようなプログラムを作ってみました。 Dim yobidashikey As Int32 = 1 Dim cn As New OleDbConnection cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=C:\VB2005\KEYCHECK.mdb" Dim da As OleDbDataAdapter 'da = New OleDbDataAdapter("SELECT * FROM data WHERE key1 = 2", cn) da = New OleDbDataAdapter("SELECT * FROM data WHERE key1 = '" & yobidashikey & "'", cn) Dim ds As New DataSet da.Fill(ds, "data") DataGridView1.DataSource = ds.Tables("data") コメントアウトしてある直接「2」を指定した時は、デ-タグリッドビュ-にオ-トナンバが2の行が表示できました。 次に、yobidashikeyにオ-トナンバの値を入れて動作させると、da.Fill(ds, "data")で「抽出条件でデータ型が一致しません。」のエラ-が出てしまいました。 ちなみに、Dim yobidashikey As Int32 としたのは、DRead.GetFieldType(i).ToString()でオ-トナンバの項目がInt32と 表示されたので、この型にしました。 実際にオ-トナンバをキイ-にして読み込むシステムを作りたいので、是非教えて頂きたいと思います。 よろしくお願いします。

  • ADO.NETのDataSetのコピー

    ADO.NETでsdfファイルからmdbファイルへテーブル(TBL1)を移行させたいと思っています。 以下のようなコードでDataSetをコピーできないか試しましたが、移行できません。 sdf、mdbともテーブルのカラムの構造は同一です。 mdbの方にはレコードが空のテーブルが用意してあります。 何が間違っているのでしょうか?お教えいただけると助かります。 SDF Dim con As SqlCeConnection = DBUtility.GetConnection() con.Open() Dim strSQL As String strSQL = "select * from TBL1" Dim adapter As SqlCeDataAdapter = _ New SqlCeDataAdapter(New SqlCeCommand(strSQL, con)) con.Close() Dim ds1 As DataSet = New DataSet() adapter.Fill(ds1, "TBL1") Dim con2 As OleDbConnection = DBUtility.GetOLEConnection() con2.Open() 'MDB Dim strSQL2 As String strSQL2 = "select * from TBL1" Dim adapter2 As OleDbDataAdapter = _ New OleDbDataAdapter(New OleDbCommand(strSQL2, con2)) Dim ds2 As DataSet = New DataSet() ds2 = ds1.Copy Dim cb As OleDbCommandBuilder = New OleDbCommandBuilder(adapter2) adapter2.Update(ds2, "TBL1")

  • 【VB】データグリッドに読み込んだテーブルの変更を元のデータベースに反映させたい

    VB歴6ヶ月です。 VBのバージョンは2005です。 mdbから読み込んだデータベースをデータグリッドビューコントロールで表示しました。 CNには接続パスが入っていてmdbとの接続は確立しています。 データグリッドビューコントロールのオブジェクト名はDGVです。 読み込むテーブル名はt社員マスターです。 Private sub メンテナンス() Dim DS As DataSet = New DataSet("社員マスター") Dim SQL As String = "SELECT * FROM t社員マスター" Dim DA As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(SQL, CN) DA.Fill(DS, "社員マスター") Dim DV As DataView = New DataView(DS.Tables("社員マスター")) DGV.DataSource = DV End sub これでグリッドに読み込ますことはできたのですが、 読み込んだデータをグリッド上で変更したら元のデータベースにも反映したいのですが やり方がわかりません >< 具体的なコード、やり方を教えていただけたらありがたいです。

  • DataSetの使い方が分らず困っています

    VB2008とADO.NETを勉強中の初心者です。 DataSetに読み込んであるデ-タをクリアしたいと思ってるのですが、方法が分らず困っています。 最終目標のプログラムでは、製品のコ-ドを指定して、その製品を造るために必要な部品・材料を買うプログラムを作りたいと思っています。 そのための勉強として、Form1のTextBoxから製品コ-ドを入力して、"Seihinkousei"に登録してある部品・材料を読み込むプログラムを作成しました。 Dim cn As New OleDbConnection cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=C:\MAPICAS\MAPICAS-S.mdb" Dim da As OleDbDataAdapter 'DataAdapterの作成 da = New OleDbDataAdapter("SELECT * FROM Seihinkousei WHERE Se_Hinban = '" & TextBox1.Text & "'", cn) da.Fill(DataSet1, "Seihinkousei") DataGridView1.DataSource = DataSet1.Tables("Seihinkousei") 複数回、TextBoxから製品コ-ドを入力してDataGridViewに表示してみると、いままで読み込んでデ-タが、その都度すべて表示されてしまいます。 最終目標のプログラムでは、読込の処理をFunctionにして、どのPrivate SubからでもDataSetの内容を参照したいと思っています。 そのため、DataSetを使い、且つ前回読み込んで内容はクリアして、その都度指定した製品の部品・材料だけの情報にしたいと思っています。 ご教授よろしくお願いします。

  • アクセスDbのテーブル項目属性の取得(VB2005)

    ご協力いただき、table名 field名までは取得できたのですが、種々プロパティを試していますが、fieldの「桁数」「タイプ」がどうしても取得できません。DAoでは .size .type だったのですが。 この部分接続など略(800文字とのことなので) Cn.Open() Dim S As String Dim tbl As DataTable Dim myRows() As DataRow tbl = Cn.GetOleDbSchemaTable(OleDb.OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"}) Dim I As Short myRows = tbl.Select() 'S = myRows(1).ItemArray(2) Dim ds As New DataSet For Each row As DataRow In myRows 'MsgBox(row.ItemArray(2)) Dim cmd As New OleDb.OleDbCommand("SELECT * From " + row.ItemArray(2), Cn) Dim dr As OleDb.OleDbDataReader = cmd.ExecuteReader Dim da As New OleDb.OleDbDataAdapter("SELECT * From " + row.ItemArray(2), Cn) da.Fill(ds, row.ItemArray(2)) For I = 0 To dr.FieldCount - 1 S = dr.GetName(I) 'Field name S = ds.Tables(0).Columns(I).ColumnName          この2行は同じものがとれます。 tables columns gettypeなど どれもうまく取得できませんでした。 よろしくご教示ください。

  • ADO.NETのOleDbAdapterに設定するSelect文

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=1345496に関連して・・・ テーブル名:項目名 部屋:科目、部屋 教科書:科目、値段 上記のようなテーブルがあり、以下のようなSelect文によりデータを データセットに取得したいのですが、 コンパイルは通り、実行するとFillメソッドでエラーになります。 try~catchをしてエラーの内容を見てみると「FROM句の構文エラー」と出ています。 Fillメソッドの2つめのパラメータにどちらのテーブル名を入れても、 同じエラーになります。 UNION句でつないだSelect文をAdapterに設定した場合、 2つ目のパラメータは一体なんなのでしょうか。 Fillメソッドのパラメータがおかしいのでなければ、 SELECT文のどこがおかしいでしょうか。 教えてください。よろしくお願いいたします。 ---------------------------------------------------------------- Dim oleCn As OleDb.OleDbConnection = New OleDb.OleDbConnection Dim dataSet = New DataSet oleCn.ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0;"~ Dim oDataAdapter As New OleDb.OleDbDataAdapter("SELECT 科目 FROM 部屋" & _ "UNION SELECT 科目 FROM 教科書 WHERE (値段 > 1000)", oleCn) oDataAdapter.Fill(dataSet)

  • デ-タテ-ブルの内容での更新の書き方が分らず困っています

    VB2008とADO.NETを勉強中の初心者です。 以下のようなプログラムで、デ-タテ-ブルの内容を変更後(このプログラムでは削除のみですが、追加の処理もやりたいと思っています)"SYOYOURYOU"を更新して、再度読み込みたいと思っています。 いろいろ、参考書等を見たのですが旨く処理できません。 *DBを再読み込みのために更新* の部分での記述の方法を教えて頂けないでしょうか。 よろしくお願いします。 '*LLCの初期化 Dim LLC As Integer = 0 Dim cn As New OleDbConnection cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=C:\MAPICS\MAPICS-S.mdb" Dim da As OleDbDataAdapter 'DataAdapterの作成 '*LLCを 0 から 10 まで処理 For LLC = 0 To 10 '所要量抽出 'DataAdapterの作成 da = New OleDbDataAdapter("SELECT * FROM SYOYOURYOU WHERE Syo_LLC =" & Str(LLC), cn) 'データを取得 Dim ds As New DataSet da.Fill(ds, "SYOYOURYOU") If ds.Tables("SYOYOURYOU").Rows.Count > 0 Then 'DataGridViewに表示 DataGridView1.DataSource = ds.Tables("SYOYOURYOU") MsgBox("確認1") For i = 0 To ds.Tables("SYOYOURYOU").Rows.Count - 1 'SYOYOURYOUをもとに処理を行う(この部分は省略) '処理済みのSYOYOURYOUのデ-タを削除 Dim dr As DataRow dr = ds.Tables("SYOYOURYOU").Rows(i) dr.Delete() 'DataGridViewに表示 DataGridView1.DataSource = ds.Tables("SYOYOURYOU") MsgBox("確認1") Next '***************************** 'DBを再読み込みのために更新 '***************************** End If Next '終了処理 End

  • .NET MDBデータベース更新について質問です

    DataGridViewで表示するところまでできたのですが DataGridView上で編集したものを更新ボタンで MDBデータベースに上書き保存という形で 行いたいのですがいろいろ調べてもわかりませんでした。 VBを初めて日が浅いのでこつこつ勉強中なのですが 業務上の都合でDBの作成を行っています。 基本的に書き直したもの 'データベース取得 Dim Cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=保存場所" ) Dim Cm As OleDbCommand = Cn.CreateCommand Dim Adapter As New OleDbDataAdapter(Cm) Dim Table As New DataTable Cn.Open() Cm.CommandText = "SELECT * FROM Aテーブル" Adapter.Fill(Table) DataGridView1.DataSource = Table DBにはこのように接続しております。 ここまでも手探りで行ったので熟練の方から見ればへんかもしれませんが指導おねがいします。

  • vb.net で ADO でアクセスのテーブル

    アクセスのテーブルのレコードの数を取得したいのですが コードがわからないので続きを教えていただけますか? Imports System.Data.OleDb Sub test() Dim oleConn As OleDbConnection Dim oleCmd As OleDbCommand Dim oleAdp As OleDbDataAdapter oleConn = New OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0;" & "Data Source=C:\Database1.accdb;") oleCmd = oleConn.CreateCommand() oleCmd.CommandText = "SELECT * FROM テーブル1" oleAdp = New OleDbDataAdapter(oleCmd) 'MsgBox oleCmd.??? End Sub までできたのですが、ここからどうすれば数を取得できますか?

  • ADO.NETのデータベースについて

     こんにちは。いつもお世話になっております。  プログラミングの初心者で、現在VC++でプログラムを作成しています。環境は、OSがWindowsXP、統合環境はVisualStudio2008 Professionalを使用しています.  ADO.NETでデータベースを作成しているのですが、DataSetを介して、任意のフィールドを変更・更新がうまくいきません。プログラムの内容は、保存されているAccessデータから表を読み込み、その表に対して挿入、変更、削除を行い、最後にupdateをしてAccessのデータを更新するというものです。以下、プログラムの一部を抜粋します。拙い説明で申し訳ありません。原因が分かる方、よろしくご教授ください。 m(_)m private: bool LoadAccessFile(String^ path) { // コネクションを作成 OleDbConnection^ cn = gcnew OleDbConnection(); cn->ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" "Data Source=" + path; // すべてのデータを読み込む OleDbDataAdapter^ da = gcnew OleDbDataAdapter("select * from 実績テーブル", cn); OleDbDataAdapter^ da2 = gcnew OleDbDataAdapter("select * from クエリ1", cn); OleDbCommandBuilder^ builder = gcnew OleDbCommandBuilder(da); //test OleDbCommand^ selectCommand = cn->CreateCommand(); OleDbCommand^ selectCommand2 = cn->CreateCommand(); OleDbCommand^ insertCommand = cn->CreateCommand(); OleDbCommand^ updateCommand = cn->CreateCommand(); OleDbCommand^ deleteCommand = cn->CreateCommand(); selectCommand->CommandText = "select 通し番号, 日付, 内容, 金額, カテゴリー番号, 銀行口座通し番号 from 実績テーブル where 通し番号=2"; selectCommand2->CommandText = "select 通し番号, 日付, 内容, 金額, カテゴリー名称, 銀行口座口座名称 from クエリ1"; insertCommand->CommandText = "insert into 実績テーブル (通し番号, 日付, 内容, 金額, カテゴリー番号, 銀行口座通し番号) values (@通し番号, @日付, @内容, @金額, @カテゴリー番号, @銀行口座通し番号)";      (中略) // OleDbDataAdapterのスキーマと、SelectCommandで抽出したデータを格納 da->FillSchema(ds, System::Data::SchemaType::Mapped); da->Fill(ds->Tables["Table"]); // "Table"表の2行3列目のデータを変更 ds->Tables->Add("クエリ1"); //test(090223) DataRow^ row = ds->Tables["Table"]->Rows[1]; //Rows[0]の添え字を0以外にするとエラー。「位置1に行がありません」 DataColumn^ column = ds->Tables["Table"]->Columns[2]; row[column] = "本"; // "Table"表の0行目を削除 ds->Tables["Table"]->Rows[0]->Delete(); //Rows[0]の添え字を0以外にするとエラー。「位置1に行がありません」

専門家に質問してみよう