Usuário com melhor resposta
Select sem preenchimento de objeto

Pergunta
-
Grupo boa tarde!
Estou com a seguinte dúvida:
Pergunta: Existe uma forma de fazer um "select" sem preencher um objeto.
Motivo: Eu tenho uma listagem que eu busco com o select no mysql e ao preencher os objetos isso torna-se o sistema muito e muito lento. O select que retorna do mysql é rápido, na hora do preenchimento que é uma lentidão enorme. Segue o meu código abaixo de um exemplo:
1 - Processo que efetua a listagem
public ArrayList recebimentoclientes_e_filial(string cliente, string empresa, string funcionario,string dataini,string datafim)
{
try
{
String stringSql = string.Empty;
MySqlDataReader resultadoConsulta;
Listarfinanceiro objListarfinanceiro = null;
ArrayList lista = new ArrayList();
stringSql ="O SELECT ENTRA AQUI"
resultadoConsulta = ExecutarConsulta(stringSql);//ISSO EXECUTA RÁPIDO
while (resultadoConsulta.Read())//ESSE PROCESSO EXECUTA LENTO DEMAIS
{
objListarfinanceiro = new Listarfinanceiro();
PreencherObjeto(objListarfinanceiro, resultadoConsulta);
lista.Add(objListarfinanceiro);
}
resultadoConsulta.Close();
return lista;
2 - Classe PreencherObjeto
public void PreencherObjeto(Listarfinanceiro objListarfinanceiro, MySqlDataReader resultadoconsulta)
{
if (EhCampoExistente(resultadoconsulta, "Cod_cr1")) { objListarfinanceiro.Cod_cr1 = Convert.ToInt32(resultadoconsulta["Cod_cr1"]); }
if (EhCampoExistente(resultadoconsulta, "Doc_cr1")) { objListarfinanceiro.Doc_cr1 = Convert.ToInt32(resultadoconsulta["Doc_cr1"]); }
if (EhCampoExistenteENaoDbNull(resultadoconsulta, "Dem_cr1"))
{
objListarfinanceiro.Dem_cr1 = Convert.ToString((DateTime)resultadoconsulta["Dem_cr1"]);
}
else
{
objListarfinanceiro.Dem_cr1 = "";
}
if (EhCampoExistenteENaoDbNull(resultadoconsulta, "Ven_cr1"))
{
objListarfinanceiro.Ven_cr1 = Convert.ToString((DateTime)resultadoconsulta["Ven_cr1"]);
}
else
{
objListarfinanceiro.Ven_cr1 = "";
}
if (EhCampoExistenteENaoDbNull(resultadoconsulta, "Dec_cr1"))
{
objListarfinanceiro.Dec_cr1 = Convert.ToString((DateTime)resultadoconsulta["Dec_cr1"]);
}
else
{
objListarfinanceiro.Dec_cr1 = "";
}
if (EhCampoExistente(resultadoconsulta, "Vee_cr1")) { objListarfinanceiro.Vee_cr1 = Convert.ToDecimal(resultadoconsulta["Vee_cr1"]); }
if (EhCampoExistente(resultadoconsulta, "His_cr1")) { objListarfinanceiro.His_cr1 = (string)resultadoconsulta["His_cr1"]; }
if (EhCampoExistente(resultadoconsulta, "Nom_cl11")) { objListarfinanceiro.Nom_cl11 = (string)resultadoconsulta["Nom_cl11"]; }
if (EhCampoExistente(resultadoconsulta, "Emp_cr1")) { objListarfinanceiro.Emp_cr1 = Convert.ToDecimal(resultadoconsulta["Emp_cr1"]); }
if (EhCampoExistente(resultadoconsulta, "Var_cr1")) { objListarfinanceiro.Var_cr1 = Convert.ToDecimal(resultadoconsulta["Var_cr1"]); }
if (EhCampoExistente(resultadoconsulta, "C01_t01")) { objListarfinanceiro.C01_t01 = Convert.ToDecimal(resultadoconsulta["C01_t01"]); }
if (EhCampoExistente(resultadoconsulta, "C02_t02")) { objListarfinanceiro.C02_t02 = Convert.ToDecimal(resultadoconsulta["C02_t02"]); }
if (EhCampoExistente(resultadoconsulta, "C04_t04")) { objListarfinanceiro.C04_t04 = Convert.ToDecimal(resultadoconsulta["C04_t04"]); }
if (EhCampoExistente(resultadoconsulta, "Qta_sp2")) { objListarfinanceiro.Qta_sp2 = Convert.ToDecimal(resultadoconsulta["Qta_sp2"]); }
if (EhCampoExistente(resultadoconsulta, "Vtot_sp2")) { objListarfinanceiro.Vtot_sp2 = Convert.ToDecimal(resultadoconsulta["Vtot_sp2"]); }
if (EhCampoExistente(resultadoconsulta, "Vliq_sp2")) { objListarfinanceiro.Vliq_sp2 = Convert.ToDecimal(resultadoconsulta["Vliq_sp2"]); }
if (EhCampoExistente(resultadoconsulta, "N01_t01")) { objListarfinanceiro.N01_t01 = (string)resultadoconsulta["N01_t01"]; }
if (EhCampoExistente(resultadoconsulta, "Emp_sp1")) { objListarfinanceiro.Emp_sp1 = Convert.ToDecimal(resultadoconsulta["Emp_sp1"]); }
}3 - Classe Listarfinanceiro
public class Listarfinanceiro
{
private int cod_cr1;
private decimal doc_cr1;
private string dem_cr1;
private string dec_cr1;
private string ven_cr1;
private decimal vee_cr1;
private string his_cr1;
private string nom_cl11;
private decimal emp_cr1;
private decimal emp_sp1;
private decimal var_cr1;
private string n01_t01;
private decimal c01_t01;
private decimal c02_t02;
private decimal c04_t04;
private decimal qta_sp2;
private decimal vtot_sp2;
private decimal vliq_sp2;
public string N01_t01
{
get { return n01_t01; }
set { n01_t01 = value; }
}
public decimal C01_t01
{
get { return c01_t01; }
set { c01_t01 = value; }
}
public decimal C02_t02
{
get { return c02_t02; }
set { c02_t02 = value; }
}
public decimal C04_t04
{
get { return c04_t04; }
set { c04_t04 = value; }
}
public decimal Qta_sp2
{
get { return qta_sp2; }
set { qta_sp2 = value; }
}
public decimal Vtot_sp2
{
get { return vtot_sp2; }
set { vtot_sp2 = value; }
}
public decimal Vliq_sp2
{
get { return vliq_sp2; }
set { vliq_sp2 = value; }
}
public decimal Var_cr1
{
get { return var_cr1; }
set { var_cr1 = value; }
}
public decimal Emp_cr1
{
get { return emp_cr1; }
set { emp_cr1 = value; }
}
public decimal Emp_sp1
{
get { return emp_sp1; }
set { emp_sp1 = value; }
}
public int Cod_cr1
{
get { return cod_cr1; }
set { cod_cr1 = value; }
}
public decimal Doc_cr1
{
get { return doc_cr1; }
set { doc_cr1 = value; }
}
public string Dem_cr1
{
get { return dem_cr1; }
set { dem_cr1 = value; }
}
public string Dec_cr1
{
get { return dec_cr1; }
set { dec_cr1 = value; }
}
public string Ven_cr1
{
get { return ven_cr1; }
set { ven_cr1 = value; }
}
public string Nom_cl11
{
get { return nom_cl11; }
set { nom_cl11 = value; }
}
public decimal Vee_cr1
{
get { return vee_cr1; }
set { vee_cr1 = value; }
}
public string His_cr1
{
get { return his_cr1; }
set { his_cr1 = value; }
}
}Por que o preenchimento esta muito lento?
Abs
Fabricio Vale
Fabricio
Respostas
-
Fabrício,
tudo depende, quantas linhas esse SELECT retorna.
É preciso ter esse monte de "if/else" para preencher o objeto?
Não entendi o porquê de verificar se o valor no reader está vaio ou não. Deixa preencher a propriedade vazia mesmo.
Uma dica, evite usar ArrayList, ele é menos performático do que uma lista genérica por exemplo.
-
Boa tarde!
Funcionou Diego! Ficou muito show
Muito obrigado!Fabricio
- Marcado como Resposta Fabriciovale sexta-feira, 23 de outubro de 2015 17:49
Todas as Respostas
-
Fabrício,
tudo depende, quantas linhas esse SELECT retorna.
É preciso ter esse monte de "if/else" para preencher o objeto?
Não entendi o porquê de verificar se o valor no reader está vaio ou não. Deixa preencher a propriedade vazia mesmo.
Uma dica, evite usar ArrayList, ele é menos performático do que uma lista genérica por exemplo.
-
Diego bom dia!
O retorno do select é muito rápido.
Agora no caso do preenchimento do objeto que é muito lento.
Então qual seria a solução para o Arraylist?
e como ficaria o código acima. O que usar no lugar do Arraylist?
Att
Fabricio Vale
Fabricio
-
No lugar do ArrayList, use uma lista genérica...por exemplo
public class Cliente { public int Id {get;set;} public string Nome {get;set;} public int Idade {get;set;} }
Dai seu método ficaria assim
public List<Cliente> LerDadosCliente(SqlDataReader rd) { var clientesRetorno = new List<Cliente>(); while(dr.Read()) { var cliente = new Cliente(); cliente.Id= Int32.Parse(dr["Id"].ToString()); cliente.Nome = dr["Nome"].ToString(); cliente.Idade = Int32.Parse(dr["Idade"].ToString()); clientesRetorno.Add(cliente); } return clientesRetorno; }
dar vc recebe os dados assim:
var clientes = LerDadosCliente(rd);
Mais performático...
-
-
Boa tarde!
Funcionou Diego! Ficou muito show
Muito obrigado!Fabricio
- Marcado como Resposta Fabriciovale sexta-feira, 23 de outubro de 2015 17:49