.NET Framework アプリケーションのデータセットのクエリを実行する

Note

データセットと関連クラスは、アプリケーションがデータベースから切断されている間にアプリケーションがメモリ内のデータを操作できるようにする、2000 年代初期からのレガシ .NET Framework テクノロジです。 これらが特に役立つのは、ユーザーがデータを変更し、変更をデータベースに戻して保持できるようにするアプリケーションです。 データセットは非常に優れたテクノロジであることが証明されていますが、新しい .NET アプリケーションでは Entity Framework Core を使用することをお勧めしています。 Entity Framework には、オブジェクト モデルとして表形式データを操作する、より自然な方法が用意されており、よりシンプルなプログラミング インターフェイスが備わっています。

データセット内の特定のレコードを検索するには、DataTable に対して FindBy メソッドを使用し、テーブルの Rows コレクションをループ処理する独自の foreach ステートメントを記述するか、LINQ to DataSet を使用します。

データセットの大文字と小文字の区別

データセット内では、テーブルと列の名前は既定で大文字と小文字が区別されません。つまり、データセット内の "Customers" というテーブルは "customers" と呼ぶこともできます。これは、SQL Server を含む多くのデータベースの名前付け規則と同じです。 SQL Server の既定の動作では、データ要素の名前を大文字と小文字のみで区別することはできません。

注意

データセットとは異なり、XML ドキュメントでは大文字と小文字が区別されるため、スキーマに定義されているデータ要素の名前は大文字と小文字が区別されます。 たとえば、スキーマ プロトコルでは、Customers という名前のテーブルと customers という別のテーブルを定義できます。 これにより、大文字と小文字のみが異なる要素を含むスキーマを使用して、データセット クラスが生成される際に、名前の競合が発生する可能性があります。

ただし、大文字と小文字の区別は、データセット内でのデータの解釈方法の要因になることがあります。 たとえば、データセット テーブル内のデータをフィルター処理する場合、比較で大文字と小文字が区別されるかどうかによって、検索条件で異なる結果が返されることがあります。 フィルター処理、検索、および並べ替えの大文字と小文字の区別を制御するには、データセットの CaseSensitive プロパティを設定します。 データセット内のすべてのテーブルは、既定でこのプロパティの値を継承します。 (個々のテーブルごとにこのプロパティをオーバーライドするには、テーブルの CaseSensitive プロパティを設定します。)

データ テーブル内の特定の行を検索する

主キー値を使用して型指定されたデータセット内の行を検索するには

  • 行を検索するには、テーブルの主キーを使用する厳密に型指定された FindBy メソッドを呼び出します。

    次の例では、CustomerID 列が Customers テーブルの主キーです。 これは、生成された FindBy メソッドが FindByCustomerID であることを意味します。 例では、生成された FindBy メソッドを使用して、特定の DataRow を変数に割り当てる方法を示します。

    NorthwindDataSet.CustomersRow customersRow = 
        northwindDataSet1.Customers.FindByCustomerID("ALFKI");
    

主キー値を含む型指定されていないデータセット内の行を検索するには

  • DataRowCollection コレクションの Find メソッドを呼び出し、主キーをパラメーターとして渡します。

    次の例は、foundRow という新しい行を宣言し、それに、Find メソッドの戻り値を割り当てる方法を示しています。 主キーが見つかった場合、列インデックス 1 の内容がメッセージ ボックスに表示されます。

    string s = "primaryKeyValue";
    DataRow foundRow = dataSet1.Tables["AnyTable"].Rows.Find(s);
    
    if (foundRow != null) 
    {
        MessageBox.Show(foundRow[0].ToString());
    }
    else
    {
        MessageBox.Show("A row with the primary key of " + s + " could not be found");
    }
    

列の値で行を検索する

任意の列の値に基づいて行を検索するには

  • データ テーブルは、Select メソッドを使用して作成されます。このメソッドは、Select メソッドに渡された式に基づいて DataRow の配列を返します。 有効な式の作成の詳細については、Expression プロパティに関するページの「式の構文」セクションを参照してください。

    次の例は、DataTableSelect メソッドを使用して、特定の行を見つける方法を示しています。

    DataRow[] foundRows;
    foundRows = dataSet1.Tables["Customers"].Select("CompanyName Like 'A%'");
    

データセット内のテーブルが関連付けられている場合、DataRelation オブジェクトによって、関連するレコードを別のテーブルで使用できるようにすることができます。 たとえば、Customers テーブルと Orders テーブルを含むデータセットを使用できるようにすることができます。

DataRelation オブジェクトを使用して、親テーブルで DataRowGetChildRows メソッドを呼び出すことによって、関連するレコードを検索できます。 このメソッドによって、関連する子レコードの配列が返されます。 または、子テーブルで、DataRowGetParentRow メソッドを呼び出すことができます。 このメソッドによって、親テーブルから単一の DataRow が返されます。

このページでは、型指定されたデータセットを使用する例を示します。 型指定されていないデータセット内のリレーションシップの移動については、「DataRelation の移動」を参照してください。

Note

Windows フォーム アプリケーションで作業していて、データバインディング機能を使用してデータを表示している場合は、デザイナーで生成されたフォームによって、アプリケーションに十分な機能を提供できます。 詳細については、「Visual Studio でのデータへのコントロールのバインド」を参照してください。 具体的には、データセット内のリレーションシップに関するページを参照してください。

次のコード例は、型指定されたデータセット内のリレーションシップを上下に移動する方法を示しています。 このコード例では、型指定された DataRow (NorthwindDataSet.OrdersRow) および生成された FindByPrimaryKey (FindByCustomerID) メソッドを使用して目的の行を検索し、関連レコードを返しています。 例では、次のものがある場合にのみ、正しくコンパイルされて実行されます。

  • Customers テーブルのある NorthwindDataSet という名前のデータセットのインスタンス。

  • Orders テーブル。

  • 2 つのテーブルを関連付ける FK_Orders_Customers という名前のリレーションシップ。

また、両方のテーブルに、返されるすべてのレコードのデータが格納される必要があります。

選択した親レコードの子レコードを返すには

  • 特定の Customers データ行の GetChildRows メソッドを呼び出し、Orders テーブルから行の配列を返します。

    string custID = "ALFKI";
    NorthwindDataSet.OrdersRow[] orders;
    
    orders = (NorthwindDataSet.OrdersRow[])northwindDataSet.Customers.
        FindByCustomerID(custID).GetChildRows("FK_Orders_Customers");
    
    MessageBox.Show(orders.Length.ToString());
    

選択した子レコードの親レコードを返すには

  • 特定の Orders データ行の GetParentRow メソッドを呼び出し、Customers テーブルから単一の行を返します。

    int orderID = 10707;
    NorthwindDataSet.CustomersRow customer;
    
    customer = (NorthwindDataSet.CustomersRow)northwindDataSet.Orders.
        FindByOrderID(orderID).GetParentRow("FK_Orders_Customers");
    
    MessageBox.Show(customer.CompanyName);