none
Visual Studio 2017 VB からAcsessデータを検索したい RRS feed

  • 質問

  • Visual Studio
    2017でVBのWindowsアプリを作り
    フォームのテキストボックスに文字入力をしてその文字のレコードを
    アクセスのデータベースから検索して表示,編集したでーたを上書きしたいと考えています。

    今のところ下記のようなことは試してみましたが特定のレコードを表示するには至っていません。

    フォームを作成後
    表示→その他のウィンドウ→データソース
    データソールウィンドウの新しいデータソースの追加
    データベースを選択
    データセット
    新しい接続で参照からAccessのファイルを選択
    データベースオブジェクトの選択で使用するテーブルの項目を
    指定
    データソースからフォームに表示させる項目をドラッグ
    フォームデザインのTableAdapterから「クエリーの追加」
    クエリービルダーでフィルターで検索したい文字を設定
    Form1_Loadのコード内の
    TableAdapter.Fill(アクセスファイル)
    をTableAdapter.FillBy(アクセスファイル)
    に変更して検索したいデータのみをフォームに表示することは
    できましたが。

    検索したい文字列を他のフォームのテキストボックスに入力して
    変更できればいいようにおもうのですが
    (クエリビルダーのフィルターにフォームのテクストボックスデータを指定?)
    どのようにしたらいいでしょうか?
    よろしくお願いします。
    2019年2月8日 0:45

回答

  • フォームデザインのTableAdapterから「クエリーの追加」

    ここにWhere句を書かれましたか?
    (例)
    select * from テーブル
    where 名前 = ? and 年齢 = ?

    Accessの場合、Where句のパラメータに名前を付けることができません。
    パラメータの順序でどのパラメータかを判断します。

    上記で作成されたTableAdapterを右クリックして「データのプレビュー」という画面を開けば、その画面で上記で定義したパラメータに値をセットして実際にどのようのなデータが抽出されるのかを確認することができます。

    こうやって定義すれば、
    TableAdapter.Fill(データを読み込むためのデータテーブル, パラメータ1, パラメータ2)
    というメソッドが生成されますので、テキストボックスに入力された値をパラメータにセットして実行すれば抽出結果が「
    データを読み込むためのデータテーブル」に格納されます。


    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    • 回答としてマーク Xe_Nakano 2019年2月8日 6:55
    2019年2月8日 1:54
    モデレータ

すべての返信

  • Visual Studio の TableAdapter 構成ウィザードを使って以下の画像のようなアプリを作ったと思いますが、その理解で良いですか?

    (注:赤枠の中に示した TextBox と Button は後から自分で追加したものです。DB は Access ではなく、Northwind の Products テーブルを利用しています)



    であれば、

    > Form1_Loadのコード内のTableAdapter.Fill(アクセスファイル)をTableAdapter.FillBy(アクセスファイル)に変更して検索したいデータのみをフォームに表示することはできましたが。

    ・・・ということをするより、TableAdapter.Fill で取得した DataTable から  DataView を取得して、その RowFilter プロパティに検索条件を設定してはいかがですか?

    コードは以下のような感じです。(C# が読めなければ変換サービスを使ってください)

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form3 : Form
        {
            public Form3()
            {
                InitializeComponent();
            }
    
            private void productsBindingNavigatorSaveItem_Click(object sender, EventArgs e)
            {
                this.Validate();
                this.productsBindingSource.EndEdit();
                this.tableAdapterManager.UpdateAll(this.northwindDataSet);
            }
    
            private void Form3_Load(object sender, EventArgs e)
            {
                // TODO: このコード行はデータを 'northwindDataSet.Products' テーブルに読み込みます。
                // 必要に応じて移動、または削除をしてください。
                this.productsTableAdapter.Fill(this.northwindDataSet.Products);
            }
    
            // 上のコードまではデザイナで自動生成される
    
            // 検索用の TextBox と Button を追加し、Button の Click イベントのハンドラを以下のようにする。
    
            private void button1_Click(object sender, EventArgs e)
            {
                if (!String.IsNullOrEmpty(this.textBox1.Text))
                {
                    NorthwindDataSet.ProductsDataTable table = this.northwindDataSet.Products;
    
                    //NorthwindDataSet.ProductsRow[] rows = (NorthwindDataSet.ProductsRow[])table.Select("ProductName LIKE '%" + this.textBox1.Text + "%'");
                    //this.productsBindingSource.DataSource = rows;
    
                    // 上記のように NorthwindDataSet.ProductsRow[] を DataSource に設定した場合は
                    // ProductsRow クラスに定義されているプロパティの get アクセサを使って
                    // ProductsDataTable からデータを取得するので、そのデータが DBNull の場合キャスト
                    // に失敗して StrongTypingException がスローされるので注意。
    
                    // 以下のように DataView を取得して、その RowFilter プロパティに設定するのが正解。
    
                    table.DefaultView.RowFilter = "ProductName LIKE '%" + this.textBox1.Text + "%'";
                    this.productsBindingSource.DataSource = this.northwindDataSet.Products;
                }
                else
                {
                    // 元に戻す場合
                    NorthwindDataSet.ProductsDataTable table = this.northwindDataSet.Products;
                    table.DefaultView.RowFilter = "";
    
                    // このコードは無くても OK
                    //this.productsBindingSource.DataSource = this.northwindDataSet.Products;
                }
            }
        }
    }

    検索すると以下のようになります。



    それができれば、

    > 検索したい文字列を他のフォームのテキストボックスに入力して変更できればいいようにおもうのですが

    ・・・も容易に可能だと思います。

    2019年2月8日 1:40
  • フォームデザインのTableAdapterから「クエリーの追加」

    ここにWhere句を書かれましたか?
    (例)
    select * from テーブル
    where 名前 = ? and 年齢 = ?

    Accessの場合、Where句のパラメータに名前を付けることができません。
    パラメータの順序でどのパラメータかを判断します。

    上記で作成されたTableAdapterを右クリックして「データのプレビュー」という画面を開けば、その画面で上記で定義したパラメータに値をセットして実際にどのようのなデータが抽出されるのかを確認することができます。

    こうやって定義すれば、
    TableAdapter.Fill(データを読み込むためのデータテーブル, パラメータ1, パラメータ2)
    というメソッドが生成されますので、テキストボックスに入力された値をパラメータにセットして実行すれば抽出結果が「
    データを読み込むためのデータテーブル」に格納されます。


    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    • 回答としてマーク Xe_Nakano 2019年2月8日 6:55
    2019年2月8日 1:54
    モデレータ
  • ありがとうございました。

    だいたい思ったような動作になりました。

    Where句に  = ? でパラメータにできること知りませんでした。

    2019年2月8日 6:58