Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

@fabiosantosrj

SqlDateTime overflow

Recommended Posts

Prezados,

 

Estou com um problema referente a gravar data no banco de dados.

 

Possuo uma aplicação ainda em desenvolvimento em c# onde faz conexão com o banco de dados sql server 2005.

 

Já estava tudo testado e aprovado. Porém, a máquina foi formatada e quando foi tudo reinstalado de volta, começou a gerar o erro abaixo quando tento incluir algum registro que possua um campo datetime.

 

 

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

 

Fiz um teste com uma tabela de apenas um campo do tipo datetime e ele gravou numa boa. Mas, quando uso as outras tabelas que tem vários campos de vários tipos, sempre da o erro acima.

 

Já depurei os campos e todos estão preenchidos corretamente.

 

Já coloquei o usuário de banco de dados na lingua inglês e português e o erro é sempre o mesmo para as mesmas datas.

 

Tenho certeza que o usuário de banco de dados está correto, já foram feitos testes para validar.

 

O meu problema é apenas com insert/update para tabelas que possuem campo datetime.

 

O que eu preciso é saber uma forma de identificar a query que está sendo gerada pelo comando abaixo para que eu possa saber onde está o erro.

 

dc.submitchanges(); //onde dc é um datacontext de conexão ao banco de dados através de um dbml.

 

Fico no aguardo de um help. Já estou a mais de 24h atrás desse problema.

 

Ajudas como "coloque a data no formato yyyymmdd" não me ajudam porque eu não formato a data. Eu incluo numa propriedade do tipo DateTime do meu objeto e o datacontext é quem gera a query para manutenção no banco.

 

obrigado pela ajuda de quem puder...

Compartilhar este post


Link para o post
Compartilhar em outros sites

O erro ocorre por que algum campo DateTime não esta recebendo uma data, ou esta recebendo uma data fora do intervalo. 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Ivan,

 

Infelizmente não é esse o problema. Todos os campos estão preenchidos corretamente na classe.

Eu precisava ver o que o dc.submitchanges() está gravando para poder conseguir entender o problema.

Você sabe como vejo isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não tem como ver, então, deve ser algo na questão da globalização, tipo você esta passando pra ele, uma data no formato ddmmyyyy e ele esta querendo mmddyyyy.

 

No seu web.config está definido: <globalization culture="pt-BR" requestEncoding="utf-8" responseEncoding="utf-8" uiCulture="pt-BR"/>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na string de conexão da sua base add "Language=portuguese;" como no exemplo abaixo:

<add name="LocalSqlServer" connectionString="Data Source=localhost;Initial Catalog=DB;User ID=sa;Password=123456;Language=portuguese;" providerName="System.Data.SqlClient" />

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Ivan,

 

Obrigado pela resposta.

O meu web.config já possui sim essa tag com essas propriedades.

 

Coloquei o código abaixo só para ter uma noção do que estou fazendo:

 

"

API.Propriedades.NotaFiscal notaFiscalTmp = Get(notaFiscal.idNotaFiscal);

notaFiscalTmp.dataVencimento = notaFiscal.dataVencimento;

notaFiscalTmp.descricao = notaFiscal.descricao;

notaFiscalTmp.numeroSerie = notaFiscal.numeroSerie;

notaFiscalTmp.tipoNota = notaFiscal.tipoNota;

notaFiscalTmp.valor = notaFiscal.valor;

notaFiscalTmp.idCliente = notaFiscal.idCliente;

notaFiscalTmp.idFornecedor = notaFiscal.idFornecedor;

notaFiscalTmp.idObra = notaFiscal.idObra;

notaFiscalTmp.idObraServico = notaFiscal.idObraServico;

notaFiscalTmp.valorMaterial = notaFiscal.valorMaterial;

notaFiscalTmp.valorMO = notaFiscal.valorMO;

Global.db.SubmitChanges();

"

Além do campo dataVencimento, existe o campo dataCadastro que também é no formato datetime.

Mas, já verifiquei e no notaFiscalTmp os dois campos estão preenchidos com a data correta e no formato ddmmyyyy

 

O usuário do banco de dados no sqlserver que é usado na conexão, também está em pt no formato de data ddmmyyyy

 

obrigado

 

Olá Ivan,

 

Fiz um teste agora dessa forma:

 

API.Propriedades.NotaFiscal notaFiscalTmp = Get(1);

Global.db.SubmitChanges();

 

O objetivo dessas duas linhas é que ele lê o registro de ID 1 e atualiza com os mesmos dados.

Deu o mesmo erro de data. Como pode?

Em tabelas que não tem o campo data, não da erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na string de conexão da sua base add "Language=portuguese;" como no exemplo abaixo:

<add name="LocalSqlServer" connectionString="Data Source=localhost;Initial Catalog=DB;User ID=sa;Password=123456;Language=portuguese;" providerName="System.Data.SqlClient" />

 

Oi Ivan,

 

Coloquei o language no final e reiniciei a aplicacao. o erro persiste.

 

obrigado pela ajuda até aqui.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara então é o seguinte, o problema é com a data pois seu Banco esta setado para receber datas como mmddyyy e você esta passando ao contrario.

O que você pode fazer é formatar a data no codigo, ou ver alguma config nesse novo windows instalado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenho certeza que é algo com a aplicação.

