Procedure: Een DataSet JOIN helperklasse implementeren in Visual C#.NET

Vertaalde artikelen Vertaalde artikelen
Artikel ID: 326080 - Bekijk de producten waarop dit artikel van toepassing is.
Alles uitklappen | Alles samenvouwen

Op deze pagina

Samenvatting

In dit artikel wordt beschreven hoe u implementeren en gebruik eenDataSetHelperklasse voorbeeldcode bevat maken eenDataTableobject van twee of meer gerelateerdeDataTabledefinities en kopiëren records worden gesorteerd en gefilterd uit de bronDataTableobjecten naar de bestemmingDataTable.

Hiervoor moet u de volgende openbare methoden gebruiken:
  • CreateJoinTable
  • InsertJoinInto
  • SelectJoinInto
DeSelectJoinIntomethodeaanroepen deCreateJoinTableen deInsertJoinIntomethoden. U kunt ook een persoonlijke helper methode en gegevens leden de verdeelde lijst opslaan.

DeDataSetHelperklasse bevat eenDataSetlidvariabele. U kunt desgewenst toewijzen een bestaandeDataSetom deDataSetlidvariabele. Als de lidvariabele naar een geldige verwijstDataSet, alleDataTableobjecten die deCreateJoinTableof deSelectJoinIntomethode maakt toegevoegd aan deDataSet. In beide gevallen de aanroep van de methode retourneert een verwijzing naar deDataTableobject. DeInsertJoinIntomethode vereist een bestaande doelDataTableen geen resultaat opgeleverd.

Voor meer informatie overDataSetobjecten, klikt u op het volgende artikelnummer in de Microsoft Knowledge Base:
313485INFO: Wegwijzer voor ADO.NET DataSet DataView en DataViewManager

Vereisten

De volgende lijst worden de aanbevolen hardware, software, netwerk infrastructuur en servicepacks nodig:
  • Microsoft Windows XP, Windows 2000 of Windows NT 4.0 servicepack 6a
  • Microsoft Visual Studio.NET
In dit artikel wordt ervan uitgegaan dat u bekend met de volgende onderwerpen bent:
  • Visual C#.NETTO-syntaxis
  • ADO.NETTO basisbegrippen en syntaxis

Klasse DataSetHelper Shell

De code in deze sectie verklaart de shell-klasse waaraan alleDataSetHelperartikelen toevoegen methoden en variabelen.
  1. Start Visual Studio.NET.
  2. Op deBestandin het menuNieuwe, en klik vervolgens opProject.
  3. In deNieuw Projecthet dialoogvenster, klikt u opVisual C#-projectenonderProjecttypen, en klik vervolgens opKlassenbibliotheekonderSjablonen.
  4. In deNaamin het vakDataSetHelper.
  5. De klassencode vervangen door de volgende code:
    public class DataSetHelper
    {
        public DataSet ds;
    
        public DataSetHelper(ref DataSet DataSet)
        {
    	ds = DataSet;
        }
        public DataSetHelper()
        {
    	ds = null;
        }
    }
    					
    U kunt twee overbelastingen voor de constructor maakt een instantie van de klasse met of zonder een verwijzing naar een geldigeDataSet. Voor een klasse die een verwijzing naar een geldige bevatDataSet, deDataTableobjecten die de methoden worden ook toegevoegd automatisch aan deDataSet.

Veld lijst-Parser

Deze sectie bevat de code voor een veld lijst-parser. Verdeelde structuur wordt gebruikt zodat deCreateJoinTableen deInsertJoinIntomethoden geen om de lijst met velden. Deze methoden moeten de lijst reparse-als ze worden aangeroepen vanuit deSelectJoinIntomethode of van uw eigen code. Opgeslagen in de veldenlijst geparseerd en de lijst met niet-geparseerdeParticuliervariabelen van hetDataSetHelperklasse.
  1. De volgende toevoegenParticulierklasse definitie in deDataSetHelperklasse die u hebt gemaakt in de "' sectie:
    private class FieldInfo
    {
        public string RelationName;
        public string FieldName;	//source table field name
        public string FieldAlias;	//destination table field name
        public string Aggregate;
    }
    					
    OPMERKING: Deze klasse is common andereDataSetHelperartikelen en sommige velden bevat die in dit artikel niet gebruiken.

  2. De volgende toevoegenParticulierLidvariabelen definitie van de klasse onmiddellijk na deDataSetverklaring:
    private System.Collections.ArrayList m_FieldInfo; private string m_FieldList; 
    					
  3. De volgende toevoegenParticuliermethode voor de klassedefinitie. Deze methode is hetzelfde als de methode die wordt gebruikt in andereDataSetHelperartikelen.
    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, methode

