Problem mit DBNull

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Problem mit DBNull

    Hi,

    könnt Ihr mir sagen, warum mein Programm abschmiert bei diesem Code:

    VB.NET-Quellcode

    1. For Each RProw In Database1DataSet.Tab_Reiseplanung
    2. If RProw.RP_Outlook = True Then
    3. ' Auswertung
    4. Dim Name As String = ""
    5. If RProw.RP_PersonName IsNot DBNull.Value Then
    6. Name = RProw.RP_PersonName
    7. End If


    Fehlermeldung:
    Der Wert für Spalte RP_PersonName in Tabelle Tab_Reiseplanung ist DBNull.


    Jetzt hab ich schon die Abfrage drinnen mit BDNull.Value... und er Kackt immer noch rum... Könnt Ihr mir sagen, was ich daran falsch habe??

    Verstehs grad überhaupt ned...

    lris
    Hey Iris,

    das klappt klar nicht weil du dem 2 Variablen vergleichst RProw.RP_PersonName und DBNull.Value beim ersten auslesen wird schon der DBNull Fehler ausgeworfen.

    versuch mal

    VB.NET-Quellcode

    1. For Each RProw In Database1DataSet.Tab_Reiseplanung
    2. If RProw.RP_Outlook = True Then
    3. ' Auswertung
    4. Dim Name As String = ""
    5. If Not IsDBNull(RProw.RP_PersonName) Then
    6. Name = RProw.RP_PersonName
    7. End If
    ok... hey super Danke...

    ich hab aber noch ein anderes Problem mit dem DBNull...

    Wenn ich einen Datensatz speichern möchte, habe eine Textbox mit einem Geburtag... wenn diese Textbox leer bleibt, kann ich nicht speichern...

    habs so grad mal versucht...

    VB.NET-Quellcode

    1. cmd.CommandText = "INSERT into Tab_Personen (" & _
    2. ...
    3. "KP_Geburtstag, " & _
    4. ...
    5. "VALUES (" & _
    6. ...
    7. "'" & ToDateOrNull(KP_Geburtstag.Text) & "', " & _
    8. ...
    9. Public Function ToDateOrNull(ByVal value As String) As Date
    10. If IsDate(value) Then
    11. Return Date.Parse(value)
    12. End If
    13. Return Convert.DBNull
    14. End Function



    aber das funktioniert auch nicht wirklich ;)
    3 Sachen die ich mir vorstellen kann.

    1.) DBNull klappt grundsätzlich nicht :D DBNull ist auch eins meiner größten Probleme immer ;)
    2.) der Return Wert von ToDateOrNull wäre ja DBNull und wird in die ' ' des SQL Strings eingefügt. Soweit ich weiß ist DBNull <> String darum klappt es nicht. Versuch mal als als Return einfach String.Nothing oder nur Nothing
    3.) in deinem SQL Server ist das Feld KP_Geburtstag ein Pflichtfeld (NOT NULL) dann musst du was reinschreiben in dem Fall 01.01.1990 - das ist aber der unwahrscheinlichste Fall.

    VB.NET-Quellcode

    1. cmd.CommandText = "INSERT into Tab_Personen (" & _
    2. ...
    3. "KP_Geburtstag, " & _
    4. ...
    5. "VALUES (" & _
    6. ...
    7. ToDateOrNull(KP_Geburtstag.Text) & _
    8. ...
    9. Public Function ToDateOrNull(ByVal value As String) As String
    10. If IsDate(value) Then Return "'" & Date.Parse(value).ToString & "'" Else Return "NULL"
    11. End Function
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    lris08 schrieb:

    Wenn ich einen Datensatz speichern möchte, habe eine Textbox mit einem Geburtag... wenn diese Textbox leer bleibt, kann ich nicht speichern...

    Eine gute Neuigkeit für dich: Du hast ein typisiertes Dataset!
    Und auch DataAdapter hast du - du brauchst also nicht jeweils spezifisches Sql zu coden, je nachdem, ob das Datum gesetzt ist, oder nicht, sondern kannst einfach den DataAdapter abfahren.

    Und - äh - Datumse sollte man nicht in Textboxen eingeben - dafür sind DatetimePicker da.
    Die haben auch eine Checkbox, um anzuzeigen, dass ihr Wert nicht gilt - das entspräche ungefähr DbNull.
    Aber mittm Databinding machen die dummen Dinger Probleme, weil sie können grad noch Nothing-"Werte" anzeigen, aber Nothing als Value setzen könnense nicht, weil deren Value-Property ist vom Typ DateTime, und das ist eine Structure, und kann daher den "Wert" Nothing nicht annehmen.

    Daher habe ich ein klein NullableDateTimePicker gebastelt, dessen Value-Property nicht DateTime ist, sondern Nullable(Of DateTime).
    Weil Nullable(Of DateTime) kann auch Nothing annehmen, und das verträgt sich auch databinding-mäßig ganz vortrefflich mittm typDataset.