none
Linq und dbnull beim Datum RRS feed

  • Frage

  • Hallo
    Dim context As New dokumenteDataContext
                    Dim mitglieder = From c In context.mitgliederliste _
                                Where c.id = btn.CommandArgument _
                                Select c
                                
                    For Each t In mitglieder
    
                         tbAustritt.Text = t.austrittDatum ???
    Einige Felder von dem AustrittsDatum haben in der Datenbank den Wert NULL.

    Jetzt kommt bei der Ausgabe in ein Textfeld natürlich ein Fehler.

    Wie kann ich den Fehler abfangen?

    Ich habe auch schon selbst versucht, eine Lösung zu finden. Ich kann es in dem Falle im Zusammenhang mit LINQ aber nicht umsetzen.

    Hat jemand einen Tipp für mich?

    Liebe Grüße, die Luzie!

    Freitag, 6. April 2012 08:42

Antworten

  •  Hallo,

    es hat sich jetzt erledigt.

     Nach dem Lesen von gefühlten 1000 Einträgen mit gefühlten 1000 Lösungen war die Lösung doch einfach.

       Dim objDate As Object
                         If t.austritt IsNot Nothing Then
                             objDate = DateTime.Parse(t.austritt)
                         Else
                             objDate = Nothing
                        End If

    Zum Weiterverarbeiten von NULL Werten im Datum ist dieser Eintrag zu empfehlen.
     http://www.c-sharpcorner.com/UploadFile/sd_patel/EnterNullValuesForDateTime11222005015742AM/EnterNullValuesForDateTime.aspx

                                             

    Liebe Grüße, die Luzie!

    • Als Antwort markiert Luzie Montag, 9. April 2012 13:08
    Montag, 9. April 2012 13:06