Deze sectie bevat de code voor deCreateJoinTablemethode.

Het volgende is de aanroepconventie voor deCreateJoinTablemethode:
dt = dsHelper.CreateJoinTable("TestTable", ds.Tables["Employees"],
    "FirstName FName,LastName LName,DepartmentEmployee.DepartmentName Department");
				
In dit voorbeeld aanroep wordt een nieuwDataTablemet eenTabelnaamTestTable en drie velden (FName, LName en afdeling). Deze drie velden hebben hetzelfde gegevenstype als de voornaam en de achternaam in de tabel Werknemers en het veld DepartmentName in de bovenliggende tabel die toegankelijk is via de DepartmentEmployeeDataRelationobject.

Gebruik de volgende syntaxis opgeven van de velden in de lijst:
[relationname.]fieldname[ alias], ...
				
Opmerking de volgende syntaxis:
  • DeColumnNameen deGegevenstypeeigenschappen zijn de enige eigenschappen gekopieerd naar de bestemmingDataTable.
  • Voor velden met expressie geëvalueerd resultaat gekopieerd.
  • U kunt de naam wijzigen van een veld in de bestemmingDataTabledoor een alias opgeven.
  • De lijst met velden kan bevatten een subset van de veldnamen die in een andere volgorde dan de volgorde in de bronDataTable. Als de lijst leeg is, wordt een uitzondering gegenereerd.
  • DeDataRelationmoet betrekking hebben op de bovenliggende tabellen. Bijvoorbeeld als u een tabel maken die een combinatie van velden van de klanten, werknemers en de tabellen Orders wilt, moet u gebruiken in de tabel Orders als de brontabel en vervolgens verwijzen naar velden in de tabellen werknemers en klanten door middel van relaties.
Bellen deCreateJoinTablemethode toevoegen de volgende methode om deDataSetHelperklasse die u hebt gemaakt in de "' sectie:
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, methode

Deze sectie bevat de code voor deInsertJoinIntomethode. DeInsertJoinIntomethode records worden gesorteerd en gefilterd uit de brontabel en gerelateerde tabellen naar de doeltabel gekopieerd. Wanneer u belt deParseFieldListeigenschap, kunt u de lijsten die eerder zijn geparseerd parseren als deze lijsten beschikbaar zijn. Als de lijst leeg is, wordt een uitzondering gegenereerd.

Het volgende is de aanroepconventie voor deInsertJoinIntomethode:
dsHelper.InsertJoinInto(ds.Tables["TestTable"], ds.Tables["Employees"], 
    "FirstName FName,LastName LName,DepartmentEmployee.DepartmentName Department", 
    "EmployeeID<5", "BirthDate");
				
Het monster oproep records opgehaald uit de werknemersDataTable(en het veld DepartmentName van een verwanteDataTable) op de TestTableDataTable, die is gefilterd op 'werknemer-id<5" and="" is="" sorted="" by=""></5">

OPMERKING: Het filteren en sorteren expressies alleen toegepast op de brontabel en niet om gerelateerde tabellen.

Bellen deInsertJoinIntomethode toevoegen de volgende methode om deDataSetHelperklasse die u hebt gemaakt in de "' sectie:
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, methode

Deze sectie bevat de code voor deSelectJoinIntomethode. Deze methode is een combinatie van deCreateJoinTableen deInsertJoinIntomethoden. DeSelectJoinIntomethode maakt een nieuwDataTablegebaseerd op bestaandeDataTableobjecten en kopieën records worden gesorteerd en gefilterd in de nieuweDataTable.

Het volgende is de aanroepconventie voor deSelectJoinIntomethode:
dt = dsHelper.SelectInto("TestTable", ds.Tables["Employees"], 
    "FirstName FName,LastName LName,DepartmentEmployee.DepartmentName Department", "EmployeeID<5", "BirthDate");
				
