方法: データセットを結合するためのヘルパー クラス視覚 C# で.NET

文書翻訳 文書翻訳
文書番号: 326080
すべて展開する | すべて折りたたむ

目次

概要

この資料でを実装および使用する方法について説明します。 DataSetHelper 作成するサンプル コードを含むクラスは、 データ テーブル オブジェクトの 2 つ以上の関連から データ テーブル 定義し、並べ替えおよびフィルターのソースからのレコードをコピーする データ テーブル 先のオブジェクト データ テーブル.

これを行うには、次のパブリック メソッドを使用します。
  • CreateJoinTable
  • InsertJoinInto
  • SelectJoinInto
は、 SelectJoinInto メソッドの呼び出しは、 CreateJoinTable および InsertJoinInto 方法があります。解析対象のフィールド リストを格納するのには、プライベート ヘルパー メソッドとデータ メンバーを使用することもできます。

は、 DataSetHelper クラスが含まれています、 データセット メンバー変数です。必要に応じて、既存の割り当てることができます。 データセット するには データセット メンバー変数です。メンバー変数は、有効な指定されている場合 データセット、、 データ テーブル オブジェクトが CreateJoinTable または、 SelectJoinInto メソッドを作成するのに追加されます、 データセット.どちらの場合も、メソッドの呼び出しへの参照を返しますが データ テーブル オブジェクトです。は、 InsertJoinInto 既存のターゲット メソッドする必要があります。 データ テーブル 何も返されません。

詳細については データセット オブジェクトは、Microsoft Knowledge Base の資料を参照するのには、次の文書番号をクリックしてください。
313485 情報: ADO ロードマップ。NET の DataSet、DataView、DataViewManager

要件

次一覧は、推奨されるハードウェア、ソフトウェア、ネットワークインフラストラクチャ、および service pack は必要です。
  • Microsoft Windows XP、Windows 2000、または Windows NT 4.0 Service Pack 6a
  • マイクロソフトの Visual Studio。NET
この資料では、次のトピックに精通しているを前提としています。
  • Visual C#。NET の構文
  • ADO.NET の基本事項と構文

シェルの DataSetHelper クラス

このセクションのコードでは、シェル クラスにすべてを宣言します。 DataSetHelper 記事のメソッドとメンバー変数を追加します。
  1. Visual Studio を起動します。NET。
  2. で、 ファイル メニューのポイント 新しい、し プロジェクト.
  3. で、 新しいプロジェクト ダイアログ ボックス、クリックして Visual C# プロジェクト 下にあります。 [プロジェクトの種類、し クラス ライブラリ 下にあります。 テンプレート.
  4. で、 名前 ボックスの種類 DataSetHelper.
  5. クラスのコードを次のコードで置き換えます。
    public class DataSetHelper
    {
        public DataSet ds;
    
        public DataSetHelper(ref DataSet DataSet)
        {
    	ds = DataSet;
        }
        public DataSetHelper()
        {
    	ds = null;
        }
    }
    					
    有効な参照の有無、クラスのインスタンスを作成するのには、2 つのオーバー ロード コンス トラクターを使用できます。 データセット.有効な参照を含むクラス データセット、、 データ テーブル メソッドが返すオブジェクトに自動的に追加されても、 データセット.

フィールド リスト パーサー

