JAK: Provést pomocné třídy DataSet JOIN v Visual C# .NET

Microsoft Visual Basic .NET verzi tohoto článku naleznete v tématu

325688 postupy: Pomocná třída DataSet JOIN provést v jazyce Visual Basic .NET
Poznámka: Tento článek je jednu řadu článků DataSetHelper . Můžete sloučit kód v DataSetHelper třídy, která je uvedena v tomto článku s kódem, který je k dispozici v jiných článcích DataSetHelper provést komplexnější sadu funkce jediné třídy.


Tento článek se týká následujících oborů názvů knihovny tříd rozhraní.NET Framework společnosti Microsoft:
  • System.Data

V TOMTO ÚKOLU

Souhrn

Tento podrobný článek popisuje, jak implementovat a použití DataSetHelper třída, která zahrnuje ukázkový kód 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.

Chcete-li to provést, použijete následující veřejné metody:

  • CreateJoinTable
  • InsertJoinInto
  • SelectJoinInto
Metoda SelectJoinInto volá CreateJoinTable a InsertJoinInto metody. Soukromé pomocné metody a datové členy 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 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. V obou případech volání metody vrátí odkaz na objekt DataTable . Metoda InsertJoinInto vyžaduje existující cíl DataTable a nic nevrací.

Další informace o objektech DataSet klepněte na následující číslo článku znalostní báze Microsoft Knowledge Base:

313485 INFO: návod pro ADO.NET DataSet, objekt DataView a objekt DataViewManager

Požadavky

Následující seznam obsahuje doporučený hardware, software, síťovou infrastrukturu a požadované aktualizace service Pack:

  • Microsoft Windows XP, Windows 2000 nebo Windows NT 4.0 Service Pack 6a
  • Microsoft Visual Studio .NET
Tento článek předpokládá, že jste obeznámeni s následující témata:

  • Syntaxi Visual C# .NET
  • Základy technologie ADO.NET a syntaxe

Třída DataSetHelper Shell

Kód v tomto oddílu deklaruje třídy prostředí, do kterého všechny DataSetHelper články Přidat členské proměnné a metody.
  1. Spusťte aplikaci Visual Studio .NET.
  2. V nabídce soubor přejděte na příkaz Nový a klepněte na příkaz projekt.
  3. V dialogovém okně Nový projekt klepněte na tlačítko Projekty Visual C# v části Typy projektua v části šablonyklepněte na příkaz Knihovny tříd .
  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;
    }
    }

    Můžete použít dva přetížení konstruktoru pro vytvoření instance třídy s nebo bez odkazu na platný objekt DataSet. Pro třídu, která obsahuje odkaz na platný objekt DataSet DataTable objekty, které vrátí metody budou přidány také automaticky do objektu DataSet.

Analyzátor seznamu pole

Tento oddíl obsahuje kód pro Analyzátor seznamu pole. Analyzovanou 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. Seznamu analyzovanou pole a seznamu neanalyzovanou pole jsou uloženy v soukromé proměnné členů třídy DataSetHelper .

  1. Přidáte následující definice třídy soukromé třídy DataSetHelper , která jste vytvořili v části "DataSetHelper Shell Class":
    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 běžné jiných článcích DataSetHelper a obsahuje některá pole, které v tomto článku nepoužívá.

  2. Definice třídy bezprostředně po deklaraci objektu DataSet přidáte následující soukromé proměnné členů:
    private System.Collections.ArrayList m_FieldInfo; private string m_FieldList; 
  3. Přidáte následující metodu Private definice třídy. Tato metoda je stejná jako metoda, která se používá 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);
    }
    }

Metodu CreateJoinTable

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

Konvence volání metody CreateJoinTable je následující:
dt = dsHelper.CreateJoinTable("TestTable", ds.Tables["Employees"],    "FirstName FName,LastName LName,DepartmentEmployee.DepartmentName Department");

Tento vzorek volání vytvoří nové DataTable s název_tabulky TestTable a tří polí (FName LName a oddělení). Tyto tři pole mají stejný datový typ. jako příjmení 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í syntaxe:

  • Název_sloupce a datový typ vlastnosti jsou pouze vlastnosti, které jsou 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ázvu alias můžete přejmenovat pole v cílové DataTable .
  • Seznam pole může obsahovat podmnožinu názvů polí, které jsou uvedeny v jiném pořadí než pořadí ve zdroji DataTable. Pokud seznam polí je prázdné, je vyvolána výjimka.
  • DataRelation se musí týkat nadřazených tabulek. Například pokud chcete vytvořit tabulku, která slouží ke sloučení polí zákazníky, zaměstnanci a tabulky objednávky, musíte použít tabulku objednávky jako zdrojovou tabulku a poté odkazovat na pole v tabulkách Zaměstnanci a zákazníky prostřednictvím vztahů.
Volat metodu CreateJoinTable , přidejte následující metodu třídy DataSetHelper , která jste vytvořili v části "DataSetHelper Shell Class":
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. Při volání ParseFieldList vlastnost, můžete analyzovat seznamy, které byly analyzovány dříve, pokud tyto seznamy jsou k dispozici. Pokud seznam polí je prázdné, je vyvolána výjimka.


Konvence volání metody InsertJoinInto je následující:
dsHelper.InsertJoinInto(ds.Tables["TestTable"], ds.Tables["Employees"],     "FirstName FName,LastName LName,DepartmentEmployee.DepartmentName Department", 
"EmployeeID<5", "BirthDate");

Ukázka volání kopíruje záznamy z zaměstnanci DataTable (a pole DepartmentName související DataTable) TestTable DataTable, která je filtrován na "ČísloZaměstnance < 5" a je roztříděna podle DatumNarození.

