2013-03-01 9 views
38

Non voglio per convalidare txtBirthDate quindi voglio passare DateTime.MinValue nel database.DateTime.MinValue e SqlDateTime trabocco

Il mio codice:

if (txtBirthDate.Text == string.Empty) 
    objinfo.BirthDate = DateTime.MinValue; 
else 
    objinfo.BirthDate = DateTime.Parse(txtBirthDate.Text); 

DateTime.MinValue ritorno Date = {1/1/0001 12:00:00 AM}

ho ottenuto un errore SQL:

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

ho sotto sopporto, ma io non capisco perché DateTime.MinValue data di ritorno valida tempo che non è possibile inserire nel database. Come gestire questo tipo di situazione?

+0

Definire un min-valore di te stesso? –

+1

Il messaggio è una specie di spiegazione per te. La data minima accettata da SQL Server è 1/1/1753 mentre .Net utilizza 1/1/0001. Cosa non capisci? –

+5

La logica suggerisce di utilizzare 'DateTime?' In C#, consentire al campo di accettare null nel database e inserire 'DBNull.Value' nel caso in cui' objinfor.BirthDate.HasValue' sia 'false'. Quello che voglio dire è che dovrebbe riflettere la realtà. Se la situazione in cui non esiste una data di nascita è accettabile di quanto dovrebbe essere nullable. – tpeczek

risposta

70

In sostanza, non utilizzare DateTime.MinValue per rappresentare un valore mancante. È possibile non uso DateTime.MinValue in un campo di SQL Server DateTime, come SQL Server ha un valore minimo di inizio del 1753.

Invece, fare la vostra proprietà BirthDate un Nullable<DateTime> (aka DateTime?), e impostarlo su null quando non hai un valore. Assicurati anche che il campo del tuo database sia annullabile. Poi basta fare in modo che che null finisce come valore NULL nel database. Esattamente come si fa a che dipenderà dal vostro accesso ai dati, il che non ci avete detto nulla.

+3

WCF assume automaticamente 'DateTime.MinValue' se un parametro' DateTime' per 'OperationContract' è stato omesso. Inoltre, WCF non accetta i parametri 'Nullable '. Ciò significa che in ogni 'OperationContract' sei costretto a fare qualcosa come' if (myDate crush

+2

@crush: Beh, devi unire direttamente il tuo modello WCF e il tuo modello SQL? Ho il sospetto che avessi un modello "logico" che aveva un 'Nullable ', e convertire da/a quello quando avevo bisogno di usare WCF. Non che io abbia usato molto WCF, ma mi sembra una cattiva idea che le limitazioni di WCF permeano il resto del modello. –

+0

Grazie per la risposta. Correggimi se leggo la tua risposta sbagliata. Stai suggerendo che il modello/DAO sia responsabile del vincolo del valore minimo di 'DateTime' rispetto al Data Access Layer o SqlServer? – crush

2

Da MSDN:

Date and time data from January 1, 1753, to December 31, 9999, with an accuracy of one three-hundredth second, or 3.33 milliseconds. Values are rounded to increments of .000, .003, or .007 milliseconds. Stored as two 4-byte integers. The first 4 bytes store the number of days before or after the base date, January 1, 1900. The base date is the system's reference date. Values for datetime earlier than January 1, 1753, are not permitted. The other 4 bytes store the time of day represented as the number of milliseconds after midnight. Seconds have a valid range of 0–59.

SQL utilizza un sistema diverso da C# per i valori datetime.

È possibile utilizzare MinValue come valore sentinella e, se MinValue, passare null nell'oggetto (e memorizzare la data come annullabile nel DB).

if(date == dateTime.Minvalue) 
    objinfo.BirthDate = null; 
-5

uso estensioni

public static class DateTimeExtensions 
{ 
    public static DateTime MinValue(this DateTime sqlDateTime) 
    { 
     return new DateTime(1900, 01, 01, 00, 00, 00); 
    } 
} 


DateTime date = DateTime.Now; 
Console.WriteLine("Minvalue is {0} ", date.MinValue().ToShortDateString()); 
2

In poche parole, Non uso DateTime.MinVaue come valore di default.

ci sono un paio di diversi MinValues là fuori, a seconda che l'ambiente ci si trova.

una volta ho avuto un progetto, dove mi è stato l'attuazione di un progetto di Windows CE, stavo usando il quadro DateTime.MinValue (anno 0001) , il database MinValue (1753) ed un controllo dell'interfaccia utente DateTimePicker (credo che fosse 1970). Quindi ci sono stati almeno 3 diversi MinValues ​​ che conducevano a comportamenti strani e risultati imprevisti. (E credo che c'era anche una quarta versione (!), Solo che non ricordo da dove provenisse.).

Utilizzare un campo di database nullable e modificare il valore in uno Nullable<DateTime>. Dove non c'è alcun valore valido nel codice, non ci dovrebbe non essere un valore nel database. :-)

59

Molto semplice evitano il ricorso ad DateTime.MinValue uso System.Data.SqlTypes.SqlDateTime.MinValue invece.

+4

Utilizzare 'System.Data.SqlTypes.SqlDateTime.MinValue.Value 'se si desidera assegnare il valore nel campo" DateTime? "digitare – sohaiby

3

Here is what you can do. Though there are lot many ways to achieve it.

DateTime? d = null;  
if (txtBirthDate.Text == string.Empty) 
    objinfo.BirthDate = d; 
else 
    objinfo.BirthDate = DateTime.Parse(txtBirthDate.Text); 

Note: This will work only if your database datetime column is Allow Null. Else you can define a standard minimum value for DateTime d.

3

sto usando questa funzione per TryParse

public static bool TryParseSqlDateTime(string someval, DateTimeFormatInfo dateTimeFormats, out DateTime tryDate) 
    { 
     bool valid = false; 
     tryDate = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue; 
     System.Data.SqlTypes.SqlDateTime sdt; 
     if (DateTime.TryParse(someval, dateTimeFormats, DateTimeStyles.None, out tryDate)) 
     { 
      try 
      { 
       sdt = new System.Data.SqlTypes.SqlDateTime(tryDate); 
       valid = true; 
      } 
      catch (System.Data.SqlTypes.SqlTypeException ex) 
      { 

      } 
     } 

     return valid; 
    } 
8

Anche se è una vecchia questione, un'altra soluzione è quella di utilizzare datetime2 per la colonna del database. MSDN Link

+0

corretto. SQL Server Datetime è in effetti l'inizio minimo del 1753, ma con sql server 2008 e maggiore si dovrebbe usare Datetime2 come si combina con .Net risalendo all'anno 0001 –

+1

Probabilmente la soluzione più semplice e probabilmente migliore qui, assumendo che l'OP possa cambiare il parametro di query del database. Come afferma il seguente link, le nuove opere dovrebbero usare 'datetime2': https://msdn.microsoft.com/en-us/library/ms187819.aspx – Neo

-1

Beh ... è abbastanza semplice per ottenere un minimo data di SQL

DateTime sqlMinDateAsNetDateTime = System.Data.SqlTypes.SqlDateTime.MinValue 
Problemi correlati