2016-07-29 3 views
0

Ich habe den folgenden Code, um zu überprüfen, ob ein Datetime-Wert Null ist oder einen Wert hat. Wenn es null ist, möchte ich, dass es als leere Zeichenfolge zurückgegeben wird, andernfalls sollte es eine Zeichenfolge des Werts sein, der es enthält.vb.net Datumswerte werden in Zeit umgerechnet

Der Else Teil der Anweisung funktioniert, er konvertiert den Wert in eine Zeichenfolge. Wenn der als datetime übergebene Wert jedoch null ist, gibt er Nothing nicht zurück, sondern setzt den Wert auf '12: 00:00 Uhr ", was mir an anderen Stellen des Projekts Probleme bereitet.

Wie kann ich diese Funktion so anpassen, dass null Datetime-Werte als leere Zeichenfolgen zurückgegeben werden?

Public Shared Function dbToDate(o As Object) As DateTime 

    If o Is DBNull.Value Then 
     Return "" 

    Else 
     Return Convert.ToDateTime(o) 

    End If 
End Function 
+0

zurückgeben Bitte sagen Sie mir, Sie werden nicht in eine SQL-Zeichenfolge setzen? Weil das ** schrecklich wäre **. Es ist ein sehr starker Hinweis darauf, dass Sie Code erstellen, der für SQL-Injection-Attacken anfällig ist. –

+1

Wie ist das anders als [Ihre letzte Frage] (http://stackoverflow.com/q/38654241/1070452)? ... und Datumsangaben müssen noch nicht in Strings für SQL konvertiert werden. – Plutonix

+0

@JoelCoehoorn Nein, dies geht nicht in eine SQL-Zeichenfolge, das nimmt Daten aus der Datenbank mit SQL, aber nicht zurück (noch) –

Antwort

0

Erstens ist ein DateTime nie null/nichts. Da es sich um einen Werttyp handelt (Structure), hat es immer einen Wert. In diesem Fall lautet der Standardwert DateTime.MinValue. Aber VB.NET bearbeitet diesen Fall für Sie. Der dt.Date = Nothing vergleicht den Wert automatisch mit Date.MinValue, damit es wie gewünscht funktioniert. Das Problem ist, dass Sie dt.ToString zurückgeben. Nur "" zurück:

Public Shared Function sqlDate(dt As DateTime) As String  
    If dt.Date = Nothing Then 
     Return ""  
    Else  
     Return dt.ToString("yyyy-MM-dd")  
    End If  
End Function 

Hier ist eine Version ohne Methode:

Dim result = If(dt = Nothing, "", dt.ToString("yyyy-MM-dd")) 

Sie können sehen, dass ein Date nie null mit diesem Code ist:

Dim dt As Date = Nothing 
Console.WriteLine(dt = Nothing)' true 
Console.WriteLine(dt = Date.MinValue)' true 
Console.WriteLine(Object.ReferenceEquals(Nothing, dt))' always false because it's a value type 

aktualisieren gem. deine letzte Bearbeitung, vergleiche mit DbNull.Value. Ich würde auch eine Nullable(Of Date):

Public Shared Function dbToDate(o As Object) As DateTime? 
    If DbNull.Value.Equals(o) OrElse o Is Nothing Then 
     Return Nothing 
    Else 
     Return Convert.ToDateTime(o) 
    End If 
End Function 
+0

VB.Net kommt 'Nothing' ist nicht das gleiche wie C#' null'. DateTime-Werte in VB.Net können Nothing sein, was auch zu Cis 'Standard (T) ' –

+0

@JoelCoehoorn äquivalen ist: true und false. Der Wert wird nicht "Date.MinValue" sein. Aber wenn du es mit "Nichts" vergleichen würdest, würdest du ein "Wahres" erhalten. Sie können auch 'Nichts' zuweisen. Dann (in C# -Syntax) weisen Sie 'default (DateTime)' zu, was 'Date.MinValue' ist. Ich wollte nur darauf hinweisen, dass ein Werttyp niemals "null" oder nichts (in der gleichen Bedeutung) ist. OP verwendet beide Begriffe, daher ist es wichtig, den Unterschied in VB.NET zu erwähnen (wie Sie es getan haben). Hier ist eine verwandte Frage. http://stackoverflow.com/questions/15524045/why-is-there-a-difference-in-checking-null-against-a-value-in-vb-net-and-c –

+0

@TimSchmelter Hallo Tim, erstens Danke, dass du den Unterschied aufgeklärt hast. Zweitens konvertiert diese Funktion noch die Werte nothing auf 12:00:00 AM? –

Verwandte Themen