Deze oproep voorbeeld maakt eenDataTablede naam TestTable met drie velden. Deze drie velden zijn gebaseerd op de voornaam en de velden LastName van de werknemersDataTableen het veld DepartmentName van deDataTabledie wordt verwezen via de DepartmentEmployeeDataRelation. Dit voorbeeld kopieert records van werknemersDataTableom de TestTableDataTable, die is gefilterd op 'werknemer-id<5" and="" is="" sorted="" by=""></5">

OPMERKING: Het filteren en sorteren expressies alleen toegepast op de brontabel en niet om gerelateerde tabellen.

Bellen deSelectJoinIntomethode toevoegen de volgende methode om deDataSetHelperklasse die u hebt gemaakt in de "' sectie:
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;
}
				

De toepassing testen

  1. Opslaan en vervolgens compileren deDataSetHelperde klasse die u in de vorige gedeelten gemaakt.
  2. Volg deze stappen maakt u een nieuwe Visual C# Windows-toepassing:
    1. Start Visual Studio.NET.
    2. Op deBestandin het menuNieuwe, en klik vervolgens opProject.
    3. In deNieuw Projecthet dialoogvenster, klikt u opVisual C#-projectenonderProjecttypen, en klik vervolgens opWindows-toepassingonderSjablonen.
  3. In Solution Explorer met de rechtermuisknop op de oplossing en klik vervolgens opBestaand Project toevoegen. De DataSetHelper project toevoegen.
  4. Op deProjectmenu, klik opVerwijzing toevoegen.
  5. In deVerwijzing toevoegenhet dialoogvenster, klikt u op deProjectentabblad en vervolgens een verwijzing naar het DataSetHelper-project toevoegen aan de toepassing Windows-formulier.
  6. Sleep in de formulierontwerper drieKnopbesturingselementen en eenDataGridbeheren vanuit de werkset naar het formulier. Naam van de knoppenbtnCreateJoin,btnInsertJoinInto, enbtnSelectJoinInto. De standaardnaam voor deDataGridbesturingselement (dataGrid1).
  7. In de code van het formulier de volgende toevoegenMetinstructie bovenaan het venster Code:
    using System.Data;
    					
  8. De volgende variabele declaraties toevoegen aan de formulierdefinitie van het:
    DataSet ds; DataSetHelper.DataSetHelper dsHelper;
    					
  9. Voeg de volgende code om deForm_Loadgebeurtenis:
    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. Voeg de volgende code om debtnCreateJoin_Clickgebeurtenis:
    dsHelper.CreateJoinTable("EmpDept",ds.Tables["Employees"], 
        "FirstName FName,LastName LName,BirthDate,DepartmentEmployee.DepartmentName Department");
    dataGrid1.SetDataBinding(ds, "EmpDept");
    					
  11. Voeg de volgende code om debtnInsertJoinInto_Clickgebeurtenis:
    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. Voeg de volgende code om debtnSelectJoinInto_Clickgebeurtenis:
    dsHelper.SelectJoinInto("EmpDept2", ds.Tables["Employees"],
        "FirstName,LastName,BirthDate BDate,DepartmentEmployee.DepartmentName Department", 
        "JobTitle='Manager'", "DepartmentID");
    dataGrid1.SetDataBinding(ds, "EmpDept2");
    					
  13. De toepassing wordt uitgevoerd en op elk van de knoppen. Dat deDataGridgevuld met de tabellen en gegevens uit de code.

    OPMERKING: U kunt alleen klikken op debtnCreateJoinen debtnSelectJoinIntoéén keer knoppen. Als u een van deze knoppen meer dan één keer klikt, ontvangt een foutbericht dat u dezelfde tabel tweemaal toevoegen. Bovendien moet u op debtnCreateJoinvoordat u opbtnInsertJoinInto; anders is de bestemmingDataTablewordt gemaakt. Als u klikt op debtnInsertJoinIntoknop meerdere keren, vult u deDataGridmet dubbele records.

