COMO: Implementar uma classe auxiliar JOIN DataSet no Visual translation from VPE for Csharp .NET

Traduções deste artigo Traduções deste artigo
ID do artigo: 326080 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sumário

Este artigo passo a passo descreve como implementar e como usar uma classe DataSetHelper que inclui código de exemplo para criar um objeto DataTable de dois ou mais definições de DataTable relacionadas e para copiar registros que são classificados e filtrados de objetos de DataTable fonte para o destino DataTable .

Para fazer isso, você use os seguintes métodos públicos:
  • CreateJoinTable
  • InsertJoinInto
  • SelectJoinInto
O método SelectJoinInto chama CreateJoinTable e os métodos InsertJoinInto . Você também pode usar um membros de dados e o método auxiliar particular para armazenar a lista de campos analisada.

A classe DataSetHelper inclui uma variável de membro DataSet . Opcionalmente, você pode atribuir um DataSet existente à variável de membro DataSet . Se a variável de membro aponta para um DataSet válido, quaisquer objetos DataTable que CreateJoinTable ou o método SelectJoinInto cria são adicionados ao DataSet . Em ambos os casos, a chamada do método retorna uma referência ao objeto DataTable . O método InsertJoinInto requer um destino existente DataTable e não retorna nada.

Para obter mais informações sobre objetos DataSet , clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
313485INFO: Guia para ConjuntoDeDados ADO.NET, DataView e DataViewManager

Requisitos

A lista a seguir descreve o hardware recomendado, software, infra-estrutura de rede e service packs são necessários:
  • Microsoft Windows XP, Windows 2000 ou Windows NT 4.0 Service Pack 6a
  • Microsoft Visual Studio .NET
Este artigo pressupõe que você esteja familiarizado com os seguintes tópicos:
  • Sintaxe de translation from VPE for Csharp .NET Visual
  • Conceitos básicos do ADO.NET e sintaxe

Classe DataSetHelper Shell

O código nesta seção declara a classe de shell ao qual todos os artigos DataSetHelper adicionar métodos e variáveis de membro.
  1. Inicie o Visual Studio NET..
  2. No menu arquivo , aponte para novo e, em seguida, clique em Project .
  3. Na caixa de diálogo New Project , clique em projetos do Visual translation from VPE for Csharp em Tipos de projeto e, em seguida, clique em Class Library em modelos .
  4. Na caixa nome , digite DataSetHelper .
  5. Substitua o código da classe com o seguinte código:
    public class DataSetHelper
    {
        public DataSet ds;
    
        public DataSetHelper(ref DataSet DataSet)
        {
    	ds = DataSet;
        }
        public DataSetHelper()
        {
    	ds = null;
        }
    }
    					
    você pode usar duas sobrecargas para o construtor para criar uma instância da classe com ou sem uma referência a um DataSet válido. Para uma classe que contém uma referência a um DataSet válido, os objetos DataTable que os métodos retornam também são adicionados automaticamente ao DataSet .

Analisador de lista de campos

Esta seção contém o código para um analisador de lista de campo. A estrutura analisada é usada para que CreateJoinTable e os métodos InsertJoinInto não têm a lista de campos de nova análise. Esses métodos devem nova análise a lista de campos se eles são chamados do método SelectJoinInto ou de seu próprio código. A lista de campos analisada e lista de campos não analisada são armazenados em variáveis de membro particular da classe DataSetHelper .
  1. Adicionar a seguinte definição de classe particular na classe DataSetHelper que você criou na seção "":
    private class FieldInfo
    {
        public string RelationName;
        public string FieldName;	//source table field name
        public string FieldAlias;	//destination table field name
        public string Aggregate;
    }
    					
    Observação : essa classe é comum para outros artigos DataSetHelper e contém alguns campos que este artigo não usa.

  2. Adicionar as seguintes variáveis membro particular à definição de classe imediatamente após a declaração de DataSet :
    private System.Collections.ArrayList m_FieldInfo; private string m_FieldList; 
    					
  3. Adicione o seguinte método particular à definição de classe. Esse método é o mesmo método, o que é usado em outros artigos 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);
        }
    }
    					

Método CreateJoinTable

Esta seção contém o código para o método CreateJoinTable .

A seguir está a convenção de chamada para o método CreateJoinTable :
dt = dsHelper.CreateJoinTable("TestTable", ds.Tables["Employees"],
    "FirstName FName,LastName LName,DepartmentEmployee.DepartmentName Department");
				
esta chamada exemplo cria uma nova DataTable com um nome de tabela de TestTable e três campos (nome, sobrenome e departamento). Esses três campos têm o mesmo tipo como o nome e os campos Sobrenome na tabela Funcionários e o campo DepartmentName na tabela pai que é acessada através do objeto DepartmentEmployee DataRelation de dados.

