Inquiridor
Consuta por Data

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 BLLpublic 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
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. -
-
-
-
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 -
-
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 -
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 -
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 -
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....
-
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 -
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.430Me ajudem pessoal.
Obrigado mesmo pela ajuda!
-
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