none
Consuta por Data RRS feed

  • Pergunta

  • Boa noite Pessoal...

    Estou com problema para fazer consulta por datas, fiz o seguinte metodo porém não está correto...

    Data de Parametro: 07/10/2011 - Inicio e Fim

    Erro: SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.

    Camada DaL

    public SqlDataReader consultaVendas(DateTime Dataini, DateTime Datafim)
    {
    SqlConnection cn = new SqlConnection();
    
    VendasInformation venda = new VendasInformation();
    
    try
    {
    cn.ConnectionString = Dados.StringDeConexao;
    
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = cn;
    
    cmd.CommandType = CommandType.Text;
    
    cmd.CommandText = (SELECT * FROM Vendas WHERE DATA >= CONVERT(Varchar(10), @Dataini, 111) AND DATA <= CONVERT(Varchar(10), @Datafim, 111);
    cmd.Parameters.AddWithValue(@Dataini, venda.Data);
    cmd.Parameters.AddWithValue(@Datafim, venda.Data);
    
    cn.Open(); 
    
    SqlDataReader Leitor;
    
    Leitor = cmd.ExecuteReader();
    
    while (Leitor.Read())
    {
    venda.Codigo = Convert.ToInt32(Leitor[CODIGO]);
    venda.Data = Convert.ToDateTime(Leitor[DATA]);
    venda.Quantidade = Convert.ToInt32(Leitor[QUANTIDADE]);
    venda.Faturado = Convert.ToBoolean(Leitor[FATURADO]);
    venda.Codigocliente = Convert.ToInt32(Leitor[CODIGOCLIENTE]);
    venda.Codigoproduto = Convert.ToInt32(Leitor[CODIGOPRODUTO]);
    }
    
    return Leitor;
    }
    catch (SqlException ERR)
    {
    throw new Exception(ERRO NA CONEXÃO + ERR.Message);
    }
    finally
    {
    cn.Close();
    }
    }
    
    }
    
    


     Camada BLL

    public SqlDataReader consultaVendas(DateTime Dataini, DateTime Datafim)
    {
    return ObjDAL.consultaVendas(Dataini, Datafim);
    }
    

    Camada UI

    VendasInformation venda = new VendasInformation();
    
    DateTime Dataini = DateTime.Parse(TxtDataini.Text, dd/MM/yyyy);
    DateTime Datafim = DateTime.Parse(TxtDatafim.Text, dd/MM/yyyy);
    
    VendasBLL dados = new VendasBLL();
    dados.consultaVendas(Dataini, Datafim);
    
    TxtCodigo.Text = Convert.ToString(venda.Codigo);
    TxtQuantidade.Text = Convert.ToString(venda.Quantidade);
    TxtFaturado.Text = Convert.ToString(venda.Faturado);
    TxtCocCliente.Text = Convert.ToString(venda.Codigocliente);
    TxtCodProduto.Text = Convert.ToString(venda.Codigoproduto);
    TxtData.Text = Convert.ToString(venda.Data);
    

    Pessoal me ajudem por favor

    quinta-feira, 22 de dezembro de 2011 01:46