Use a seguinte sintaxe para especificar campos na lista de campos:
[relationname.]fieldname[ alias], ...
				
Observe o seguinte para esta sintaxe:
  • Propriedades DataType e ColumnName são as únicas propriedades que são copiadas para o destino DataTable .
  • O resultado avaliado é copiado para campos que contêm uma expressão.
  • Você pode renomear um campo no destino DataTable especificando um nome de alias.
  • A lista de campo pode conter um subconjunto de nomes de campos que estão listados em uma ordem diferente da ordem na fonte de DataTable . Se a lista de campos estiver vazia, uma exceção é lançada.
  • A DataRelation deve relacionar as tabelas pai. Por exemplo, se você desejar criar uma tabela que combina campos das tabelas Pedidos, os funcionários e os clientes, você deve usam a tabela Pedidos como a tabela de origem e depois referenciar campos nas tabelas funcionários e os clientes por meio de relações.
Para chamar o método CreateJoinTable , adicione o seguinte método à classe DataSetHelper que você criou na seção "":
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;
    }
}
				

Método InsertJoinInto

Esta seção contém código para o método InsertJoinInto . O método InsertJoinInto copia registros que são classificados e filtrados da tabela de origem e tabelas relacionadas à tabela de destino. Quando você chamar a propriedade ParseFieldList , você pode analisar listas que foram anteriormente analisadas, se essas listas estiverem disponíveis. Se a lista de campos estiver vazia, uma exceção é lançada.

A seguir está a convenção de chamada para o método InsertJoinInto :
dsHelper.InsertJoinInto(ds.Tables["TestTable"], ds.Tables["Employees"], 
    "FirstName FName,LastName LName,DepartmentEmployee.DepartmentName Department", 
    "EmployeeID<5", "BirthDate");
				
o exemplo de chamada copia registros de funcionários DataTable (e o campo DepartmentName de uma DataTable relacionados) para TestTable DataTable , que é filtrado no "EmployeeID < 5" e é classificado por data de nascimento.

Observação : O filtro e as expressões de classificação que se aplicam somente a tabela de origem e não a todas as tabelas relacionadas.

Para chamar o método InsertJoinInto , adicione o seguinte método à classe DataSetHelper que você criou na seção "":
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);
        }
    }
}
				

Método SelectJoinInto

Esta seção contém o código para o método SelectJoinInto . Esse método é uma combinação de CreateJoinTable e os métodos InsertJoinInto . O método SelectJoinInto cria uma nova DataTable com base na DataTable objetos e cópias de registros existentes que são classificados e filtrados na nova DataTable .

A seguir está a convenção de chamada para o método SelectJoinInto :
dt = dsHelper.SelectInto("TestTable", ds.Tables["Employees"], 
    "FirstName FName,LastName LName,DepartmentEmployee.DepartmentName Department", "EmployeeID<5", "BirthDate");
				
chamada Este exemplo cria uma DataTable chamado TestTable com três campos. Esses três campos são baseados no nome e os campos Sobrenome dos funcionários DataTable e o campo DepartmentName da DataTable que é referenciado por meio de DepartmentEmployee DataRelation . Em seguida, este exemplo copia registros de funcionários DataTable à TestTable DataTable , que é filtrado no "EmployeeID < 5" e é classificado por data de nascimento.

Observação : O filtro e as expressões de classificação que se aplicam somente a tabela de origem e não a tabelas relacionadas.

Para chamar o método SelectJoinInto , adicione o seguinte método à classe DataSetHelper que você criou na seção "":
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;
}
				

