POSTUPY: Provést pomocnou třídu DataSet JOIN v aplikaci Visual C# .NET

Překlady článku Překlady článku
ID článku: 326080 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Souhrn

Tento článek obsahuje podrobný návod, jak provádět a jak používat třídu DataSetHelper, která obsahuje ukázkový kód, chcete-li vytvořit objekt DataTable z dvou nebo více souvisejících DataTable definice a zkopírovat záznamy, které jsou seřazeny a filtrovány ze zdrojové objekty DataTable do cílového objektu DataTable.

To proveďte pomocí následujících metod veřejné:
  • CreateJoinTable
  • InsertJoinInto
  • SelectJoinInto
Metoda SelectJoinInto volá, CreateJoinTable a InsertJoinInto metody. Členy soukromé pomocné metody a data můžete použít také k uložení seznamu analyzovanou pole.

Třída DataSetHelper zahrnuje členské proměnné objektu DataSet. Volitelně můžete přiřadit objekt existující DataSet členské proměnné objektu DataSet. Pokud členské proměnné odkazuje na platný objekt DataSet, DataTable objekty, které vytvoří CreateJoinTable nebo SelectJoinInto metody jsou přidány do objektu DataSet. Volání metody v obou případech vrátí odkaz na objekt DataTable. Metoda InsertJoinInto vyžaduje existující cílový objekt DataTable a nic nevrací.

Další informace o objektech DataSet získáte v článku znalostní báze Microsoft Knowledge Base:
313485INFORMACE: Průvodce pro ADO.NET DataSet, objekt DataView a objekt DataViewManager

Požadavky

Následující seznam obsahuje doporučený hardware, software, síťovou infrastrukturu a aktualizace service Pack, které jsou vyžadovány:
  • Microsoft Windows XP, Windows 2000 nebo Windows NT 4.0 s aktualizací Service Pack 6a
  • Microsoft Visual Studio .NET
Tento článek předpokládá, že je obeznámen s následující témata vám:
  • Syntaxe Visual C# .NET
  • Základy ADO.NET a syntaxe

Třída DataSetHelper prostředí

Kód v této části deklaruje prostředí třídy, ke které metody a proměnné členů přidat všechny DataSetHelper články.
  1. Spusťte aplikaci Visual Studio .NET.
  2. V nabídce soubor přejděte na příkaz Nový a potom klepněte na příkaz projekt.
  3. V dialogovém okně Nový projektVisual C# projekty v části Typy projektů, klepnutí na příkaz Knihovny tříd podle šablony.
  4. Do pole název zadejte DataSetHelper.
  5. Kód třídy nahraďte následující kód:
    public class DataSetHelper
    {
        public DataSet ds;
    
        public DataSetHelper(ref DataSet DataSet)
        {
    	ds = DataSet;
        }
        public DataSetHelper()
        {
    	ds = null;
        }
    }
    					
    pomocí dvou přetížení pro konstruktor můžete vytvořit instanci třídy s nebo bez odkazu na platný objekt DataSet. Třídy, které obsahuje odkaz na platný objekt DataSet objekty DataTable, vrácení metody budou přidány také automaticky do objektu DataSet.

Analyzátor seznamu polí

Tento oddíl obsahuje kód pro analyzátor seznamu pole. Analyzované struktury se používá, aby CreateJoinTable a InsertJoinInto metody není nutné změny seznamu polí. Tyto metody musí změny zpracování seznamu polí, pokud se nazývají z metody SelectJoinInto nebo z vlastního kódu. Analyzované pole seznamu a seznamu neanalyzovanou pole jsou uloženy v soukromé proměnné členů třídy DataSetHelper.
  1. Přidat následující definici třídy Private v DataSetHelper třídy, která jste vytvořili v části "":
    private class FieldInfo
    {
        public string RelationName;
        public string FieldName;	//source table field name
        public string FieldAlias;	//destination table field name
        public string Aggregate;
    }
    					
    Poznámka: Tato třída je společné pro ostatní předměty DataSetHelper a obsahuje některá pole bez použití tohoto článku.

  2. Definice třídy bezprostředně po prohlášení DataSet přidat následující soukromé proměnné členů:
    private System.Collections.ArrayList m_FieldInfo; private string m_FieldList; 
    					
  3. Přidejte následující metodu Private definice třídy. Tato metoda je stejná jako metoda používaná v jiných článcích 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);
        }
    }
    					

Metoda CreateJoinTable

Tento oddíl obsahuje kód pro metodu CreateJoinTable.

Následuje konvence volání metody CreateJoinTable:
dt = dsHelper.CreateJoinTable("TestTable", ds.Tables["Employees"],
    "FirstName FName,LastName LName,DepartmentEmployee.DepartmentName Department");
				
tento vzorek volání vytvoří nový objekt DataTable s název_tabulky tří polí (JM. LName a oddělení) a TestTable. Tyto tři pole mají stejný datový typ. jako jméno a pole Příjmení v tabulce Zaměstnanci a pole DepartmentName v nadřazené tabulce, které je přístupné prostřednictvím objektu DepartmentEmployee DataRelation.