No banco se eu logo com o mesmo usuário e faço:

 

insert into notafiscal (campos...) values (..., '29/12/2010 14:30:29')... funciona

 

ou seja, o banco está recebendo datas em PT corretamente. A aplicação é que por algum motivo está fazendo com que o banco só aceite a data mmddyyyy. pelo menos essa é a reclamação da mesangem.

 

a questão é que já rodei tudo (pelo menos eu acho) e não encontro onde isso possa estar configurado.

 

- o windows é em pt e as configs regionais estao em pt

- o Visual Studio está em inglês. Eu estou rodando direto pelo visual studio + firefox

- o sql server está em ingles e o padrao do language é em ingles. Mas, o usuario de conexao está com o language em PT. Inclusive já rodei pela aplicacao o "select @@language" e retornou em PT. O que significa que o usuario de banco de dados que a aplicacao usa está com o language em PT

- já tenho no webconfig a tag de globalization em PT

- a string de conexao ja tem o language em pt

- o debug do objeto me mostra os valores todos em ddmmyyyy

 

Fiz um teste final agora. Criei uma tabela teste(registro int (autonumerico), campo1 datetime). e executei os comandos abaixo:

 

	System.Collections.Generic.IEnumerable<Int32> sql = API.Global.db.ExecuteQuery<Int32>("Select DatePart(Month, '1/2/2000') ");
	foreach (Int32 s in sql) txtDescricao.Text = s.ToString();

	API.Propriedades.teste teste = new API.Propriedades.teste();
	teste.campo1 = DateTime.Now;
	API.Global.db.testes.InsertOnSubmit(teste);
	API.Global.db.SubmitChanges();

	var query = from API.Propriedades.teste t in API.Global.db.testes
	select t;
	API.Propriedades.teste teste1 = query.FirstOrDefault<API.Propriedades.teste>();
	teste1.campo1 = Convert.ToDateTime("30/12/2010");
	API.Global.db.SubmitChanges();

 

o resultado foi:

txtDescricao.text = 2 // o que comprova que ele está pegando o mês corretamente na leitura do datepart()

registro incluido = 2010-12-30 15:31:21.530 // o que significa que incluiu o datetime.now corretamente

registro alterado = 2010-12-30 00:00:00.000 // o que significa que alterou a data em PT corretamente

 

Tendo esse teste feito, eu suponho que não esteja gravando o registro em mmddyyyy. Então pq no resto da aplicação essa mensagem de erro ocorre?

 

obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

verifiquei o seguinte:

 

a minha API fica em outro peojeto porem no mesma solução do arquivo aspx. Tá isso eu já sabia é claro.

porém, o teste de inserir dados de data na tabela teste só funciona quando usado no arquivo aspx.

se uso no arquivo cs da API da o erro em questão.

 

já rodei tudo e tudo aponta para o mesmo datacontext usado no aspx que é o api.global.db ... então, onde pode estar o erro nessa API que não está usando a data corretamente ?

 

obrigaodo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Verifica nessa API como ela acessa a base? Qual string ela acessa? se esta declarado algum Culture.

 

Olá,

 

Feliz ano novo.

Já verifiquei sim. está com o culture correto, tem o language na connectionstring, que é a mesma do web.config do arquivo aspx.

 

tá complicado esse...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Feliz ano novo pra você tb, você vai fazer o seguinte, debuga, e quando chegar no código antes do SubmitChanges, você vai conseguir ver a string SQL gerada ai você copia e tenta executar dentro o sql, tem alguma data errada ai so falta indentificar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Feliz ano novo pra você tb, você vai fazer o seguinte, debuga, e quando chegar no código antes do SubmitChanges, você vai conseguir ver a string SQL gerada ai você copia e tenta executar dentro o sql, tem alguma data errada ai so falta indentificar.

 

Olá Ivan,

 

A minha questão é exatamente essa. Eu não sei onde pegar a sql gerada pelo datacontext antes do submitchange().

Já debuguei o datacontext e não encontrei nenhuma opção.

Se eu descobrir como fazer isso, mato o meu problema.

 

abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então cara, da pra ver, tem que dar uma fussada ai. Qualquer coisa uma solução é usar SQL Profile ele mostra todas as instruções SQL em execução no momento.

 

Cara, acabei de ter o mesmo problema, vou analisar e jaja te falo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então cara, da pra ver, tem que dar uma fussada ai. Qualquer coisa uma solução é usar SQL Profile ele mostra todas as instruções SQL em execução no momento.

 

Cara, acabei de ter o mesmo problema, vou analisar e jaja te falo.

 

Olá Ivan,

 

Eu consegui buscar a query pelo sql profiler do sqlserver 2005.

 

exec sp_executesql N'INSERT INTO [dbo].[teste]([campo1])
VALUES (@p0)

SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]',N'@p0 datetime',@p0='2011-01-04 11:07:33:893'

 

porém, ao executá-la conectado com o mesmo usuário, a query executa e grava o registro numa boa se rodo pelo management Studio.

 

Mas, se rodo no meu VS2008 no sql profiler, ela executa o rollback logo após a execução dessa query acima.

 

Cara... nunca tive tanto problema com data :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara sabe o que eu fiz que resolveu, abri o arquivo DBML, apaguei todas as tabelas, adicionei de novo e resolveu!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.