Todas as Respostas

  • @Alan

    Veja a solucao: http://stackoverflow.com/questions/468045/error-sqldatetime-overflow-must-be-between-1-1-1753-120000-am-and-12-31-999

     


    One word frees us of all the weight and pain of life: that word is love.
    quinta-feira, 22 de dezembro de 2011 06:27
  • Veja assim

     (SELECT * FROM Vendas WHERE DATA >= CONVERT(Varchar(10), @Dataini, 103) AND DATA <= CONVERT(Varchar(10), @Datafim, 103);


    Não esqueça de usar o componente </> na barra para posta seu código. Microsoft MCPD,MCTS,MCC
    quinta-feira, 22 de dezembro de 2011 12:02
  • Então devo mandar o parametro como string ou como datetime ? O formato deve ser DIA/MES/ANO...

    Na minha base SQL o campo DATA é Datetime...

    Obrigado!

    quinta-feira, 22 de dezembro de 2011 12:22
  • Alguém ?   :(

     

    Obrigado!

    segunda-feira, 26 de dezembro de 2011 11:39
  • Alan,

    Tente desta forma:

    SqlCommand cmd = new SqlCommand();
    cmd.CommandText = "SELECT * FROM Vendas WHERE DATA >= @Dataini AND DATA <= @Datafim";
    cmd.Parameters.AddWithValue("@Dataini", venda.Data);
    cmd.Parameters.AddWithValue("@Datafim", venda.Data);
    

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique
    segunda-feira, 26 de dezembro de 2011 22:43
    Moderador
  • blz vou tentar, mas como devo enviar o parâmetro, DD/MM/YYYY mesmo o banco sendo ANO/MES/DIA  HH:MM:SS ???

    No banco de dados SQL está assim: 2011-11-07 00:00:00 

     

    Obrigado Pessoal

    terça-feira, 27 de dezembro de 2011 14:03
  • Olá Alan,

    A o formato de hora será formatado corretamente. Basta que o tipo de dados do atributo Data da classe Venda seja DateTime.

    Como prova da formatação eu acabei de criar um exemplo que comprova isso, segue o fonte que utilizei para os testes que acabei de realizar.

    string connectionString = @"Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=dbCommerceSample;Data Source=.\SQLExpress";
    
    SqlConnection cn = new SqlConnection();
    DateTime x1 = new DateTime(2011, 11, 26, 13, 00, 00);
    DateTime x2 = x1.AddDays(1);
    
    cn.ConnectionString = connectionString;
    
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = cn;
    
    cmd.CommandType = CommandType.Text;
    
    cmd.CommandText = "SELECT * FROM \"Order\" WHERE Created >= @Dataini AND Created <= @Datafim";
    cmd.Parameters.AddWithValue("@Dataini", x1);
    cmd.Parameters.AddWithValue("@Datafim", x2);
    
    cn.Open();
    
    SqlDataReader Leitor;
    
    Leitor = cmd.ExecuteReader();
    
    if (Leitor.HasRows)
        Console.WriteLine("Possui linhas");
    else
        Console.WriteLine("Não possui linhas");
    


    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique
    terça-feira, 27 de dezembro de 2011 15:50
    Moderador
  • Então alterei a Camada DAL e agora está trazendo as informações tudo com zero...Creio que seja a Query que passo para o Banco de Dados:

    Camada DAL:
    public SqlDataReader consultaVendas(DateTime Dataini, DateTime Datafim)
    {
    SqlConnection cn = new SqlConnection();
    
    VendasInformation venda = new VendasInformation();
    
    venda.Data = Dataini;
    venda.Data = Datafim;
    
    try
    {
    cn.ConnectionString = Dados.StringDeConexao;
    
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = cn;
    
    cmd.CommandType = CommandType.Text;
    
    
    cmd.CommandText = (SELECT * FROM Vendas WHERE DATA between CONVERT(Varchar(10), @Dataini, 103) AND CONVERT(Varchar(10), @Datafim, 103));
    cmd.Parameters.AddWithValue(@Dataini, venda.Data);
    cmd.Parameters.AddWithValue(@Datafim, venda.Data);
    
    cn.Open(); 
    
    SqlDataReader Leitor;
    
    Leitor = cmd.ExecuteReader();
    
    while (Leitor.Read())
    {
    venda.Codigo = Convert.ToInt32(Leitor[CODIGO]);
    venda.Data = Convert.ToDateTime(Leitor[DATA]);
    venda.Quantidade = Convert.ToInt32(Leitor[QUANTIDADE]);
    venda.Faturado = Convert.ToBoolean(Leitor[FATURADO]);
    venda.Codigocliente = Convert.ToInt32(Leitor[CODIGOCLIENTE]);
    venda.Codigoproduto = Convert.ToInt32(Leitor[CODIGOPRODUTO]);
    }
    
    return Leitor;
    }
    catch (SqlException ERR)
    {
    throw new Exception(ERRO NA CONEXÃO + ERR.Message);
    }
    finally
    {
    cn.Close();
    }
    }
    

    Tenho somente três informações no banco SQL:

    2011-11-07 19:54:09.657
    2011-11-10 22:30:23.493 
    2011-11-10 22:32:26.430

    Estou passado o parametro de Data assim DD/MM/YYYY - 07/11/2011 - Dataini e Datafim

    Me ajudem por favor pessoal.

    Vlw pela ajuda
    segunda-feira, 2 de janeiro de 2012 15:44

  • Olá Alan,

    Testei sua query e estava recebendo o seguinte erro:

    The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.


    Então adaptei a query para isso:

    cmd.CommandText = "SELECT * FROM Vendas WHERE DATA between @Dataini AND @Datafim";
    
    

    O framework formatará os valores passados por parâmetro para o tipo de dados dos campos.

    []s!
    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique
    segunda-feira, 2 de janeiro de 2012 16:46
    Moderador
  • Então tentei dessa forma, mas não consegui também, retorna null no campos e na DATA ele passa 1/1/2011 12:00..

    Fiz a camada DAL diferente:

    public DataTable consultaVendas(DateTime Dataini, DateTime Datafim)
            {
                SqlConnection cn = new SqlConnection();
                cn.ConnectionString = Dados.StringDeConexao;
    
                VendasInformation venda = new VendasInformation();
    
                venda.Data = Dataini;
                venda.Data = Datafim;
    
                SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM VENDAS WHERE CONVERT(VarChar(10), Data, 103) >= '@Dataini' AND CONVERT(Varchar(10), Data, 103) <= '@Datafim'", cn);
    
                DataTable dt = new DataTable();
    
                da.Fill(dt);
    
                return dt;
                                
                }
        }
    

    Porem não retorna nenhum dado para a Gridview...Mas se eu executar o SQL direto no banco de dados ele retorna o dado correto....

    Desculpa galera, mas não sei onde pode estar errado...

    Me ajudem por favor....

    terça-feira, 3 de janeiro de 2012 01:20
  • Olá,

    Neste bloco que vc postou por último faltou a passagem de parâmetros para o comando.

    public DataTable consultaVendas(DateTime Dataini, DateTime Datafim)
    {
    SqlConnection cn = new SqlConnection();
    cn.ConnectionString = Dados.StringDeConexao;
    
    VendasInformation venda = new VendasInformation();
    
    venda.Data = Dataini;
    venda.Data = Datafim;
    
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = cn;
    
    cmd.CommandType = CommandType.Text;
    
    cmd.CommandText = "SELECT * FROM VENDAS WHERE CONVERT(VarChar(10), Data, 103) >= '@Dataini' AND CONVERT(Varchar(10), Data, 103) <= '@Datafim'";
    cmd.Parameters.AddWithValue(@Dataini, venda.Data);
    cmd.Parameters.AddWithValue(@Datafim, venda.Data);
    
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    
    DataTable dt = new DataTable();
    
    da.Fill(dt);
    
    return dt;
    }
    


    Alan, se este exemplo não funcionar nos mande a estrutura de sua tabela.

    Essa consulta é extremamente simples.

    Tem algo errado na estrutura, na passagem de valores ou nos dados da tabela.

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique
    terça-feira, 3 de janeiro de 2012 02:31
    Moderador
  • Testei e se eu passar a data como Dia 07 / Mes 11 / Ano 2011 ele não consegue recuperar os dados.

    Mas quando coloco 11/07/2011  MM/dd/yyyy, ele consegue recuperar corretamente..

    Teria como eu converter essa data para reconhecer como padrão brasileiro dd/MM/yyyy ?

    Outra coisa se no dataini eu coloco 11/07/2011  e Datafim 11/10/2011 e só traz somente o Datafim, porem existe na base também o dia 07, então deveria trazer os três resultados correto ?

    Banco SQL:

    2011-11-07 19:54:09.657
    2011-11-10 22:30:23.493 
    2011-11-10 22:32:26.430

    Me ajudem pessoal.

    Obrigado mesmo pela ajuda!

    quarta-feira, 4 de janeiro de 2012 14:11
  • Olá Alan,

    Veja se assim funciona:

    SqlConnection cn = new SqlConnection();
    
    VendasInformation venda = new VendasInformation();
    
    cn.ConnectionString = Dados.StringDeConexao;
    
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = cn;
    
    cmd.CommandType = CommandType.Text;
    
    cmd.CommandText = "SELECT * FROM Vendas WHERE DATA >= '11/07/2011' AND DATA <= '12/31/2011'";
    
    cn.Open(); 
    
    SqlDataReader Leitor;
    
    Leitor = cmd.ExecuteReader();
    
    while (Leitor.Read())
    {
    venda.Codigo = Convert.ToInt32(Leitor[CODIGO]);
    venda.Data = Convert.ToDateTime(Leitor[DATA]);
    venda.Quantidade = Convert.ToInt32(Leitor[QUANTIDADE]);
    venda.Faturado = Convert.ToBoolean(Leitor[FATURADO]);
    venda.Codigocliente = Convert.ToInt32(Leitor[CODIGOCLIENTE]);
    venda.Codigoproduto = Convert.ToInt32(Leitor[CODIGOPRODUTO]);
    }
    
    return Leitor;
    


    Se objervar, verá que a query SQL esta com as datas fixas. Se funcionar desta forma então poderemos incluir os parâmetros de acordo com este formato. :)

    Se não funcionar, tente fazer alguns experimentos modificando o formato da data até que de certo.

    ps.: Tente trocar a aspa simples (') que fica em volta da data por cerquilha (#) caso não funcionar.

     

    Eu acredito que o formato seja assim mesmo, não acredito que de para mudar pq isso é nativo da linguagem com o Access

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique
    quarta-feira, 4 de janeiro de 2012 15:18
    Moderador