none
Datentyp Date und Datenbanktyp smalldatetime RRS feed

  • Frage

  • Hallo Leute,
    ich habe einen SQL-Server der eine Tabelle "myTabelle" mit der Spalte "myDate" (Typ: smalldatetime) enthält.
    Bei dieser Spalte sind Null-Werte erlaubt.

    Dim newDate As Date = Nothing
    Cmd.Parameters.Add("@myDate", SqlDbType.SmallDateTime).Value = newDate
    Cmd.CommandText = "UPDATE myTabelle SET myDate = @myDate WHERE ID = 1"
    Cmd.ExecuteNonQuery()

    Da aber in newDate lt. Debugger der Wert "#12:00:00 AM#" steht (auch nach der Zuweisung von "Nothing"),  bekomme ich die Fehlermeldung "SQLDateTime-Überlauf".
    Eigentlich möchte ich nur, dass in myDate der Wert "NULL" eingetragen wird.
    Wie kann ich das realisieren?

    Vielen Dank im Voraus
    Christian Tauschek

     

     

     

    Sonntag, 17. Oktober 2010 13:40

Antworten

  • Hallo Christian,

    Dim newDate As Date = Nothing
    Cmd.Parameters.Add("@myDate", SqlDbType.SmallDateTime).Value = newDate
    Cmd.CommandText = "UPDATE myTabelle SET myDate = @myDate WHERE ID = 1"
    Cmd.ExecuteNonQuery()

    Da aber in newDate lt. Debugger der Wert "#12:00:00 AM#" steht (auch nach der Zuweisung von "Nothing")

    Da DateTime ein Werttyp ist, kann dieser nie Nothing sein, sondern immer maximal '0' bzw. das definierte Basisdatum '01.01.0001 00:00:00'. Dieser Ausdruck wird vom Debugger entsprechend Deinen Regionaleinstellungen als Datum formatiert ausgegeben. Das Ergebnis ist bei Dir dann "#12:00:00 AM#".

    Eigentlich möchte ich nur, dass in myDate der Wert "NULL" eingetragen wird.
    Wie kann ich das realisieren?

    Cmd.Parameters.Add("@myDate", SqlDbType.SmallDateTime).Value = DBNull.Value


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Sonntag, 17. Oktober 2010 14:01
    Moderator
  • Hallo Christian,

    wenn Du in ADO.NET NULL zuweisen willst, verwende DBNull.Value . Hier:

    Cmd.Parameters.Add("@myDate", SqlDbType.SmallDateTime).Value = DBNull.Value
    

    Der Überlauf kommt dadurch zustande, dass ein SmallDateTime nur
    Werte ab dem 1.1.1900 zulässt, ein .NET DateTime fängt im Jahre 1 an.

    Die Zuweisung von Nothing wiederum bewirkt in Visual Basic, dass der Standardwert
    für den Datentyp zugewiesen wird, was hier DateTime.MinValue entspräche, da es
    sich bei DateTime um einen Werttyp (Structure) handelt.

    Gruß Elmar

    Sonntag, 17. Oktober 2010 14:02
    Beantworter

Alle Antworten

  • Hallo Christian,

    Dim newDate As Date = Nothing
    Cmd.Parameters.Add("@myDate", SqlDbType.SmallDateTime).Value = newDate
    Cmd.CommandText = "UPDATE myTabelle SET myDate = @myDate WHERE ID = 1"
    Cmd.ExecuteNonQuery()

    Da aber in newDate lt. Debugger der Wert "#12:00:00 AM#" steht (auch nach der Zuweisung von "Nothing")

    Da DateTime ein Werttyp ist, kann dieser nie Nothing sein, sondern immer maximal '0' bzw. das definierte Basisdatum '01.01.0001 00:00:00'. Dieser Ausdruck wird vom Debugger entsprechend Deinen Regionaleinstellungen als Datum formatiert ausgegeben. Das Ergebnis ist bei Dir dann "#12:00:00 AM#".

    Eigentlich möchte ich nur, dass in myDate der Wert "NULL" eingetragen wird.
    Wie kann ich das realisieren?

    Cmd.Parameters.Add("@myDate", SqlDbType.SmallDateTime).Value = DBNull.Value


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Sonntag, 17. Oktober 2010 14:01
    Moderator
  • Hallo Christian,

    wenn Du in ADO.NET NULL zuweisen willst, verwende DBNull.Value . Hier:

    Cmd.Parameters.Add("@myDate", SqlDbType.SmallDateTime).Value = DBNull.Value
    

    Der Überlauf kommt dadurch zustande, dass ein SmallDateTime nur
    Werte ab dem 1.1.1900 zulässt, ein .NET DateTime fängt im Jahre 1 an.

    Die Zuweisung von Nothing wiederum bewirkt in Visual Basic, dass der Standardwert
    für den Datentyp zugewiesen wird, was hier DateTime.MinValue entspräche, da es
    sich bei DateTime um einen Werttyp (Structure) handelt.

    Gruß Elmar

    Sonntag, 17. Oktober 2010 14:02
    Beantworter