Chcete-li určit pole v seznamu polí použijte následující syntaxi:
[relationname.]fieldname[ alias], ...
				
Poznámka následující pro tuto syntaxi:
  • Název_sloupce a datový typ vlastnosti jsou pouze vlastnosti, které budou zkopírovány do cílového objektu DataTable.
  • Výsledek vyhodnocený zkopírován pro pole obsahující výraz.
  • Zadáním název aliasu, může přejmenování pole v cílového objektu DataTable.
  • Seznam pole může obsahovat podmnožinu názvů polí, které jsou uvedeny v jiném pořadí než pořadí, ve zdrojovém objektu DataTable. Pokud seznam polí je prázdné, je k vyvolání výjimky.
  • DataRelation se musí týkat nadřazených tabulek. Například pokud chcete vytvořit tabulku, která spojuje pole zákazníky, zaměstnanci a tabulky objednávky, musíte jako zdrojové tabulky použít tabulku objednávky a pak formou vztahy odkazovat polí zákazníky a tabulky Zaměstnanci.
Chcete-li volat metodu CreateJoinTable, přidejte následující metodu třídy DataSetHelper, která jste vytvořili v části "":
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;
    }
}
				

Metoda InsertJoinInto

Tento oddíl obsahuje kód pro metodu InsertJoinInto. Metoda InsertJoinInto zkopíruje záznamy, které jsou seřazeny a filtrovány ze zdrojové tabulky a související tabulky s cílové tabulky. Voláte-li vlastnost ParseFieldList, můžete analyzovat seznamy, které byly analyzovány dříve, pokud tyto seznamy jsou k dispozici. Pokud seznam polí je prázdné, je k vyvolání výjimky.

Následuje konvence volání metody InsertJoinInto:
dsHelper.InsertJoinInto(ds.Tables["TestTable"], ds.Tables["Employees"], 
    "FirstName FName,LastName LName,DepartmentEmployee.DepartmentName Department", 
    "EmployeeID<5", "BirthDate");
				
vzorku volání kopíruje záznamy z zaměstnanci DataTable (a DepartmentName oblasti související objekt DataTable) TestTable DataTable, který je filtrován na "ČísloZaměstnance < 5" a je roztříděna podle DatumNarození.

Poznámka: filtru a řazení výrazů se vztahují pouze na zdrojovou tabulku a nikoli k žádné související tabulky.

Chcete-li volat metodu InsertJoinInto, přidejte následující metodu třídy DataSetHelper, která jste vytvořili v části "":
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);
        }
    }
}
				

Metoda SelectJoinInto

Tento oddíl obsahuje kód pro metodu SelectJoinInto. Tato metoda je kombinací metod InsertJoinInto a CreateJoinTable. Metoda SelectJoinInto vytvoří nový objekt DataTable založený na existující objekt DataTable objekty a kopie záznamy, které jsou seřazeny a přefiltruje do nového objektu DataTable.

Následuje konvence volání metody SelectJoinInto:
dt = dsHelper.SelectInto("TestTable", ds.Tables["Employees"], 
    "FirstName FName,LastName LName,DepartmentEmployee.DepartmentName Department", "EmployeeID<5", "BirthDate");
				
tento vzorek volání vytvoří objekt DataTable s názvem TestTable obsahující tři pole. Tato tři pole jsou založeny na jméno a příjmení oblasti zaměstnanci DataTable a DepartmentName oblasti DataTable, který se odkazuje pomocí DepartmentEmployee DataRelation. Potom v tomto příkladu kopíruje záznamy z zaměstnanci DataTable do TestTable DataTable, který je filtrován na "ČísloZaměstnance < 5" a je roztříděna podle DatumNarození.

Poznámka: Tento filtr a řazení výrazů platí pouze pro zdrojovou tabulku a není do souvisejících tabulek.

Chcete-li volat metodu SelectJoinInto, přidejte následující metodu třídy DataSetHelper, která jste vytvořili v části "":
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;
}
				