ここには、フィールド リスト パーサーのコードが含まれます。解析対象の構造が使用されますので、 CreateJoinTable および InsertJoinInto フィールド リストを再解析する方法はありません。これらのメソッドから呼び出されない場合は、フィールド リストを解析する必要があります、 SelectJoinInto メソッドまたは独自のコードから。解析対象のフィールド リストおよび未解析のフィールド] ボックスの一覧に格納されています。 プライベート メンバー変数は、 DataSetHelper クラスです。
  1. 次を追加します。 プライベート クラスの定義では、 DataSetHelper 作成したクラスは、""セクション。
    private class FieldInfo
    {
        public string RelationName;
        public string FieldName;	//source table field name
        public string FieldAlias;	//destination table field name
        public string Aggregate;
    }
    					
    メモ: このクラスは互いに共通です。 DataSetHelper 記事し、は、この資料で使用されないフィールドが含まれています。

  2. 次を追加します。 プライベート メンバー変数をクラス定義の直後後に データセット 宣言:
    private System.Collections.ArrayList m_FieldInfo; private string m_FieldList; 
    					
  3. 次を追加します。 プライベート クラス定義にメソッド。このメソッドは他のために使用されるメソッドと同じです。 DataSetHelper ドキュメントを返します。
    private void ParseFieldList(string FieldList, bool AllowRelation)
    {
        /*
         * This code parses FieldList into FieldInfo objects  and then 
         * adds them to the m_FieldInfo private member
         * 
         * FieldList systax:  [relationname.]fieldname[ alias], ...
        */ 
        if (m_FieldList == FieldList) return;
        m_FieldInfo = new System.Collections.ArrayList();
        m_FieldList = FieldList;
        FieldInfo Field; string[] FieldParts;
        string[] Fields=FieldList.Split(',');
        int i;
        for (i=0; i<=Fields.Length-1; i++)
        {
            Field=new FieldInfo();
            //parse FieldAlias
            FieldParts = Fields[i].Trim().Split(' ');
            switch (FieldParts.Length)
            {
                case 1:
                    //to be set at the end of the loop
                    break;
                case 2:
                    Field.FieldAlias=FieldParts[1];
                    break;
                default:
                    throw new Exception("Too many spaces in field definition: '" + Fields[i] + "'.");	                        
            }
            //parse FieldName and RelationName
            FieldParts = FieldParts[0].Split('.');
            switch (FieldParts.Length)
            {
                case 1: 
                    Field.FieldName=FieldParts[0];
                    break;
                case 2:
                    if (AllowRelation==false)
                        throw new Exception("Relation specifiers not permitted in field list: '" + Fields[i] + "'.");
                    Field.RelationName = FieldParts[0].Trim();
                    Field.FieldName=FieldParts[1].Trim();
                    break;
                default:
                    throw new Exception("Invalid field definition: " + Fields[i] + "'.");
            }
            if (Field.FieldAlias==null) 
                Field.FieldAlias = Field.FieldName;
            m_FieldInfo.Add (Field);
        }
    }
    					

CreateJoinTable メソッド

このセクションにはコードが含まれています、 CreateJoinTable メソッドです。

次の呼び出し規約には、 CreateJoinTable 方法:
dt = dsHelper.CreateJoinTable("TestTable", ds.Tables["Employees"],
    "FirstName FName,LastName LName,DepartmentEmployee.DepartmentName Department");
				
この呼び出しのサンプルを新規作成します。 データ テーブル 使用します。 テーブル名 TestTable の 3 つのフィールド (FName、LName、部門)。これら 3 つのフィールドが同じデータを入力して、[姓] および [社員] テーブルの [氏名] フィールドと [DepartmentName] フィールド、DepartmentEmployee を介してアクセスされる、親テーブル内とがあります。 DataRelation オブジェクトです。

フィールド リストでフィールドを指定するのには、次の構文を使用します。
[relationname.]fieldname[ alias], ...
				
この構文は次のように注意してください。
  • は、 ColumnName および データ型 プロパティはプロパティを変換先にコピーされるだけです。 データ テーブル.
  • 評価結果は、式を含むフィールドにコピーされます。
  • リンク先のフィールドの名前を変更します。 データ テーブル エイリアス名を指定します。
  • フィールドに、ソース内の順序とは異なる順序で表示されているフィールド名のサブセットを含めることができます。 データ テーブル.フィールド リストが空白の場合は、例外がスローされます。
  • は、 DataRelation 親テーブルに関連付ける必要があります。など、お客様、従業員、受注テーブルのフィールドを結合するテーブルを作成する場合は、元のテーブルとして [受注] テーブルを使用し、リレーションを使用して、顧客と従業員テーブル内のフィールドを参照する必要があります。
呼び出すには CreateJoinTable メソッドは、次の方法を追加、 DataSetHelper 作成したクラスは、""セクション。
public DataTable CreateJoinTable(string TableName, DataTable SourceTable, string FieldList)
{
    /*
     * Creates a table based on fields of another table and related parent tables
     * 
     * FieldList syntax: [relationname.]fieldname[ alias][,[relationname.]fieldname[ alias]]...
    */ 
    if (FieldList==null)
    {
        throw new ArgumentException("You must specify at least one field in the field list.");
        //return CreateTable(TableName, SourceTable);
    }
    else
    {
        DataTable dt = new DataTable(TableName);
        ParseFieldList(FieldList, true);
        foreach(FieldInfo Field in m_FieldInfo)
        {
            if(Field.RelationName==null)
            {
                DataColumn dc = SourceTable.Columns[Field.FieldName];
                dt.Columns.Add(dc.ColumnName, dc.DataType, dc.Expression);
            }
            else
            {
                DataColumn dc = SourceTable.ParentRelations[Field.RelationName].ParentTable.Columns[Field.FieldName];
                dt.Columns.Add(dc.ColumnName, dc.DataType, dc.Expression);
            }
        }
        if (ds!=null)
            ds.Tables.Add(dt);
        return dt;
    }
}
				