Teste o aplicativo

  1. Salvar e, em seguida, compile a classe DataSetHelper que você criou nas seções anteriores.
  2. Siga estas etapas para criar um novo aplicativo do Windows translation from VPE for Csharp Visual:
    1. Inicie o Visual Studio NET..
    2. No menu arquivo , aponte para novo e, em seguida, clique em Project .
    3. Na caixa de diálogo New Project , clique em projetos do Visual translation from VPE for Csharp em Project Types e clique em Windows Application em modelos .
  3. No Solution Explorer, clique a solução com o botão direito do mouse e, em seguida, clique em Add Existing Project . Adicione projeto DataSetHelper.
  4. No menu Project , clique em Add Reference .
  5. Na caixa de diálogo Add Reference , clique na guia Projects e, em seguida, adicione uma referência para o projeto DataSetHelper para o aplicativo Windows Form.
  6. No criador de formulários, arraste três controles Button e um controle DataGrid da caixa de ferramentas para o formulário. Nomes de botões btnCreateJoin , btnInsertJoinInto e btnSelectJoinInto . Mantenha o nome padrão para o controle DataGrid (dataGrid1).
  7. No código de formulário, adicione a seguinte instrução Using na parte superior da janela código:
    using System.Data;
    					
  8. Adicionar declarações de variáveis a seguir à definição de formulário:
    DataSet ds; DataSetHelper.DataSetHelper dsHelper;
    					
  9. Adicione o seguinte código ao evento 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. Adicione o seguinte código ao evento btnCreateJoin_Click :
    dsHelper.CreateJoinTable("EmpDept",ds.Tables["Employees"], 
        "FirstName FName,LastName LName,BirthDate,DepartmentEmployee.DepartmentName Department");
    dataGrid1.SetDataBinding(ds, "EmpDept");
    					
  11. Adicione o seguinte código ao evento 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. Adicione o seguinte código ao evento btnSelectJoinInto_Click :
    dsHelper.SelectJoinInto("EmpDept2", ds.Tables["Employees"],
        "FirstName,LastName,BirthDate BDate,DepartmentEmployee.DepartmentName Department", 
        "JobTitle='Manager'", "DepartmentID");
    dataGrid1.SetDataBinding(ds, "EmpDept2");
    					
  13. Executar o aplicativo e, em seguida, clique em cada um dos botões. Observe que o DataGrid é preenchido com as tabelas e os dados do código.

    Observação : você pode clicar apenas em btnCreateJoin e os botões btnSelectJoinInto uma vez. Se você clicar em um desses botões mais de uma vez, você receberá uma mensagem de erro que você está tentando adicionar a mesma tabela duas vezes. Além disso, você deve clicar em btnCreateJoin antes de clicar em btnInsertJoinInto ; caso contrário, o destino DataTable não é criada. Se você clicar no botão btnInsertJoinInto várias vezes, você preencher o DataGrid com registros duplicados.

Idéias de aprimoramento

  • Propriedades DataType e ColumnName são as únicas propriedades que são copiadas para o destino DataTable . Você pode estender o método CreateTable para copiar propriedades adicionais, como a propriedade MaxLength , ou você pode criar novas colunas de chaves.
  • A propriedade Expression não é copiada; em vez disso, o resultado avaliado é copiado. Portanto, não é necessário adicionar campos que são referenciados pela expressão à tabela de destino. Além disso, a coluna de destino pode aparecer anteriormente na lista de resultados que qualquer uma das colunas que esta coluna depende caso contrário. Você pode modificar o método CreateTable para copiar a expressão (a coluna InsertInto ignora colunas com uma expressão ), embora isso seja sujeitos às limitações mencionadas anteriormente neste parágrafo.
  • Você pode mesclar a funcionalidade de CreateJoinTable , InsertJoinInto e os métodos SelectJoinInto em CreateTable , InsertInto e os métodos SelectInto . Para obter informações adicionais sobre CreateTable InsertInto e os métodos SelectInto , clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
    326009COMO: Implementar uma classe auxiliar DataSet SELECT INTO no Visual translation from VPE for Csharp .NET
    Se você não deseja mesclar esses métodos, mas se você tiver dois conjuntos de métodos em uma classe única, você pode ativar CreateJoinTable e os métodos InsertJoinInto lidar com uma lista de campo vazio, removendo as instruções Throw e por uncommenting as chamadas para CreateTable e os métodos InsertInto nas linhas de código a seguir:
        if (FieldList==null)
        {
            throw new ArgumentException("You must specify at least one field in the field list.");
            //return CreateTable(TableName, SourceTable);
        }
    					
    - e -
        if (FieldList==null)
        {
            throw new ArgumentException("You must specify at least one field in the field list.");
            //InsertInto(DestTable, SourceTable, RowFilter, Sort);
        }
    					

Solução de problemas

  • O nome do campo e as partes alias da lista de campos devem obedecer a convenções de nomenclatura DataColumn . O analisador também restringe os nomes, em que o nome não deve conter um ponto (.), uma vírgula (,) ou um espaço ().
  • Se você clicar em um botão mais de uma vez, a mesma tabela será adicionada duas vezes para o DataSet , que resulta em uma exceção. Para contornar esse problema, você pode adicionar código ao aplicativo de teste para verificar se uma DataTable com o mesmo nome já existe. Como alternativa, você pode criar a classe DataSetHelper sem uma referência a um DataSet e, em seguida, vincular a propriedade DataGrid.DataSource diretamente para a variável dt em vez de usando a chamada do método SetDataBinding .
  • Se a tabela de origem usa tipos de dados personalizados (ou seja, uma classe), você deve adicionar código para o método InsertJoinInto para executar uma cópia profunda dos dados. Caso contrário, somente uma referência é copiada.

Propriedades

ID do artigo: 326080 - Última revisão: quarta-feira, 3 de setembro de 2003 - Revisão: 2.3
A informação contida neste artigo aplica-se a:
  • Microsoft ADO.NET 1.1
  • Microsoft ADO.NET 1.0
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Palavras-chave: 
kbmt kbhowtomaster kbsystemdata KB326080 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 326080

Submeter comentários

 

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