次の方法で共有


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

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

データセット内の特定のレコードを検索するには、DataTable で FindBy メソッドを使用するか、独自の foreach ステートメントを記述してテーブルの Rows コレクションをループ処理するか、 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 テーブルを含むデータセットを使用できます。

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

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

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 テーブルから 1 つの行を返します。

    int orderID = 10707;
    NorthwindDataSet.CustomersRow customer;
    
    customer = (NorthwindDataSet.CustomersRow)northwindDataSet.Orders.
        FindByOrderID(orderID).GetParentRow("FK_Orders_Customers");
    
    MessageBox.Show(customer.CompanyName);
    
  • Visual Studio のデータセットツール