Otestujte aplikaci.

  1. Uložit a potom kompilovat třídy DataSetHelper, která jste vytvořili v předchozích oddílech.
  2. Následujícím postupem vytvoříte novou Visual C# Windows aplikaci:
    1. Spusťte aplikaci Visual Studio .NET.
    2. V nabídce soubor přejděte na příkaz Nový a potom klepněte na příkaz projekt.
    3. V dialogovém okně Nový projektVisual C# projekty v části Typy projektů, klepnutí na příkaz Aplikace systému Windows v části šablony.
  3. V aplikaci Solution Explorer klepněte pravým tlačítkem myši řešení a klepněte na tlačítko Přidat existujícího projektu. Přidat projekt DataSetHelper.
  4. V nabídce projekt klepněte na příkaz Přidat odkaz.
  5. V dialogovém okně Přidat odkaz klepněte na kartu projekty a poté přidat odkaz na projekt DataSetHelper do aplikace Windows Form.
  6. V návrháři formuláře přetáhněte ovládací prvky tři tlačítka a ovládací prvek DataGrid z panelu nástrojů do formuláře. Název tlačítka, btnCreateJoin, btnInsertJoinInto a btnSelectJoinInto. Ponechejte výchozí název pro ovládací prvek DataGrid (dataGrid1).
  7. V kódu formuláře, přidejte tento příkaz použít horní části okna kód:
    using System.Data;
    					
  8. Přidat následující deklarace proměnných do definice formuláře:
    DataSet ds; DataSetHelper.DataSetHelper dsHelper;
    					
  9. Přidejte následující kód události 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. Přidejte následující kód události btnCreateJoin_Click:
    dsHelper.CreateJoinTable("EmpDept",ds.Tables["Employees"], 
        "FirstName FName,LastName LName,BirthDate,DepartmentEmployee.DepartmentName Department");
    dataGrid1.SetDataBinding(ds, "EmpDept");
    					
  11. Přidejte následující kód události 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. Přidejte následující kód události btnSelectJoinInto_Click:
    dsHelper.SelectJoinInto("EmpDept2", ds.Tables["Employees"],
        "FirstName,LastName,BirthDate BDate,DepartmentEmployee.DepartmentName Department", 
        "JobTitle='Manager'", "DepartmentID");
    dataGrid1.SetDataBinding(ds, "EmpDept2");
    					
  13. Spusťte aplikaci a poté klepněte na tlačítka. Všimněte si, DataGrid je naplněna tabulky a data z kódu.

    Poznámka: klepněte pouze na btnCreateJoin a btnSelectJoinInto tlačítka jednou. Klepnete-li na některou z těchto tlačítek více než jednou, chybová zpráva, kterou jsou stejné tabulky přidat dvakrát. Navíc je třeba klepnout na tlačítko btnCreateJoin před klepnutím na tlačítko btnInsertJoinInto; jinak cílového objektu DataTable není vytvořen. Pokud klepnete na tlačítko btnInsertJoinInto vícekrát, naplnit DataGrid s duplicitními záznamy.

Rozšíření nápady

  • Název_sloupce a datový typ vlastnosti jsou pouze vlastnosti, které budou zkopírovány do cílového objektu DataTable. Metoda CreateTable, zkopírujte další vlastnosti, jako je například vlastnost MaxLength lze rozšířit nebo můžete vytvořit nové klíčové sloupce.
  • Vlastnost Expression zkopírován; místo toho je výsledek vyhodnocený zkopírována. Proto nemáte k přidání polí, které odkazuje výraz do cílové tabulky. Dále se cílového sloupce lze zobrazit v seznamu výsledek některého sloupce, které v tomto sloupci závisí na jinak než dříve. Metoda CreateTable, zkopírujte výraz (InsertInto sloupec ignoruje sloupce s výraz), přestože se jedná, s výhradou omezení uvedených výše v tomto odstavci, můžete upravit.
  • Funkce CreateJoinTable, InsertJoinInto a SelectJoinInto metody můžete sloučit do metody SelectInto, CreateTable a InsertInto. Další informace o CreateTable, InsertInto a SelectInto metody získáte v článku znalostní báze Microsoft Knowledge Base:
    326009POSTUPY: Pomocnou třídu DataSet SELECT INTO provést v aplikaci Visual C# .NET
    Pokud nechcete sloučit těchto metod, ale pokud máte obě sady metod do jedné třídy, můžete povolit CreateJoinTable a InsertJoinInto metody řešit přehledu prázdné pole odebráním příkazy throw a volání CreateTable a InsertInto metod popsaných v následujících řádek kódu uncommenting:
        if (FieldList==null)
        {
            throw new ArgumentException("You must specify at least one field in the field list.");
            //return CreateTable(TableName, SourceTable);
        }
    					
    - a -
        if (FieldList==null)
        {
            throw new ArgumentException("You must specify at least one field in the field list.");
            //InsertInto(DestTable, SourceTable, RowFilter, Sort);
        }
    					

Poradce při potížích

  • NázevPole a alias části seznamu polí musí být v souladu s konvencí objekt DataColumn. Analyzátor také omezuje názvy, v tom, že název nesmí obsahovat tečku (.), čárka (,) nebo (místa).
  • Pokud klepnete na tlačítko více než jednou, stejné tabulky vkládá dvakrát objekt DataSet, což vede k výjimce. Chcete-li tento problém vyřešit, můžete přidat kód aplikace testu zkontrolujte, zda objekt DataTable se stejným názvem již existuje. Alternativně můžete vytvořit třídu DataSetHelper bez odkazu na třídu DataSet a potom vytvořit vazbu vlastnosti DataGrid.DataSource přímo k proměnné dt namísto pomocí volání metody SetDataBinding.
  • Pokud ve zdrojové tabulce používá vlastní typy dat (tj. Třída), musíte přidat kód metodě InsertJoinInto hluboké kopii dat provést. V opačném případě pouze odkaz zkopírován.

Vlastnosti

ID článku: 326080 - Poslední aktualizace: 3. září 2003 - Revize: 2.3
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft ADO.NET 1.1
  • Microsoft ADO.NET 1.0
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Klíčová slova: 
kbmt kbhowtomaster kbsystemdata KB326080 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:326080

Dejte nám zpětnou vazbu

 

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