Poznámka: Filtr a řazení výrazů použít pouze zdrojové tabulky a všechny související tabulky.

Volání metody InsertJoinInto , přidejte následující metodu třídy DataSetHelper , která jste vytvořili v části "DataSetHelper Shell Class":
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í CreateJoinTable a InsertJoinInto metody. Metoda SelectJoinInto vytvoří nové DataTable založené na existující DataTable objekty a kopie záznamů, které jsou seřazeny a filtrovány do nového objektu DataTable.


Konvence volání metody SelectJoinInto je následující:
dt = dsHelper.SelectInto("TestTable", ds.Tables["Employees"],     "FirstName FName,LastName LName,DepartmentEmployee.DepartmentName Department", "EmployeeID<5", "BirthDate");

Tento ukázkový volání vytvoří DataTable s názvem TestTable a tří polí. Tato tři pole jsou založeny na jméno a příjmení polí DataTable zaměstnanci a pole DepartmentName DataTable , který je odkazován 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: Filtr a řazení výrazů použít pouze zdrojové tabulky a související tabulky.

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

Testování aplikace

  1. Uložte a potom kompilovat třídy DataSetHelper , která jste vytvořili v předchozích oddílech.
  2. Postupujte takto Chcete-li vytvořit nové Visual C# Windows aplikace:
    1. Spusťte aplikaci Visual Studio .NET.
    2. V nabídce soubor přejděte na příkaz Nový a klepněte na příkaz projekt.
    3. V dialogovém okně Nový projekt klepněte na tlačítko Projekty Visual C# v části Typy projektua v části šablonyklepněte na příkaz Aplikace systému Windows .
  3. V Průzkumníku řešení klikněte pravým tlačítkem myši řešení a potom klepněte na tlačítko Přidat existující projekt. Přidáte projekt DataSetHelper.
  4. V nabídce projekt klepněte na tlačítko Přidat odkaz.
  5. V dialogovém okně Přidat odkaz klepněte na kartu projekty a poté přidat odkaz na projekt DataSetHelper aplikace Windows Form.
  6. V návrháři formuláře přetáhněte tři ovládací prvky tlačítka a ovládací prvek DataGrid z panelu nástrojů do formuláře. Název tlačítka btnCreateJoin, btnInsertJoinIntoa btnSelectJoinInto. Ponechejte výchozí název pro ovládací prvek DataGrid (dataGrid1).
  7. V kódu formuláře přidejte následující příkaz Using do horní části okna kód:
    using System.Data;
  8. Přidáte 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 potom klepněte na tlačítka. Všimněte si, že je DataGrid naplněn tabulky a data z kódu.

    Poznámka: můžete pouze btnCreateJoin a btnSelectJoinInto tlačítka jednou kliknout. Pokud kliknete na jedno z těchto tlačítek více než jednou, obdržíte chybovou zprávu, která se pokoušíte přidat stejné tabulky dvakrát. Dále je třeba kliknout na btnCreateJoin před klepnutím na tlačítko btnInsertJoinInto; v opačném cíl DataTable není vytvořen. Pokud klepnete na tlačítko btnInsertJoinInto vícekrát, můžete naplnit DataGrid s duplicitními záznamy.

Nápady na vylepšení

  • Název_sloupce a datový typ vlastnosti jsou pouze vlastnosti, které jsou zkopírovány do cílového objektu DataTable. Můžete rozšířit metodu CreateTable zkopírovat další vlastnosti, jako je například vlastnost MaxLength nebo můžete vytvořit nové klíčové sloupce.
  • Vlastnost výraz není zkopírován; Místo toho výsledek vyhodnocený zkopírován. Proto nemáte přidat pole, které odkazuje výraz do cílové tabulky. Cílového sloupce navíc může zobrazit v seznamu výsledků než kterýkoli ze sloupců, které v tomto sloupci závisí na dříve. Můžete změnit metodu CreateTable zkopírovat výraz (sloupec InsertInto ignoruje sloupce s výraz), přestože se jedná podléhají omezení uvedené dříve v tomto odstavci.
  • Funkce CreateJoinTable, InsertJoinIntoa SelectJoinInto metody můžete sloučit do CreateTable, InsertIntoa SelectInto metody. Další informace o CreateTable, InsertIntoa metody SelectInto klepněte na níže uvedené číslo článku znalostní báze Microsoft Knowledge Base:

    326009 postupy: Pomocná třída DataSet SELECT INTO provést v aplikaci Visual C# .NET
    Pokud nechcete sloučit tyto metody, ale pokud máte obě sady metod do jedné třídy, můžete povolit CreateJoinTable a metody InsertJoinInto zpracovat seznam prázdné pole aplikace odebráním příkazy Throw a uncommenting volání CreateTable a InsertInto metod v následující řádky kódu:
        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í splňovat konvence pojmenování objekt DataColumn . Analyzátor také omezuje názvy, že název nesmí obsahovat tečku (.), čárka (,) nebo mezera ().
  • Pokud klepnete na tlačítko 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 testovací aplikace chcete-li zkontrolovat, zda objekt DataTable se stejným názvem již existuje. Alternativně můžete vytvořit třídu DataSetHelper bez odkazu na objekt DataSet a potom svázat vlastnost DataGrid.DataSource přímo k proměnné dt namísto pomocí volání metody SetDataBinding .
  • Pokud zdrojová tabulka používá vlastní datové typy (to znamená, že třída), je nutné přidat kód do metody InsertJoinInto provádět hluboké kopii dat. Jinak zkopírován pouze odkaz.
Vlastnosti

ID článku: 326080 - Poslední kontrola: 16. 1. 2017 - Revize: 2

Váš názor