InsertJoinInto メソッド

このセクションにはコードが含まれています、 InsertJoinInto メソッドです。は、 InsertJoinInto メソッドは、ソートされます、元テーブルからフィルターを選択し、テーブルを変換先テーブルに関連レコードをコピーします。呼び出すと、 ParseFieldList プロパティは、これらのリストにない場合以前に解析された一覧を解析できます。フィールド リストが空白の場合は、例外がスローされます。

次の呼び出し規約には、 InsertJoinInto 方法:
dsHelper.InsertJoinInto(ds.Tables["TestTable"], ds.Tables["Employees"], 
    "FirstName FName,LastName LName,DepartmentEmployee.DepartmentName Department", 
    "EmployeeID<5", "BirthDate");
				
呼び出しの例、従業員からのレコードをコピーします。 データ テーブル DepartmentName の関連 データ テーブル) に、TestTable データ テーブルは、"社員コードでフィルタ リング<5" and="" is="" sorted="" by=""></5">

メモだけに、基になるテーブルと関連テーブルに: [フィルターと並べ替え式を適用します。

呼び出すには InsertJoinInto メソッドは、次の方法を追加、 DataSetHelper 作成したクラスは、""セクション。
public void InsertJoinInto(DataTable DestTable, DataTable SourceTable, 
    string FieldList, string RowFilter, string Sort)
{
    /*
    * Copies the selected rows and columns from SourceTable and inserts them into DestTable
    * FieldList has same format as CreatejoinTable
    */ 
    if (FieldList==null)
    {
        throw new ArgumentException("You must specify at least one field in the field list.");
        //InsertInto(DestTable, SourceTable, RowFilter, Sort);
    }
    else
    {
    ParseFieldList(FieldList, true);
    DataRow[] Rows = SourceTable.Select(RowFilter, Sort);
    foreach(DataRow SourceRow in Rows)
    {
            DataRow DestRow = DestTable.NewRow();
            foreach(FieldInfo Field in m_FieldInfo)
            {
                if(Field.RelationName==null)
                {
                    DestRow[Field.FieldName] = SourceRow[Field.FieldName];
                }
                else
                {
                    DataRow ParentRow = SourceRow.GetParentRow(Field.RelationName);
                    DestRow[Field.FieldName] = ParentRow[Field.FieldName];
                }
            }
            DestTable.Rows.Add(DestRow);
        }
    }
}
				

SelectJoinInto メソッド

このセクションにはコードが含まれています、 SelectJoinInto メソッドです。このメソッドの組み合わせになります、 CreateJoinTable および InsertJoinInto 方法があります。は、 SelectJoinInto 新しいメソッドを作成します。 データ テーブル 既存のに基づいてください。 データ テーブル 並べ替えおよび新しいにフィルターを適用するオブジェクトとそのコピーのレコード データ テーブル.

次の呼び出し規約には、 SelectJoinInto 方法:
dt = dsHelper.SelectInto("TestTable", ds.Tables["Employees"], 
    "FirstName FName,LastName LName,DepartmentEmployee.DepartmentName Department", "EmployeeID<5", "BirthDate");
				
このサンプルの呼び出しを作成します。 データ テーブル TestTable の 3 つのフィールドの名前。これら 3 つのフィールドと従業員の [姓] フィールドに基づいています データ テーブル DepartmentName のフィールドが、 データ テーブル DepartmentEmployee で参照されています DataRelation.このサンプルは、レコード、従業員からコピーします。 データ テーブル TestTable データ テーブルは、"社員コードでフィルタ リング<5" and="" is="" sorted="" by=""></5">

メモだけに、基になるテーブルと関連テーブルに: [フィルターと並べ替え式を適用します。

呼び出すには SelectJoinInto メソッドは、次の方法を追加、 DataSetHelper 作成したクラスは、""セクション。
public DataTable SelectJoinInto(string TableName, DataTable SourceTable, string FieldList, string RowFilter, string Sort)
{
    /*
     * Selects sorted, filtered values from one DataTable to another.
     * Allows you to specify relationname.fieldname in the FieldList to include fields from
     *  a parent table. The Sort and Filter only apply to the base table and not to related tables.
    */ 
    DataTable dt = CreateJoinTable(TableName, SourceTable, FieldList);
    InsertJoinInto(dt, SourceTable, FieldList, RowFilter, Sort);
    return dt;
}
				

アプリケーションをテストします。

  1. 保存し、コンパイル、 DataSetHelper 前のセクションで作成したクラスです。
  2. 新しい Visual C# Windows アプリケーションを作成するのには、次の手順を実行します。
    1. Visual Studio を起動します。NET。
    2. で、 ファイル メニューのポイント 新しい、し プロジェクト.
    3. で、 新しいプロジェクト ダイアログ ボックス、クリックして Visual C# プロジェクト 下にあります。 [プロジェクトの種類、し Windows アプリケーション 下にあります。 テンプレート.
  3. ソリューション エクスプ ローラーでソリューションを右クリックしをクリックしてください 既存のプロジェクトを追加します。.DataSetHelper プロジェクトを追加します。
  4. で、 プロジェクト メニューをクリックして 参照を追加します。.
  5. で、 参照を追加します。 ダイアログ ボックスをクリックして、 プロジェクト タブし、DataSetHelper プロジェクトへの参照を Windows フォーム アプリケーションに追加します。
  6. フォーム デザイナーでは、3 つをドラッグします。 ボタン コントロールとは データ グリッド [ツールボックス] からフォームに制御します。ボタンの名前 btnCreateJoin, btnInsertJoinInto、、 btnSelectJoinInto.既定の名前を保持、 データ グリッド (dataGrid1) を制御します。
  7. フォームのコードでは、以下を追加します。 使用します。 コード ウィンドウの最上部へ:
    using System.Data;
    					
  8. フォームの定義に、次の変数宣言を追加します。
    DataSet ds; DataSetHelper.DataSetHelper dsHelper;
    					
  9. 次のコードを追加、 Form_Load イベント:
    ds = new DataSet();
    dsHelper = new DataSetHelper.DataSetHelper(ref ds);
    //Create source tables
    DataTable dt = new DataTable("Employees");
    dt.Columns.Add("EmployeeID",Type.GetType("System.Int32") );
    dt.Columns.Add("FirstName", Type.GetType("System.String"));
    dt.Columns.Add("LastName", Type.GetType("System.String"));
    dt.Columns.Add("BirthDate", Type.GetType("System.DateTime"));
    dt.Columns.Add("JobTitle", Type.GetType("System.String"));
    dt.Columns.Add("DepartmentID", Type.GetType("System.Int32"));
    dt.Rows.Add(new object[] {1, "Tommy", "Hill", new DateTime(1970, 12, 31),  "Manager", 42});
    dt.Rows.Add(new object[] {2, "Brooke", "Sheals", new DateTime(1977, 12, 31), "Manager", 23});
    dt.Rows.Add(new object[] {3, "Bill", "Blast", new DateTime(1982, 5, 6), "Sales Clerk", 42});
    dt.Rows.Add(new object[] {1, "Kevin", "Kline", new DateTime(1978, 5, 13), "Sales Clerk", 42});
    dt.Rows.Add(new object[] {1, "Martha", "Seward", new DateTime(1976, 7, 4), "Sales Clerk", 23});
    dt.Rows.Add(new object[] {1, "Dora", "Smith", new DateTime(1985, 10, 22), "Trainee", 42});
    dt.Rows.Add(new object[] {1, "Elvis", "Pressman", new DateTime(1972, 11, 5), "Manager", 15});
    dt.Rows.Add(new object[] {1, "Johnny", "Cache", new DateTime(1984, 1, 23), "Sales Clerk", 15});
    dt.Rows.Add(new object[] {1, "Jean", "Hill", new DateTime(1979, 4, 14), "Sales Clerk", 42});
    dt.Rows.Add(new object[] {1, "Anna", "Smith", new DateTime(1985, 6, 26), "Trainee", 15});
    ds.Tables.Add(dt);
    
    dt = new DataTable("Departments");
    dt.Columns.Add("DepartmentID", Type.GetType("System.Int32"));
    dt.Columns.Add("DepartmentName", Type.GetType("System.String"));
    dt.Rows.Add(new object[] {15, "Men's Clothing"});
    dt.Rows.Add(new object[] {23, "Women's Clothing"});
    dt.Rows.Add(new object[] {42, "Children's Clothing"});
    ds.Tables.Add(dt);
    
    ds.Relations.Add("DepartmentEmployee",     ds.Tables["Departments"].Columns["DepartmentID"], 
        ds.Tables["Employees"].Columns["DepartmentID"]);
    					
  10. 次のコードを追加、 btnCreateJoin_Click イベント:
    dsHelper.CreateJoinTable("EmpDept",ds.Tables["Employees"], 
        "FirstName FName,LastName LName,BirthDate,DepartmentEmployee.DepartmentName Department");
    dataGrid1.SetDataBinding(ds, "EmpDept");
    					
  11. 次のコードを追加、 btnInsertJoinInto_Click イベント:
    dsHelper.InsertJoinInto(ds.Tables["EmpDept"], ds.Tables["Employees"], 
        "FirstName FName,LastName LName,BirthDate,DepartmentEmployee.DepartmentName Department",
        "JobTitle='Sales Clerk'", "DepartmentID");
    dataGrid1.SetDataBinding(ds, "EmpDept");
    					
  12. 次のコードを追加、 btnSelectJoinInto_Click イベント:
    dsHelper.SelectJoinInto("EmpDept2", ds.Tables["Employees"],
        "FirstName,LastName,BirthDate BDate,DepartmentEmployee.DepartmentName Department", 
        "JobTitle='Manager'", "DepartmentID");
    dataGrid1.SetDataBinding(ds, "EmpDept2");
    					
  13. アプリケーションを実行し、各ボタンをクリックします。注意してください、 データ グリッド テーブルとコードのデータに表示されます。

    メモだけをクリックできます、 btnCreateJoin および btnSelectJoinInto 1 回のボタン。これらのボタンのいずれかを 2 回以上クリックすると、同じテーブルを 2 回追加しようとしているエラー メッセージが表示されます。さらに、クリックする必要があります。 btnCreateJoin クリックする前に btnInsertJoinInto;それ以外の場合は、リンク先 データ テーブル 作成されません。クリックすると、 btnInsertJoinInto ボタンを複数回に追加、 データ グリッド 重複したレコードを使用します。

拡張機能のアイデア

  • は、 ColumnName および データ型 プロパティはプロパティを変換先にコピーされるだけです。 データ テーブル.拡張することができます、 CreateTable などの追加のプロパティをコピーするメソッド、 MaxLength プロパティ、または、新しいキーの列を作成できます。
  • は、 プロパティはコピーされません。代わりに、評価の結果にコピーされます。したがって、式が変換先テーブルによって参照されるフィールドを追加する必要はありません。さらに、変換先列は前よりも、この列の場合は依存する列のいずれかの結果リストに表示できます。変更できます、 CreateTable 方法をコピーするのには (InsertInto 列に列を無視します。 )、これでは、この段落の前に記載されている制限がします。
  • 機能を結合することができます、 CreateJoinTable、、 InsertJoinInto、および SelectJoinInto メソッドには、 CreateTable、、 InsertInto、および SelectInto 方法があります。詳細については、 CreateTable、、 InsertInto、および SelectInto メソッドは、Microsoft Knowledge Base の資料を参照するのには、次の文書番号をクリックしてください。
    326009 [Howto]: データセットの選択にヘルパー クラス視覚 C# で. します。NET
    これらのメソッドは、マージしたくないが、1 つのクラスでのメソッドの両方のセットがある場合は、有効にすることができる場合は、 CreateJoinTable および InsertJoinInto 削除すると、空のフィールド リストを処理するメソッドは、 スロー 文と呼び出しを uncommenting によって、 CreateTable および InsertInto メソッドに次のコード行:
        if (FieldList==null)
        {
            throw new ArgumentException("You must specify at least one field in the field list.");
            //return CreateTable(TableName, SourceTable);
        }
    					
    - と -
        if (FieldList==null)
        {
            throw new ArgumentException("You must specify at least one field in the field list.");
            //InsertInto(DestTable, SourceTable, RowFilter, Sort);
        }
    					

トラブルシューティング

  • フィールド名とフィールド リストのエイリアスの部分に従う必要があります。 DataColumn 名前付け規則。名前にピリオド (.) を含めることはできませんで、パーサー、名も制限されます、コンマ (,)、またはスペース ()。
  • 2 回以上ボタンをクリックすると、同じテーブル 2 回追加されますが データセット、その結果、例外にします。この問題を回避するを確認するのには、テスト アプリケーションにコードを追加できるかどうか、 データ テーブル 同じ名前が既に存在します。また、作成することができます、 DataSetHelper クラスを参照するには データセット バインドを DataGrid.DataSource 直接プロパティには、 dt ではなく変数を使用して、 SetDataBinding メソッドの呼び出し。
  • カスタム データ型 (クラス)、基になるテーブルを使用している場合は、コードを追加する必要があります、 InsertJoinInto データの詳細コピーを実行するのには、[メソッド] をクリックします。それ以外の場合は、参照だけがコピーされます。

プロパティ

文書番号: 326080 - 最終更新日: 2011年7月28日 - リビジョン: 4.0
キーワード:?
kbhowtomaster kbsystemdata kbmt KB326080 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:326080
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com