Usuário com melhor resposta
Inserir dados DataTable em Classe

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?
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 ^_^- Sugerido como Resposta AndreAlvesLimaModerator sábado, 8 de maio de 2010 00:03
- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 3 de junho de 2010 23:38
Todas as Respostas
-
-
[
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; }
-
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 ^_^- Sugerido como Resposta AndreAlvesLimaModerator sábado, 8 de maio de 2010 00:03
- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 3 de junho de 2010 23:38