none
Consulta SQL por por datas

    Question

  • Gente,

    Onde é que eu estou errando? Alguém poderia me ajudar a realizar esta consulta?

    Problema:
    Realizar uma consulta SQL no Access passando como parâmetros 2 datas: a inicial e a final.
    Segue o código:

    private void PesquisaData()
    {
    Os os = new Os
    ();   // Instancia da camada de  regra de negocios(set... get...)
    OsUtil osUtil = new OsUtil ();  //Instancia da camada de  regra de negocios(operações insert, delete, atualiza, consulta)  

    os.Data_recebimento = Convert .ToDateTime(MtbInicio.Text);
    os.Data_fechamento = Convert.ToDateTime(MtbFim.Text);

    DateTime varDataInicio = os.Data_recebimento;
    DateTime varDataFinal = os.Data_fechamento;  

    DataTable pesquisaDatas = osUtil.pesquisaData(varDataInicio, varDataFinal);  //Chamo a função pesquisaData e passo os parâmetros:
    DtgPesquisaData.DataSource = pesquisaDatas;

         Função pesquisaData na classe osUtil 

     

    public

    DataTable pesquisaData(DateTime dataInicio, DateTime dataFim)
    {
    string sql = "SELECT codigo, os_interna, data_recebimento, cliente, cidade, referencia, data_fechamento, valor_os FROM Os WHERE data_recebimento >= '"+ dataInicio +"' and data_fechamento <= '"+ dataFim +"' ";
    Banco bd = new Banco();
    return bd.consulta(sql);
    }

     

    Desde já agradeço, amigos

     

    • Edited by Guioday Wednesday, January 25, 2012 11:22 PM
    • Moved by Ari C. Raimundo Thursday, January 26, 2012 1:58 AM Movido para fórum apropriado (De:C#)
    Wednesday, January 25, 2012 11:01 PM

Answers

  • obs

    já troquei o

    sql = string.Format(sql, dataInicio.ToString("MM/dd/yyyy"), dataFim.ToString("MM/dd/yyyy"));

    por

    sql = string.Format(sql, dataInicio.ToString("dd/MM/yyyy"), dataFim.ToString("dd/MM/yyyy"));

    Abraços

    • Marked as answer by Guioday Saturday, January 28, 2012 3:36 PM
    Saturday, January 28, 2012 1:55 PM

All replies

  • Guioday,

    Não testei, mas provavelmente o erro está na utilização das aspas simples. Acho que o correto é usar # (cerquilha).

    PS: Estou movendo sua thread para o fórum de ADO.NET. Nas próximas vezes que tiver alguma dúvida relacionada a esse assunto poste por lá.

    Abraços.

    Ari C. Raimundo
    MCAD, MCTS
    http://araimundo.blogspot.com


    Thursday, January 26, 2012 1:52 AM
  • Olá Guioday,

    Faça assim e veja se ajuda:

     

    string sql = "SELECT codigo, os_interna, data_recebimento, cliente, cidade, referencia, data_fechamento, valor_os FROM Os WHERE data_recebimento >= '{0}' and data_fechamento <= '{1}' ";
    sql = string.Format(sql, dataInicio.ToString("yyyy/MM/dd hh:mm:ss"), dataFim.ToString("yyyy/MM/dd hh:mm:ss"));
    

     

    ps: cara, este não é o melhor jeito de efetuar consultas, vc corre o risco de sofrer SQL Injections. Pesquise sobre este problema. Fica a dica.

    []s!

     


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    Thursday, January 26, 2012 12:11 PM
    Moderator
  • Galera

    ainda sou estudante do 7@ período de sistemas de informação e não trabalho na área
    estou reaprendendo o C# basico
    tenho um sistema desenvolvido por mim
    tá tudo funcionando perfeitamente e com as consultas por parâmetros com fiz e descrição acima
    só nã oestou conseguindo efetuar a consulta por datas para terminar o sistema(preciso dela para dar andamento em outras coisas)

    Att
    guioday



    • Edited by Guioday Thursday, January 26, 2012 11:40 PM
    Thursday, January 26, 2012 11:30 PM
  • Galera

    De acordo com o Break Point, o erro está aqui:

    DataTable pesquisaDatas = osUtil.pesquisaData(varDataInicio, varDataFinal);  //Chamo a função pesquisaData e passo os parâmetros:na camada de banco(inserir, atualizar, deletar e consultar)


    Essa é a operação na camada de banco:

    public

    DataTable consulta(string sql)
    {
    DataTable dt = new DataTable ();
    OleDbDataAdapter da = new OleDbDataAdapter (sql, abreconexao());
    da.Fill(dt);// aqui devertia preecher o data table, mas dá o erro"tipo de dados incompatível na expressão de critério"
    return dt;

     


    • Edited by Guioday Thursday, January 26, 2012 11:43 PM
    Thursday, January 26, 2012 11:38 PM
  • Se eu não me engano, com datas no Access você coloca tralha no lugar das aspas simples:

    Tente assim:

    string sql = "SELECT codigo, os_interna, data_recebimento, cliente, cidade, referencia, data_fechamento, valor_os FROM Os WHERE data_recebimento >= #"+ dataInicio +"# and data_fechamento <= #"+ dataFim +"# ";
    



    Pedro Henrique B. Fernandes
    MCP - MCTS - MCPD, Web Applications With .Net Framework 4 Site: pedrofernandes.net
    Friday, January 27, 2012 12:26 AM
  • Olá,

    Não havia notado que era no Access, tente assim:

    string sql = "SELECT codigo, os_interna, data_recebimento, cliente, cidade, referencia, data_fechamento, valor_os FROM Os WHERE data_recebimento >= '{0}' and data_fechamento <= '{1}' ";
    sql = string.Format(sql, dataInicio.ToString("MM/dd/yyyy hh:mm:ss"), dataFim.ToString("MM/dd/yyyy hh:mm:ss"));
    

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Friday, January 27, 2012 12:33 AM
    Moderator
  • Obrigado amigos,

    vou testar mas para isso terei que mexer no modo em que estou fazendo a consulta.
    Se der certo avisarei....

     

    Abraços

    Saturday, January 28, 2012 12:38 AM
  • Bommmmm

    Tentei várias vezes, ...
    mas continua a mesma mensagem
    Tipo de dados incompatívelna expressão de critério

     

    aiai, viu!

    Saturday, January 28, 2012 2:18 AM
  • Olá Guioday,

    Poste seu código como esta agora na integra.

    Detalhe, tente variar o formato "MM/dd/yyyy hh:mm:ss" para "dd/MM/yyyy hh:mm:ss" ou "MM/dd/yyyy" ou "dd/MM/yyyy".

    Pois dependendo do idioma instalado do Office isto pode variar.

     

    []s!



    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    Saturday, January 28, 2012 2:24 AM
    Moderator
  • O sistema esta sendo feito em tres camadas:
    BancoMyTech, CRNBancoMyTech e MyTech...

    BancoMyTech

    //Classe Banco da camada BancoMyTech

     

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Data;

    using System.Data.OleDb;

     

    namespace BancoMyTech

    {

        public class Banco

        {

            // instanciando meu connection

            private OleDbConnection abreconexao()//sera criado um objeto chamado con do tipo odbc connection

            {

                OleDbConnection con = new OleDbConnection();

                con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\BancoMyTechAccess.accdb"; // atribuindo a string de conexao ao objeto

                con.Open();// abrindo a conexao e um metodo

                return con;// retorna o objeto con

            }

            // será feito 4 componentes command, data adapter,datareader e connection ja criado acima

            // instanciando meu command

            public void atualiza(string sql)// atualiza o banco e nao retorna nada

            {

                OleDbCommand comando = new OleDbCommand(sql, abreconexao());// criando objeto comando

                comando.ExecuteNonQuery();// insere atualiza

            }

     

            // instaciando datareader que recebe commad que das os comandos para ele ir ao banco e retornar

            public OleDbDataReader consultadr(string sql)

            {

                OleDbCommand comando = new OleDbCommand(sql, abreconexao());

                return comando.ExecuteReader();

            }

     

            public DataTable consulta(string sql)

            {

                DataTable dt = new DataTable();

                OleDbDataAdapter da = new OleDbDataAdapter(sql, abreconexao());

                da.Fill(dt);// data adapter preencher o data table

                return dt;

            }

        }

    }

     

    Saturday, January 28, 2012 1:40 PM
  • // chamada da função no evento clik do formulário

     

            public void BtnListar_Click(object sender, EventArgs e)

            {

                DateTime dataiInicio, datafFim;

                if (DateTime.TryParse(MtbInicio.Text.ToString(), out dataiInicio).Equals(true) &&

                    DateTime.TryParse(MtbFim.Text.ToString(), out datafFim).Equals(true))

                    if (dataiInicio > datafFim)

                    {

                        MessageBox.Show("A data de INICIO é maior que a data FINAL", "Atenção!!!", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        MtbFim.Text = "";

                        MtbInicio.Text = "";

                    }

                    else

                       

                        PesquisaDataFechamento(); 

            }

     

    private void PesquisaDataFechamento()

            {

           

                Os os = new Os();

                OsUtil osUtil = new OsUtil();

                os.Data_recebimento = Convert.ToDateTime(MtbInicio.Text.ToString());

                os.Data_fechamento = Convert.ToDateTime(MtbFim.Text.ToString());

                DateTime varDataInicio = os.Data_recebimento;

                DateTime varDataFinal = os.Data_fechamento;

                DataTable pesquisaDatas = osUtil.pesquisaData(varDataInicio, varDataFinal);

                DtgPesquisaData.DataSource = pesquisaDatas;

            }

     

     

    Camada de regra de negocio CRNBancoMyTech(Classes Os(set...get..)  e OsUtil(funções atualiza, delete, inserir, consultar))

    //Classe Os

     

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Data;

    using System.Data.Odbc;

    using BancoMyTech;

     

    namespace CRNBancoMyTech

    {

        public class Os

        {

            int codigo;

            public int Codigo

            {

                get { return codigo; }

                set { codigo = value; }

            }

     

            int os_interna;

            public int Os_interna

            {

                get { return os_interna; }

                set { os_interna = value; }

            }

     

            DateTime data_recebimento;

            public DateTime Data_recebimento

            {

                get { return data_recebimento; }

                set { data_recebimento = value; }

            }

     

            string cliente;

            public string Cliente

            {

                get { return cliente; }

                set { cliente = value; }

            }

     

            string cidade;

            public string Cidade

            {

                get { return cidade; }

                set { cidade = value; }

            }

     

            string telefones;

            public string Telefones

            {

                get { return telefones; }

                set { telefones = value; }

            }

     

            string obs_gerais;

            public string Obs_gerais

            {

                get { return obs_gerais; }

                set { obs_gerais = value; }

            }

     

            string detalhes;

            public string Detalhes

            {

                get { return detalhes; }

                set { detalhes = value; }

            }

     

            string referencia;

            public string Referencia

            {

                get { return referencia; }

                set { referencia = value; }

            }

     

     

            DateTime data_fechamento;

            public DateTime Data_fechamento

            {

                get { return data_fechamento; }

                set { data_fechamento = value; }

            }

     

            string estatus;

            public string Estatus

            {

                get { return estatus; }

                set { estatus = value; }

            }

     

            decimal valorServico;

            public decimal ValorServico

            {

                get { return valorServico; }

                set { valorServico = value; }

            }

           

        }

    }

     


    • Edited by Guioday Saturday, January 28, 2012 2:02 PM
    Saturday, January 28, 2012 1:44 PM
  • Olá Guioday,

    Tente fazer assim:

    DataTable pesquisaData(DateTime dataInicio, DateTime dataFim)
    {
    string sql = "SELECT codigo, os_interna, data_recebimento, cliente, cidade, referencia, data_fechamento, valor_os FROM Os WHERE data_recebimento >= #{0}# and data_fechamento <= #{1}# ";
    sql = string.Format(sql, dataInicio.ToString("yyyy-MM-dd hh:mm:ss"), dataFim.ToString("yyyy-MM-dd hh:mm:ss"));
    
    Banco bd = new Banco();
    return bd.consulta(sql);
    }
    

    As datas devem ficar entre "#" (cerquilhas)

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Saturday, January 28, 2012 1:48 PM
    Moderator
  • //Classe osUtil

     

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using BancoMyTech;

    using System.Data;

    using System.Data.Odbc;

    //using BancoMyTech;

     

    namespace CRNBancoMyTech

    {

       public class OsUtil

        {

            //Nessa classe voa ficar os metodos para adicionar, alterar, excluir e buscar os dados do banco de dados

            //Inicio do metodo para inserir os dados no banco

            public void Inserir(Os sh)

            {

                //Essa linha recebe os dados do formulario e envie para o Banco

                StringBuilder sb = new StringBuilder();

                //Nesta linha esta o comando sql para aderir os dados no banco e o nome dos campos do banco

                sb.Append("INSERT INTO Os(os_interna, data_recebimento, cliente, cidade, telefones, obs_gerais, detalhes, referencia, data_fechamento, status, valor_os)");

                //Essa linha recebe os dados que vao ser adicionados no banco

                sb.Append("VALUES('"+ @sh.Os_interna +"', '"+ @sh.Data_recebimento +"', '"+ @sh.Cliente +"', '"+ @sh.Cidade +"', '"+ @sh.Telefones +"', '"+ @sh.Obs_gerais +"', '"+ @sh.Detalhes +"', '"+ @sh.Referencia +"', '"+ @sh.Data_fechamento +"', '"+ @sh.Estatus +"', '"+ @sh.ValorServico + "')");

                //Essas 03 linhas nunca irão mudar pois passam as informacoes do banco

                string sql = sb.ToString();

                Banco bd = new Banco();

                bd.atualiza(sql);

            }

     

            public DataTable pesquisaEstatusOs(string Estatus)

            {

                //os comandos sql de consulta por nome da descricao do defeito do produto

                string sql = "SELECT  codigo, os_interna, data_recebimento, cliente, cidade, telefones, obs_gerais, detalhes, referencia, data_fechamento, status, valor_os FROM Os WHERE status LIKE '%"+Estatus+"%' ";

                Banco bd = new Banco();

                return bd.consulta(sql);

            }

     

            public DataTable pesquisaOsInterna(int Os_Interna)

            {

                //os comandos sql de consulta por nome da descricao do defeito do produto

                string sql = "SELECT  codigo, os_interna, data_recebimento, cliente, cidade, telefones, obs_gerais, detalhes, referencia, data_fechamento, status, valor_os FROM Os WHERE os_interna LIKE '%" + Os_Interna + "' ";

                Banco bd = new Banco();

                return bd.consulta(sql);

            }

     

           public DataTable pesquisaNomeCliente(string Nome_Cliente) 

           {

                //os comandos sql de consulta por nome da descricao do defeito do produto

                string sql = "SELECT  codigo, os_interna, data_recebimento, cliente, cidade, telefones, obs_gerais, detalhes, referencia, data_fechamento, status, valor_os FROM Os WHERE cliente LIKE '%"+ Nome_Cliente + "%' ";

                Banco bd = new Banco();

                return bd.consulta(sql);

            }

     

           public DataTable pesquisaReferencia(string Referencia)

           {

               //os comandos sql de consulta por nome da descricao do defeito do produto

               string sql = "SELECT  codigo, os_interna, data_recebimento, cliente, cidade, telefones, obs_gerais, detalhes, referencia, data_fechamento, status, valor_os FROM Os WHERE referencia LIKE '%"+ Referencia + "%' ";

               Banco bd = new Banco();

               return bd.consulta(sql);

           }

     

     

    // AQUI ESTÁ O ERRO DE RETORNO

    //*********************************************************************************

    //

           public DataTable pesquisaData(DateTime dataInicio, DateTime dataFim )

           {

               string sql = "SELECT codigo, os_interna, data_recebimento, cliente, cidade, referencia, data_fechamento, valor_os FROM Os WHERE data_recebimento >= '{0}' and data_fechamento <= '{1}' ";

               sql = string.Format(sql, dataInicio.ToString("MM/dd/yyyy"), dataFim.ToString("MM/dd/yyyy"));

               Banco bd = new Banco();

               return bd.consulta(sql);

     

    //*********************************************************************************

              

           }

     

     

     

           public void Atualizar(Os sh, int cod_os)

           {

               //os comandos sql de alteração e os campos que serao alterados

               string sql = @" UPDATE Os SET os_interna = '"+ @sh.Os_interna +"', data_recebimento ='"+ @sh.Data_recebimento +"', cliente ='"+ @sh.Cliente +"', cidade ='"+ @sh.Cidade +"', telefones ='"+ @sh.Telefones +"', obs_gerais ='"+ @sh.Obs_gerais +"', detalhes ='"+ @sh.Detalhes +"', referencia ='"+ @sh.Referencia +"', data_fechamento ='"+ @sh.Data_fechamento +"', status ='"+ @sh.Estatus +"', valor_os = '"+ @sh.ValorServico +"'   WHERE codigo =" + cod_os;

               //Essas duas linhas nao vao ser alteradas

               Banco bd = new Banco();

               bd.atualiza(sql);

           }

        }

    }

     

    Saturday, January 28, 2012 1:50 PM
  • obs

    já troquei o

    sql = string.Format(sql, dataInicio.ToString("MM/dd/yyyy"), dataFim.ToString("MM/dd/yyyy"));

    por

    sql = string.Format(sql, dataInicio.ToString("dd/MM/yyyy"), dataFim.ToString("dd/MM/yyyy"));

    Abraços

    • Marked as answer by Guioday Saturday, January 28, 2012 3:36 PM
    Saturday, January 28, 2012 1:55 PM
  • Chegou a trocar a query pela query abaixo, com cerquilhas?

    DataTable pesquisaData(DateTime dataInicio, DateTime dataFim)
    {
    string sql = "SELECT codigo, os_interna, data_recebimento, cliente, cidade, referencia, data_fechamento, valor_os FROM Os WHERE data_recebimento >= #{0}# and data_fechamento <= #{1}# ";
    sql = string.Format(sql, dataInicio.ToString("yyyy-MM-dd hh:mm:ss"), dataFim.ToString("yyyy-MM-dd hh:mm:ss"));
    
    Banco bd = new Banco();
    return bd.consulta(sql);
    }
    

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    • Marked as answer by Guioday Saturday, January 28, 2012 3:36 PM
    • Unmarked as answer by Guioday Saturday, January 28, 2012 3:36 PM
    • Proposed as answer by LetíciaF Friday, June 20, 2014 3:27 PM
    Saturday, January 28, 2012 1:57 PM
    Moderator
  •  

    // Funcionou assim:

    public

     

    DataTable pesquisaData(DateTime dataInicio, DateTime

    dataFim )

    {

     

    string sql = "SELECT codigo, os_interna, data_recebimento, cliente, cidade, referencia, data_fechamento, valor_os FROM Os WHERE data_recebimento >= #{0}# AND data_fechamento <= #{1}# "

    ;

    sql =

    string.Format(sql, dataInicio.ToString("dd/MM/yyyy"), dataFim.ToString("dd/MM/yyyy"

    ));

     

    Banco bd = new Banco

    ();

     

    return

    bd.consulta(sql);

     

    }

    

    Muito obrigado, Fernando.
    Rodou macio igual ao motor da minha Bross
    Foi um prazer termos conseguido resolver essa e poder contar com vc
    abraços

    Saturday, January 28, 2012 3:36 PM