Alle Antworten

  • Möglichkeit 1. in der where clausel des Linq abfragen ob im austrittsdatum null ist. Where c.id = btn.commandArgument_ & c.austrittsdatum != null

    Möglichkeit 2. in der schleife nur die berücksichtigen die ein gültiges datum haben. mitglieder.where(M => M.austrittsdatum != null).tolList()

    Möglichkeit 3. eine if anweisung bevor du das datum in die textbox schreibst, die prüft ob ein gültiges datum vorhanden ist.

    Samstag, 7. April 2012 07:47
  • Möglichkeiten 1 und 2 scheiden aus, ich möchte den Datensatz ja selektieren.

    Ich möchte lediglich eine Tipp, wie die Syntax lautet, die ich bei der Abfrage verwenden muss.

    Folgendes habe ich probiert, aber der Fehler bleibt immer gleich ".. ungültige Konvertierung der Zeichenfolge in Type Date.. "

    Dim objDate As Object
        
                            If (t.austritt <> String.Empty) Then
                                objDate = DateTime.Parse(t.austritt)
                            Else
                                objDate = DBNull.Value
                        End If
                        
    
        Public Function DisplayDate(ByVal displayDateTime As Nullable(Of DateTime)) As String
            Dim result As String = ""
            If displayDateTime.HasValue = True Then
                result = displayDateTime.Value
            Else
                result = ""
            End If
            Return result
        End Function  
        
           Public Function getdbnull(ByVal dbfeld As String, ByVal wertfeld As String) As String
                ' --- dbfeld = Datenbankfeld
                ' --- wertfeld = Text, der ausgegeben wird
                Dim result As String = ""
                If String.IsNullOrEmpty(dbfeld) Or dbfeld = "" Or _
                       dbfeld Is DBNull.Value Then
                    result = ""
                Else
                    result = wertfeld.ToString
                End If
                Return result
        End Function


    Liebe Grüße, die Luzie!

    Samstag, 7. April 2012 19:39
  • Hallo Luzie,

    zum Umgang mit NULL Werten in .NET siehe bspw.:

      http://msdn.microsoft.com/de-de/library/ms172138.aspx

    Im Endeffekt musst Du deine Funktion(en) DisplayDate bzw. getdbnull( ... ) so erweitern, dass korrekt geprüft wird. Ein Beispiel findest Du in vorstehend genanntem Link.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Samstag, 7. April 2012 20:30
    Moderator
  • Hi Stefan,

    sorry, damit komme ich nicht klar. Das sind Beispiele für ADO.NET, ich weiß nicht, wie ich die für meine Abfrage mit LINQ TO SQL abändern kann.

    Ich habe meine Funktion noch erweitert

     Public Function getdbnull(ByVal dbfeld As String) As String
            ' --- dbfeld = Datenbankfeld
            ' --- wertfeld = Text, der ausgegeben wird
            Dim result As String = ""
            If String.IsNullOrEmpty(dbfeld) Or dbfeld = "" Or DisplayDate(dbfeld) = False Or _
                   dbfeld Is DBNull.Value Then
                result = Nothing
            Else
                result = CDate(dbfeld)
            End If
            Return result
        End Function

         Public Function DisplayDate(ByVal displayDateTime As Nullable(Of DateTime)) As Boolean
            Dim result As Boolean = False
            If displayDateTime.HasValue = True Then
                result = True
            End If
            Return result
        End Function

    Fehler:   Das Objekt mit Nullwert muss einen Wert haben

        

    Liebe Grüße, die Luzie!



    • Bearbeitet Luzie Montag, 9. April 2012 09:48 Änderung nach mehreren Versuchen
    Samstag, 7. April 2012 21:01
  • 1 u. 2 scheiden aus weil du selektieren möchtest? eher weil du nicht selektieren möchtest, denn das tut 1 u. 2 ja.

    also du möchtest auch wenn das datum null ist eine anzeige , nur halt ohne wert und optimal fall ohne fehler?

    dann könntest  du sowas versuchen...

    Dim context As New dokumenteDataContext Dim mitglieder = From c In context.mitgliederliste _ Where c.id = btn.CommandArgument _ select new
                       {
                            Wert = C.Wert,
                            .
                            .
                            .
                            austrittDatum = C.austrittDatum != null ? C.austrittDatum.ToString() : ""
                        }; For Each t In mitglieder

    müsstest dann halt alle werte komma getrennt auflisten. Wenn du das austrittsDatum nicht als String haben willst, könntest du als false Wert auch ein new DateTime() machen. aber wie ich das verstanden habe geht es dir um die ausgabe. da würde sich auch sowas wie eine Meldung oder Warnung das kein gültiger Wert vorhanden ist anbieten.


    • Bearbeitet Lennart F Montag, 9. April 2012 08:31
    Montag, 9. April 2012 08:19
  • Hallo

    das Austrittsdatum darf nur eingetragen werden, wenn es bekannt ist. In 80 % der Fälle ist es nicht bekannt. In dem Falle muss ein Wert NULL oder nothing eingetragen werden.

    Mir fehlen halt die Kenntnisse, dies richtig umzusetzen. Meine bisherigen Versuche sind gescheitert. Vielleicht denke ich auch falsch, keine Ahnung.

    Ich muss schlicht und einfach nur einen Wert in  einem Textfeld darstellen, der dbnull sein kann und das bekomme ich nicht hin mit linq.

    Ist es nicht irgendwie möglich, dieses Datumsfeld direkt im linq to sql Statment in einen string zu konvertieren?


    Liebe Grüße, die Luzie!

    Montag, 9. April 2012 09:55
  •  Hallo,

    es hat sich jetzt erledigt.

     Nach dem Lesen von gefühlten 1000 Einträgen mit gefühlten 1000 Lösungen war die Lösung doch einfach.

       Dim objDate As Object
                         If t.austritt IsNot Nothing Then
                             objDate = DateTime.Parse(t.austritt)
                         Else
                             objDate = Nothing
                        End If

    Zum Weiterverarbeiten von NULL Werten im Datum ist dieser Eintrag zu empfehlen.
     http://www.c-sharpcorner.com/UploadFile/sd_patel/EnterNullValuesForDateTime11222005015742AM/EnterNullValuesForDateTime.aspx

                                             

    Liebe Grüße, die Luzie!

    • Als Antwort markiert Luzie Montag, 9. April 2012 13:08
    Montag, 9. April 2012 13:06