2009-03-11 3 views
3

Eine gespeicherte Prozedur gibt Daten über einen Benutzerdatensatz mit einer Nullwert-Datetime-Spalte für ihr letztes Anmeldedatum zurück. Welches ist die bessere Wahl im Umgang mit der Möglichkeit für NULL-Werte beim Versuch, eine .Net Datumsvariable zuzuweisen?NULL-Wert von der Datenbank übernehmen und einer Date-Variablen zuweisen

Try 
     _LastLogin = CDate(DT.Rows(0)("LastLogin")) 
    Catch ex As InvalidCastException 
     _LastLogin = Nothing 
    End Try 

oder

If DT.Rows(0)("LastLogin") Is DBNull.Value Then 
     _LastLogin = Nothing 
    Else 
     _LastLogin = CDate(DT.Rows(0)("LastLogin")) 
    End If 

bearbeiten: Ich habe vergessen, auch über die Möglichkeit, eine TryParse der Verwendung

If Not Date.TryParse(DT.Rows(0)("LastLogin").ToString, _LastLogin) Then 
     _LastLogin = Nothing 
    End If 

, die das bevorzugte Verfahren zur Handhabung möglich NULL Werte aus der Datenbank? Gibt es einen besseren Weg als die drei aufgeführten?

Edit # 2: Ich habe bemerkt, dass die TryParse Methode nicht schön spielt, wenn sie einen Nullable Typen zuordnen will.

+0

Das Problem mit Ihrer TryParse-Methode besteht darin, dass eine Ausnahme von der ToString-Methode ausgelöst wird, wenn "LastLogin" null ist. – Kev

+0

Kev: Wenn ich mich nicht irre, wird der Aufruf von ToString bei einem NULL-Abruf zu einer leeren Zeichenfolge führen (zumindest so, wie sie für meine anderen Informationen ausgeführt wurde, die in Strings zurückgenommen und gespeichert wurden).Ich muss aber vielleicht noch einmal nachsehen. – TheTXI

+0

Ja, DBNull.Value.ToString() return String.Empty – bdukes

Antwort

6

Das zweite Code-Snippet ist besser. Ausnahmen gelten für Ausnahmefälle, nicht für Fälle, die Sie erwarten. Plus, die Absicht ist viel besser. Es ist klar, dass Sie erwarten, dass DBNull ein möglicher Wert ist, und Sie möchten es entsprechend behandeln.

Sie können auch unbeabsichtigte Konsequenzen haben, wenn der Wert nicht null, aber nicht analysierbar ist (obwohl dies wahrscheinlich nie passieren wird).

2

Die zweite Methode ist wegen der mit dem Auslösen von Ausnahmen verbundenen Kosten vorzuziehen (insbesondere, wenn Sie erwarten, dass das LastLogin-Feld regelmäßig NULL ist).

Hier ist eine gute blog post mit mehr Details über Ausnahmen (siehe den Teil über Ausnahmen und Leistung).

1

in VB.net, hat es Nullable sein (von Datum)

hier ist ein Weg:

dim theDate as nullable(of Date) 

    If theDate.HasValue Then 
     'you can proceed 
    Else 
     'you must assign with DBNull.value 
    End If 

Die Datenbank wird auch wahrscheinlich Faktor in dem, was Sie tun können. MS Access wird über Daten egal was quälen. Ich habe schließlich das oben genannte zur Arbeit gebracht, aber normalerweise ziehe ich es vor, Datumsangaben als Zeichenfolgen in Access zu speichern. Es macht nur weniger Ärger auf der Straße.

0

Ich würde verwenden TryCast, which'll so etwas aussehen:

_LastLogin = TryCast(DT.Rows(0)("LastLogin"), Date?) 
2

Ich benutze die FixDBNull Klasse:

Public Class FixDBNull(Of ItemType)  
    Public Shared Function Convert(ByVal data As Object) As ItemType 
     If data IsNot System.DBNull.Value Then 
      Dim obj As ItemType = Nothing 

      Try 
       obj = CType(data, ItemType)  
      Catch ex As Exception 
       'do something with the conversion error 
      End Try 

      Return obj 
     Else 
      Return Nothing 
     End If 

End Function 
End Class 

dann kann ich es so nennen:

_LastLogin = FixDBNull(Of date).Convert(DT.Rows(0)("LastLogin")) 

, die entweder nichts oder ein Datum zurückgibt.

Verwandte Themen