none
Inserir dados DataTable em Classe RRS feed

  • Pergunta

  • Saudações
    Uso esse métdo para ler um arquivo excel:

     

    /// <summary>

     

    /// Importa os dados de uma planilha Excel para um datatable

     

    /// </summary>

     

    /// <param name="path">Caminho do arquivo xls</param>

     

    /// <param name="planName">Nome da planilha a ser importada.</param>

     

    /// <returns></returns>

     

    public static DataTable ImportExcelToDataTable(string path, string planName)

    {

     

    string cnnString = String.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=""Excel 8.0;HDR=YES;""", path);

     

    string isql = "select * from [{0}$]";

    System.Data.OleDb.

    OleDbConnection cnn = new System.Data.OleDb.OleDbConnection(cnnString);

    System.Data.OleDb.

    OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter(String.Format(isql, planName), cnn);

     

    DataSet ds = new DataSet();

     

    DataTable dt = new DataTable();

     

    try

    {

    cnn.Open();

    da.Fill(ds);

    dt = ds.Tables[0];

    }

     

    finally

    {

    cnn.Close();

    cnn.Dispose();

    da.Dispose();

    ds.Dispose();

    }

     

    return dt;

    }

    Preciso pegar os dados do DataTable e popular uma classe e depois adicionar essa classe em uma lista genérica.
    Ainda não obtive sucesso.
    Alguém já fez algo parecido?

    quinta-feira, 16 de julho de 2009 10:28

Respostas

  • um exemplo de como usar os Atributos dos metodos:

    eu criei um metodo para pecorrer as propriedades da classe e popular as mesmas com os valores de um DataRow usando o valor do seu atributo como nome do campo no DataRow

    e um metodo estatico para retornar um vetor da sua classe com base nos dados de um DataTable.

    private void Fill(DataRow source) {
        // Carrega uma lista com as propriedades da classe
        PropertyInfo[] props = this.GetType().GetProperties();
        foreach (PropertyInfo prop in props) {
            // Carrega os atributos PersistenceProperty da propriedade
            object[] attrib = prop.GetCustomAttributes(typeof(PersistencePropertyAttibute), true);
            if (attrib == null && attrib.Length != 1) continue; // Se nao tiver o atributo, pula para a proxima propriedade
    
            // Não sei qual é a sua interface PersistencePropertyAttibute, mas deve ter a propriedade q vc informa
            // o nome do campo... aqui estou usando Name.
            string fieldName = (attrib[0] as PersistencePropertyAttibute).Name;
    
            // Verifica se exite a coluna com o nome informado na tabela
            if (!source.Table.Columns.Contains(fieldName)) continue;
    
            // Define o valor da propriedade com o valor da fonte de dados
            prop.SetValue(this, source[fieldName], null);
        }
    }
    
    public MinhaClasse(DataRow source) {
        this.Fill(source);
    }
    
    public static MinhaClasse[] FromDataTable(DataTable table) {
        List<MinhaClasse> result = new List<MinhaClasse>();
        foreach (DataRow row in table.Rows) {
            result.Add(new Form1(row));
        }
        return result.ToArray();
    }
    
    
    
    MinhaClasse[] = MinhaClasse.FromDataTable(minhaTabela);

    como nao achei esse PersistenceProperty aqui, fiz baseado no que imagino que ela seje... pode ser necessaria alguma alteração ai

    Obs.: Não estou levando em consideração se o tipo do dado no DataTable é o mesmo da Propriedade, pode ser q de um erro de conversao de string para inteiro ou algo assim. Se alguem mais quiser usar esse exemplo aconcelho a fazer esse tratamento antes de setar o valor, como vc ta usando excel... acho q nao tem problema ja q eh tudo string

    Se não funciona de um jeito, tente de outro totalmente diferente ^_^
    quinta-feira, 16 de julho de 2009 13:32
    Moderador

Todas as Respostas

  • Rodrigo,

    Você poderia passar a estrutura da classe a ser populada? Vai ficar mais fácil de ajudar se você passar pra gente...
    André Alves de Lima - http://andrealveslima.spaces.live.com
    quinta-feira, 16 de julho de 2009 11:27
    Moderador
  • [

    PersistenceClass("representadas")]

    [

    PersistenceBaseDAO(typeof(RepresentadaDAO))]

     

    public class Representada : Persistent

    {

     

    /// <summary>

     

    /// Identificador da representada

     

    /// </summary>

    [

    PersistenceProperty("IDREPRESENTADA", PersistenceParameterType.IdentityKey)]

     

    public int IDREPRESENTADA { get; set; }

     

     

    /// <summary>

     

    /// Nome

     

    /// </summary>

    [

    PersistenceProperty("NOME")]

     

    public string NOME { get; set; }

     

     

    /// <summary>

     

    /// Cep

     

    /// </summary>

    [

    PersistenceProperty("CEP")]

     

    public string CEP { get; set; }

     

     

    /// <summary>

     

    /// Endereo

     

    /// </summary>

    [

    PersistenceProperty("ENDERECO")]

     

    public string ENDERECO { get; set; }

     

    /// <summary>

     

    /// Cidade

     

    /// </summary>

    [

    PersistenceProperty("CIDADE")]

     

    public string CIDADE { get; set; }

     

     

    /// <summary>

     

    /// Estado

     

    /// </summary>

    [

    PersistenceProperty("ESTADO")]

     

    public string ESTADO { get; set; }

     

    /// <summary>

     

    /// Telefax

     

    /// </summary>

    [

    PersistenceProperty("TELEFAX")]

     

    public string TELEFAX { get; set; }

     

     

    /// <summary>

     

    /// CNPJ

     

    /// </summary>

    [

    PersistenceProperty("CNPJ")]

     

    public string CNPJ { get; set; }

     

     

    /// <summary>

     

    /// inscrio estadual

     

    /// </summary>

    [

    PersistenceProperty("INSCRICAO_ESTADUAL")]

     

    public string INSCRICAO_ESTADUAL { get; set; }

     

     

    /// <summary>

     

    /// Email

     

    /// </summary>

    [

    PersistenceProperty("EMAIL")]

     

    public string EMAIL { get; set; }

     

     

    /// <summary>

     

    /// Site

     

    /// </summary>

    [

    PersistenceProperty("SITE")]

     

    public string SITE { get; set; }

     

     

    /// <summary>

     

    /// Contato

     

    /// </summary>

    [

    PersistenceProperty("CONTATO")]

     

    public string CONTATO { get; set; }

     

     

    /// <summary>

     

    /// Email do contato

     

    /// </summary>

    [

    PersistenceProperty("EMAIL_CONTATO")]

     

    public string EMAIL_CONTATO { get; set; }

    quinta-feira, 16 de julho de 2009 11:30
  • um exemplo de como usar os Atributos dos metodos:

    eu criei um metodo para pecorrer as propriedades da classe e popular as mesmas com os valores de um DataRow usando o valor do seu atributo como nome do campo no DataRow

    e um metodo estatico para retornar um vetor da sua classe com base nos dados de um DataTable.

    private void Fill(DataRow source) {
        // Carrega uma lista com as propriedades da classe
        PropertyInfo[] props = this.GetType().GetProperties();
        foreach (PropertyInfo prop in props) {
            // Carrega os atributos PersistenceProperty da propriedade
            object[] attrib = prop.GetCustomAttributes(typeof(PersistencePropertyAttibute), true);
            if (attrib == null && attrib.Length != 1) continue; // Se nao tiver o atributo, pula para a proxima propriedade
    
            // Não sei qual é a sua interface PersistencePropertyAttibute, mas deve ter a propriedade q vc informa
            // o nome do campo... aqui estou usando Name.
            string fieldName = (attrib[0] as PersistencePropertyAttibute).Name;
    
            // Verifica se exite a coluna com o nome informado na tabela
            if (!source.Table.Columns.Contains(fieldName)) continue;
    
            // Define o valor da propriedade com o valor da fonte de dados
            prop.SetValue(this, source[fieldName], null);
        }
    }
    
    public MinhaClasse(DataRow source) {
        this.Fill(source);
    }
    
    public static MinhaClasse[] FromDataTable(DataTable table) {
        List<MinhaClasse> result = new List<MinhaClasse>();
        foreach (DataRow row in table.Rows) {
            result.Add(new Form1(row));
        }
        return result.ToArray();
    }
    
    
    
    MinhaClasse[] = MinhaClasse.FromDataTable(minhaTabela);

    como nao achei esse PersistenceProperty aqui, fiz baseado no que imagino que ela seje... pode ser necessaria alguma alteração ai

    Obs.: Não estou levando em consideração se o tipo do dado no DataTable é o mesmo da Propriedade, pode ser q de um erro de conversao de string para inteiro ou algo assim. Se alguem mais quiser usar esse exemplo aconcelho a fazer esse tratamento antes de setar o valor, como vc ta usando excel... acho q nao tem problema ja q eh tudo string

    Se não funciona de um jeito, tente de outro totalmente diferente ^_^
    quinta-feira, 16 de julho de 2009 13:32
    Moderador