Ideeën voor verbetering

  • DeColumnNameen deGegevenstypeeigenschappen zijn de enige eigenschappen gekopieerd naar de bestemmingDataTable. U kunt uitbreiden deCreateTablemethode kopiëren extra eigenschappen zoals deMaxLengtheigenschap of nieuwe sleutelkolommen kunt maken.
  • DeExpressieeigenschap wordt niet gekopieerd. in plaats daarvan wordt het resultaat geëvalueerd gekopieerd. Daarom hebben niet velden waarnaar wordt verwezen door de expressie in de doeltabel. Bovendien kan de doelkolom eerder in de resultatenlijst dan kolommen anders deze kolom hangt weergegeven. U kunt wijzigen deCreateTablemethode kopiëren van deExpressie(de kolom InsertInto wordt genegeerd voor kolommen met eenExpressie), hoewel dit onverminderd de beperkingen die eerder in dit lid worden genoemd.
  • U kunt de functionaliteit van samenvoegen hetCreateJoinTable, deInsertJoinInto, en deSelectJoinIntomethoden in deCreateTable, deInsertInto, en deSelectIntomethoden. Voor meer informatie over deCreateTable, deInsertInto, en deSelectIntomethoden, klikt u op het volgende artikelnummer in de Microsoft Knowledge Base:
    326009Procedure: Een DataSet SELECT INTO helperklasse implementeren in Visual C#.NET
    Als u niet wilt samenvoegen van deze methoden, maar als u beide sets methoden in één klasse, kunnen deCreateJoinTableen deInsertJoinIntomethoden voor het verwerken van een lege lijst met door deWeggooieninstructies en door het aanroepen van uncommenting deCreateTableen deInsertIntomethoden in de volgende regels code:
        if (FieldList==null)
        {
            throw new ArgumentException("You must specify at least one field in the field list.");
            //return CreateTable(TableName, SourceTable);
        }
    					
    - en -
        if (FieldList==null)
        {
            throw new ArgumentException("You must specify at least one field in the field list.");
            //InsertInto(DestTable, SourceTable, RowFilter, Sort);
        }
    					

Problemen oplossen

  • De veldnaam en de alias delen van de lijst moeten voldoenDataColumnnaamgevingsconventies. De parser beperkt ook de namen die de naam moet een punt (.) bevatten een komma (,) of een spatie ().
  • Als u meer dan één keer op een knop, dezelfde tabel twee keer wordt toegevoegd aan deDataSet, wat resulteert in een uitzondering. U kunt dit probleem omzeilen code toevoegen aan de testtoepassing om te controleren of eenDataTablemet dezelfde naam bestaat al. Ook kunt u deDataSetHelperklasse zonder een verwijzing naar eenDataSeten vervolgens binden deDataGrid.DataSourceeigenschap rechtstreeks aan deDTvariabele in plaats van via deSetDataBindingmethodeaanroep.
  • Als de brontabel aangepaste gegevenstypen (een klasse) gebruikt, moet u code toevoegen deInsertJoinIntomethode voor het uitvoeren van een diepe kopie van de gegevens. Anders wordt alleen een verwijzing gekopieerd.

Eigenschappen

Artikel ID: 326080 - Laatste beoordeling: woensdag 2 maart 2011 - Wijziging: 2.0
De informatie in dit artikel is van toepassing op:
  • Microsoft ADO.NET 1.1
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Trefwoorden: 
kbhowtomaster kbsystemdata kbmt KB326080 KbMtnl
Automatisch vertaald artikel
BELANGRIJK: Dit artikel is vertaald door de vertaalmachine software van Microsoft in plaats van door een professionele vertaler. Microsoft biedt u professioneel vertaalde artikelen en artikelen vertaald door de vertaalmachine, zodat u toegang heeft tot al onze knowledge base artikelen in uw eigen taal. Artikelen vertaald door de vertaalmachine zijn niet altijd perfect vertaald. Deze artikelen kunnen fouten bevatten in de vocabulaire, zinsopbouw en grammatica en kunnen lijken op hoe een anderstalige de taal spreekt en schrijft. Microsoft is niet verantwoordelijk voor onnauwkeurigheden, fouten en schade ontstaan door een incorrecte vertaling van de content of het gebruik ervan door onze klanten. Microsoft past continue de kwaliteit van de vertaalmachine software aan door deze te updaten.
De Engelstalige versie van dit artikel is de volgende:326080

Geef ons feedback

 

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