Eu tenho uma tabela de dados com 5 colunas, onde uma linha está sendo preenchida com dados e salva no banco de dados por meio de uma transação.
Ao salvar, um erro é retornado:
A conversão de um tipo de dados datetime2 em um tipo de dados datetime resultou em um valor fora do intervalo
Implica, conforme lido, que minha tabela de dados tenha um tipo de DateTime2
e meu banco de dados a DateTime
; isso esta errado.
A coluna da data é configurada DateTime
como esta:
new DataColumn("myDate", Type.GetType("System.DateTime"))
Questão
Isso pode ser resolvido no código ou algo precisa ser alterado no nível do banco de dados?
fonte
Isso pode acontecer se você não atribuir um valor a um campo DateTime quando o campo não aceitar valores NULL .
Isso consertou para mim!
fonte
Tanto o
DATETIME
eDATETIME2
mapa paraSystem.DateTime
no .NET - você realmente não pode fazer uma "conversão", pois é realmente o mesmo tipo .NET.Consulte a página de documento do MSDN: http://msdn.microsoft.com/en-us/library/bb675168.aspx
Existem dois valores diferentes para "
SqlDbType
" para esses dois - você pode especificar aqueles em seuDataColumn
definição?MAS: no SQL Server, o período suportado é bem diferente.
DATETIME
suporta 1753/1/1 à "eternidade" (9999/12/31), enquantoDATETIME2
suporta 0001/1/1 por toda a eternidade.Portanto, o que você realmente precisa fazer é verificar o ano da data - se for antes de 1753, será necessário alterá-lo para algo após o 1753 para que o
DATETIME
coluna no SQL Server possa lidar com isso.Marc
fonte
DtInit = new System.DateTime(1492, 10, 12),
falha.No meu banco de dados do SQL Server 2008, eu tinha uma
DateTime
coluna sinalizada como não anulável, mas com umaGetDate()
função como seu valor padrão. Ao inserir um novo objeto usando o EF4, recebi esse erro porque não estava passando uma propriedade DateTime no meu objeto explicitamente. Eu esperava que a função SQL manipulasse a data para mim, mas isso não aconteceu. Minha solução foi enviar o valor da data do código em vez de confiar no banco de dados para gerá-lo.fonte
Nullable<DateTime>
e, no código, posso deixar isso verdadeiramente nulo (em vez de 01/01/0000). Fiquei agradavelmente surpreso ao ver que o EF para o SQL sabia ignorar esse nulo no INSERT e usar a data do servidor (GetDate()
) ... Para nós, isso era preferível, já que precisávamos de melhor consistência no servidor, sem nos preocuparmos com as diferenças de clock entre o servidor da web e o do servidor sql.para mim foi porque a data e hora eram ..
nesse caso, você deseja atribuir nulo a você Objeto EF DateTime ... usando meu código FirstYearRegistered como exemplo
fonte
Este estava me deixando louco. Eu queria evitar o uso de uma data e hora anulável (
DateTime?
). Eu também não tinha a opção de usar odatetime2
tipo do SQL Server 2008Acabei optando pelo seguinte:
fonte
[Column(TypeName = "datetime2")]
?Às vezes, a EF não sabe que está lidando com uma coluna computada ou um gatilho . Por design, essas operações definirão um valor fora do EF após uma inserção.
A correção é especificar
Computed
nos EFsedmx
para essa coluna naStoreGeneratedPattern
propriedadePara mim, foi quando a coluna teve um gatilho que inseriu a data e hora atuais, veja abaixo na terceira seção.
Etapas para resolver
No Visual Studio, abra a
Model Browser
página eModel
depoisEntity Types
-> entãoStoreGeneratedPattern
Computed
Para essa situação, outras respostas são soluções alternativas, pois o objetivo da coluna é ter uma hora / data especificada quando o registro foi criado, e essa é a tarefa do SQL executar um gatilho para adicionar a hora correta. Como este gatilho SQL:
DEFAULT (GETDATE()) FOR [DateCreated]
.fonte
GETDATE()
que literalmente fiz na época. Mas houve um comentário recente que se deve usarSYSDATETIME()
para qualquer operação DateTime2 que eu acredite ser verdadeira.Encontrei isso e adicionei o seguinte à minha propriedade datetime:
fonte
using System.ComponentModel.DataAnnotations.Schema;
é necessárioSe não passarmos um campo de data e hora, a data padrão {1/1/0001 12:00:00} será aprovada.
Mas essa data não é compatível com o trabalho de estrutura de entidade, portanto, ela lançará conversão de um tipo de dados datetime2 para um tipo de dados datetime, resultando em um valor fora do intervalo
Apenas
default DateTime.now
no campo da data, se você não estiver passando nenhuma data.fonte
O mais fácil seria alterar seu banco de dados para usar datetime2 em vez de datetime. A compatibilidade funciona bem e você não receberá seus erros.
Você ainda vai querer fazer vários testes ...
O erro é provavelmente porque você está tentando definir uma data para o ano 0 ou algo assim - mas tudo depende de onde você tem controle para alterar as coisas.
fonte
Eu encontrei este post tentando descobrir por que eu continuava recebendo o seguinte erro, explicado pelas outras respostas.
A conversão de um tipo de dados datetime2 em um tipo de dados datetime resultou em um valor fora do intervalo.
Use um objeto DateTime anulável.
DateTime público? PurchaseDate {get; conjunto; }
Se você estiver usando a estrutura da entidade, defina a propriedade anulável no arquivo edmx como True
fonte
Como o andyuk já apontou, isso pode acontecer quando um valor NULL é atribuído a um campo DateTime não anulável . Considere alterar DateTime para DateTime? ou Anulável < DateTime >. Lembre-se de que, caso você esteja usando uma propriedade de dependência , verifique também se o tipo da propriedade de dependência também é do tipo DateTime que pode ser nulo.
Abaixo está um exemplo da vida real de um DateTime incompleto para DateTime? ajuste de tipo que aumenta o comportamento ímpar
fonte
O Entity Framework 4 trabalha com o tipo de dados datetime2, portanto, em db, o campo correspondente deve ser datetime2 para o SQL Server 2008.
Para obter a solução, existem duas maneiras.
fonte
Criou uma classe base com base na implementação @ sky-dev. Portanto, isso pode ser facilmente aplicado a vários contextos e entidades.
Uso:
fonte
Adicione o atributo abaixo mencionado na propriedade na sua classe de modelo.
Inicialmente eu esqueci de adicionar este atributo. Então, no meu banco de dados, a restrição foi criada como
e eu adicionei esse atributo e atualizei meu banco de dados, depois ele foi alterado para
fonte
No meu caso, estávamos lançando uma data para uma data e hora e recebemos esse erro. O que acontece é que o Date tem um mínimo "mais orientado para o programador" de 01/01/0001, enquanto o Data e hora está bloqueado em 1753
Combine isso com um erro de coleta de dados de nossa parte e você terá sua exceção!
fonte
Às vezes, funciona bem em máquinas de desenvolvimento e não em servidores. No meu caso, eu tive que colocar:
No arquivo web.config.
O fuso horário na máquina (Servidor) estava correto (no local CO), mas o aplicativo Web não. Essa configuração foi concluída e funcionou bem novamente.
Obviamente, todas as datas tinham valor.
: D
fonte
A adição desse código a uma classe no ASP.NET funcionou para mim:
fonte
Estou ciente desse problema e vocês também devem estar:
https://en.wikipedia.org/wiki/Year_2038_problem
No SQL, um novo tipo de campo foi criado para evitar esse problema (datetime2).
Esse tipo de campo 'Data' tem os mesmos valores de intervalo que uma classe .net DateTime. Como resolverá todos os seus problemas, acho que a melhor maneira de resolvê-lo é alterar o tipo de coluna do banco de dados (não afetará os dados da tabela).
fonte
Confira os dois seguintes: 1) Este campo não possui valor NULL. Por exemplo:
Substitua para:
2) Novo banco de dados novamente. Por exemplo:
fonte
Problema com o atributo datetime herdado
Essa mensagem de erro geralmente é mostrada quando um campo de data não anulável tem valor nulo no momento da inserção / atualização. Uma causa pode ser herança.
Se sua data é herdada de uma classe base e você não faz um mapeamento, a EF não lerá seu valor.
Para obter mais informações: https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-concrete-type-tpc-and- escolhendo-diretrizes-estratégicas
fonte
Vi esse erro quando quis editar uma página usando o ASP.Net MVC. Não tive nenhum problema durante a criação, mas a atualização do banco de dados tornou minha propriedade DateCreated fora do intervalo!
Quando você não deseja que sua
DateTime
propriedade seja anulável e não deseja verificar se seu valor está no intervalo DateTime sql (e@Html.HiddenFor
não ajuda!), Basta adicionar umstatic DateTime
campo dentro da classe relacionada (Controller) e fornecer o valor quando GET está funcionando e use-o quando o POST estiver executando seu trabalho:fonte
Eu deparei com esse problema em um projeto de aplicativo de console simples e minha solução rápida é converter todas as datas possíveis datetime2 em um datetime nulo, executando este método:
Esse certamente não é um método completamente abrangente, mas funcionou para minhas necessidades e talvez ajude outras pessoas!
fonte
Verifique o formato req no DB. por exemplo, meu banco de dados tem valor padrão ou vinculação
(((1)/(1))/(1900))
fonte
você terá a coluna de data que foi configurada para determinar o valor mínimo do tempo de duração permitido, como 1/1/1001.
Para superar esse problema, você pode definir o valor de data e hora adequado para sua propriedade e também definir outra propriedade mágica como IsSpecified = true.
fonte