none
Select sem preenchimento de objeto RRS feed

  • 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

    quarta-feira, 21 de outubro de 2015 17:25

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.


    • Editado Marcos SJ quarta-feira, 21 de outubro de 2015 18:33 Edição
    • Marcado como Resposta Marcos SJ quarta-feira, 21 de outubro de 2015 18:33
    quarta-feira, 21 de outubro de 2015 17:54
  • Boa tarde!

    Funcionou Diego! Ficou muito show

    Muito obrigado!

    Fabricio

    • Marcado como Resposta Fabriciovale sexta-feira, 23 de outubro de 2015 17:49
    sexta-feira, 23 de outubro de 2015 17:48

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.


    • Editado Marcos SJ quarta-feira, 21 de outubro de 2015 18:33 Edição
    • Marcado como Resposta Marcos SJ quarta-feira, 21 de outubro de 2015 18:33
    quarta-feira, 21 de outubro de 2015 17:54
  • 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

    quinta-feira, 22 de outubro de 2015 11:00
  • 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...

    quinta-feira, 22 de outubro de 2015 11:09
  • Obrigado Diego...Vou testar e já te falo.

    Abs

    Att

    Fabricio Vale


    Fabricio

    quinta-feira, 22 de outubro de 2015 12:11
  • Boa tarde!

    Funcionou Diego! Ficou muito show

    Muito obrigado!

    Fabricio

    • Marcado como Resposta Fabriciovale sexta-feira, 23 de outubro de 2015 17:49
    sexta-feira, 23 de outubro de 2015 17:48