La conversione di un tipo di dati datetime2 in un tipo di dati datetime produce un valore fuori intervallo

Ho un datatable con 5 colonne, in cui una riga viene riempita di dati e poi salvata nel database tramite una transazione.

Durante il salvataggio, viene restituito un errore:

La conversione di un tipo di dati datetime2 in un tipo di dati datetime ha comportato un valore fuori intervallo

Implica, come letto, che il mio datatable ha un tipo di DateTime2 e il mio database un DateTime ; Questo è sbagliato.

La colonna della data è impostata su un DateTime come questo:

new DataColumn("myDate", Type.GetType("System.DateTime"))

Domanda

Può essere risolto in codice o qualcosa deve essere modificato a livello di database?

Che tipo di date hai nella colonna?

Tutti si adattano all’intervallo del tipo?


Per inciso, il modo corretto per ottenere un object Type per il costruttore DataColumn è la parola chiave typeof , che è più veloce di ordini di grandezza.

Pertanto, per creare la colonna, è necessario scrivere

 new DataColumn("myDate", typeof(DateTime)) 

Ciò può accadere se non si assegna un valore a un campo DateTime quando il campo non accetta valori NULL.

Questo lo ha risolto per me!

Sia DATETIME che DATETIME2 a System.DateTime in .NET – non si può davvero fare una “conversione”, poiché è in realtà lo stesso tipo .NET.

Vedere la pagina del documento MSDN: http://msdn.microsoft.com/en-us/library/bb675168.aspx

Esistono due valori diversi per ” SqlDbType ” per questi due: è ansible specificare quelli nella definizione DataColumn ?

MA: su SQL Server, l’intervallo di date supportato è abbastanza diverso.

DATETIME supporta 1753/1/1 per “eternità” (9999/12/31), mentre DATETIME2 supporta 0001/1/1 per l’eternità.

Quindi quello che devi veramente fare è controllare l’anno della data – se è prima del 1753, devi cambiarlo in qualcosa DOPO 1753 in modo che la colonna DATETIME in SQL Server possa gestirlo.

Marc

Nel mio database di SQL Server 2008, avevo una colonna DateTime contrassegnata come non annullabile, ma con una funzione GetDate() come valore predefinito. Quando inserisco un nuovo object usando EF4, ho ricevuto questo errore perché non stavo passando una proprietà DateTime sul mio object esplicitamente. Mi aspettavo che la funzione SQL gestisse la data per me, ma non è così. La mia soluzione era di inviare il valore della data dal codice invece di affidarsi al database per generarlo.

 obj.DateProperty = DateTime.now; // C# 

per me era perché il datetime era ..

01/01/0001 00:00:00

in questo caso si desidera assegnare null all’object EF DateTime … utilizzando il mio codice FirstYearRegistered come esempio

 DateTime FirstYearRegistered = Convert.ToDateTime(Collection["FirstYearRegistered"]); if (FirstYearRegistered != DateTime.MinValue) { vehicleData.DateFirstReg = FirstYearRegistered; } 

Questo mi stava facendo impazzire. Volevo evitare di usare una dataend nullable ( DateTime? ). Non avevo nemmeno la possibilità di utilizzare il tipo datetime2 di SQL Server 2008

 modelBuilder.Entity().Property(e => e.MyDateColumn).HasColumnType("datetime2"); 

Alla fine ho optato per il seguente:

 public class MyDb : DbContext { public override int SaveChanges() { UpdateDates(); return base.SaveChanges(); } private void UpdateDates() { foreach (var change in ChangeTracker.Entries()) { var values = change.CurrentValues; foreach (var name in values.PropertyNames) { var value = values[name]; if (value is DateTime) { var date = (DateTime)value; if (date < SqlDateTime.MinValue.Value) { values[name] = SqlDateTime.MinValue.Value; } else if (date > SqlDateTime.MaxValue.Value) { values[name] = SqlDateTime.MaxValue.Value; } } } } } } 

A volte EF non sa che si tratta di una colonna calcasting o di un trigger . In base alla progettazione, tali operazioni imposteranno un valore al di fuori di EF dopo un inserimento.

La correzione è di specificare Computed in edmx per quella colonna nella proprietà StoreGeneratedPattern .

Per me è stato quando la colonna aveva un trigger che inseriva la data e l’ora correnti, vedi sotto nella terza sezione.


Passi da risolvere

In Visual Studio, apri la pagina Model Browser Model quindi Model quindi Entity Types -> quindi

  1. Selezionare l’ quadro e la proprietà di data e ora
  2. Seleziona StoreGeneratedPattern
  3. Imposta su Computed

Finestra di dialogo Tipo entità modello modello EF


Per questa situazione, altre risposte sono soluzioni alternative, poiché lo scopo della colonna è quello di specificare un’ora / data al momento della creazione del record e che è compito di SQL eseguire un trigger per aggiungere l’ora corretta. Come questo trigger SQL:

DEFAULT (GETDATE()) FOR [DateCreated] .

Se non passiamo un campo data ora a data ora, verrà passata la data predefinita {1/1/0001 12:00:00 AM}.

Ma questa data non è compatibile con il lavoro con frame quadro, quindi la conversione di un tipo di dati datetime2 in un tipo di dati datetime ha come risultato un valore fuori intervallo

Basta default DateTime.now sul campo della data se non stai passando nessuna data.

 movie.DateAdded = System.DateTime.Now 

Mi sono imbattuto in questo e aggiunto quanto segue alla mia proprietà datetime:

  [Column(TypeName = "datetime2")] public DateTime? NullableDateTimePropUtc { get; set; } 

La cosa più semplice sarebbe cambiare il tuo database per usare datetime2 invece di datetime. La compatibilità funziona bene e non otterrai i tuoi errori.

Avrai ancora voglia di fare un sacco di test …

L’errore è probabilmente dovuto al fatto che stai provando a impostare una data per l’anno 0 o qualcosa del genere, ma tutto dipende da dove hai il controllo per cambiare le cose.

Ho trovato questo post cercando di capire perché ho continuato ad ottenere il seguente errore, che è spiegato dalle altre risposte.

La conversione di un tipo di dati datetime2 in un tipo di dati datetime ha comportato un valore fuori intervallo.

Utilizzare un object DateTime nullable.
DateTime pubblico? PurchaseDate {get; impostato; }

Se si utilizza il framework di quadro Impostare la proprietà nullable nel file edmx su True

Imposta la proprietà nullable nel file edmx su ** True **

Entity Framework 4 funziona con il tipo di dati datetime2, quindi in db il campo corrispondente deve essere datetime2 per SQL Server 2008.

Per ottenere la soluzione ci sono due modi.

  1. Per utilizzare il tipo di dati datetime in Entity Framwork 4, è necessario passare ProviderManifestToken nel file edmx in “2005”.
  2. Se si imposta il campo corrispondente come Allow Null (lo converte in NULLABLE), quindi EF utilizza automaticamente gli oggetti data come datetime.

Come già indicato da andyuk , ciò può accadere quando un valore NULL viene assegnato a un campo DateTime non nullable. Valuta la possibilità di cambiare DateTime in DateTime? o Nullable < DateTime >. Tenere presente che, nel caso in cui si stia utilizzando una proprietà dipendenza , è necessario assicurarsi che anche il tipo di proprietà della dipendenza sia un tipo DateTime nullabile.

Di seguito è riportato un esempio di vita reale di DateTime in DateTime incompleto ? tipo di regolazione che solleva il comportamento dispari

inserisci la descrizione dell'immagine qui

Creata una class base basata sull’implementazione di @ sky-dev. Quindi questo può essere facilmente applicato a più contesti ed entity framework.

 public abstract class BaseDbContext : DbContext where TEntity : class { public BaseDbContext(string connectionString) : base(connectionString) { } public override int SaveChanges() { UpdateDates(); return base.SaveChanges(); } private void UpdateDates() { foreach (var change in ChangeTracker.Entries()) { var values = change.CurrentValues; foreach (var name in values.PropertyNames) { var value = values[name]; if (value is DateTime) { var date = (DateTime)value; if (date < SqlDateTime.MinValue.Value) { values[name] = SqlDateTime.MinValue.Value; } else if (date > SqlDateTime.MaxValue.Value) { values[name] = SqlDateTime.MaxValue.Value; } } } } } } 

Uso:

 public class MyContext: BaseDbContext { ///  /// Initializes a new instance of the  class. ///  public MyContext() : base("name=MyConnectionString") { } ///  /// Initializes a new instance of the  class. ///  /// The connection string. public MyContext(string connectionString) : base(connectionString) { } //DBcontext class body here (methods, overrides, etc.) } 

Nel mio caso stavamo trasmettendo una data a un datetime e abbiamo ricevuto questo errore. Quello che succede è che Data ha un minimo “più programmato” del 01/01/0001, mentre Datetime è bloccato al 1753

Combina questo con un errore di raccolta dati da parte nostra e ottieni la tua eccezione!

A volte funziona bene su macchine di sviluppo e non su server. Nel mio caso ho dovuto mettere:

  

Nel file web.config.

Il fuso orario nella macchina (Server) era corretto (per la localizzazione di CO) ma l’app web non lo faceva. Questa impostazione è stata eseguita e ha funzionato di nuovo bene.

Fuori rotta, tutte le date avevano un valore.

: D

avrai una colonna di date che è stata impostata per lesathan il valore minimo di dattime consentito come 1/1/1001.

per superare questo problema è ansible impostare il valore datetime corretto per la proprietà ur e anche impostare un’altra proprietà magica come IsSpecified = true.