DB Null

  • VB.NET

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

    Hallo Community,

    Ich stehe wieder vor einem Problem und diesmal verstehe ich auch den Grund nicht. Ich habe einen DatagridViewer der auch wunderbar mit den Daten aus einer MDB Datein gefuellt wird. Nun moechte ich mit allerdings im Programm nach dem Status filtern. Das funktioniert prinzipiell auch. Allerdings erhalte ich folgende Fehlermeldung wenn ein Spalte mit leeren Datum im sichbaren Bereich des DataViewer ist.

    "Der Wert für Spalte Date_Arrived in Tabelle DocManagment ist DBNull."

    Ich habe fuer diesen Fehler bereits etlich Threads gefunden doch habe ich kein Loesung gefunden die ich bei mir auch umsetzen konnte. Ausserdem verstehe ich nicht was an meiner Abfrage anders ist als an der Erstabfrage(Ok, ich filtere im DataSet und stelle keine neue Abfrage aber dies hat ja nicht mit dem fuellen zu tun,oder?) ? Denn vor dem filtern scheint der Viewer ueberhaupt kein Problem mit leeren Date Feldern zu haben.

    Hier der Code in dem dieser Fehler passiert. Dieser Coder stammt nicht von mir sondern wird anscheined vom Dataset(?) generiert

    VB.NET-Quellcode

    1. <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
    2. Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")> _
    3. Public Property Date_Arrived() As Date
    4. Get
    5. Try
    6. Return CType(Me(Me.tableDocManagment.Date_ArrivedColumn),Date)
    7. Catch e As Global.System.InvalidCastException
    8. Throw New Global.System.Data.StrongTypingException("Der Wert für Spalte Date_Arrived in Tabelle DocManagment ist DBNull.", e)
    9. End Try
    10. End Get
    11. Set
    12. Me(Me.tableDocManagment.Date_ArrivedColumn) = value
    13. End Set
    14. End Property



    Hier noch mein Code
    Spoiler anzeigen

    VB.NET-Quellcode

    1. 'Vor Release noch Directory Aendern!!
    2. Imports System.Data.OleDb
    3. Public Class StandartView
    4. Public ID As String
    5. Public Status As String
    6. 'User Settings & DataSet Load
    7. Private Sub StandartView_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    8. Me.DocManagmentTableAdapter.Fill(Me.Document_ExchangeDataSet.DocManagment)
    9. If My.Settings.User = "" Then
    10. User.Show()
    11. Me.Opacity = 0 ' Me.Hide funktioniert nicht wenn ich das beim laden (MyBase.Load) versuche.
    12. End If
    13. End Sub
    14. 'Close Program
    15. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles btnClose.Click
    16. DocManagmentTableAdapter.Update(Document_ExchangeDataSet) 'Der FUNZT....seltsam
    17. Me.Close()
    18. End Sub
    19. 'Open Windows Multi arrived
    20. Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles btnMulti.Click
    21. Me.Hide()
    22. Multiple_Arrived.Show()
    23. End Sub
    24. 'TaskBox
    25. Private Sub ListBox1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles Taskbox.SelectedIndexChanged
    26. Select Case True ' Das Feld Reason soll nur eingeblendet werden wenn er auch zuruck gesendet wird
    27. Case Taskbox.Text Is "Return"
    28. cmdReason.Visible = True
    29. Case Taskbox.Text Is "Edit"
    30. Enable()
    31. Case Else
    32. Disable()
    33. cmdReason.Visible = False
    34. End Select
    35. End Sub
    36. 'SelectFile
    37. Private Sub OpenFileDialog1_FileOk(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk
    38. Dim strm As System.IO.Stream = OpenFileDialog1.OpenFile()
    39. If Not (strm Is Nothing) Then
    40. 'DER(KOPIERPROZESS)
    41. Dim FileToCopy As String = OpenFileDialog1.FileName.ToString()
    42. Dim NewFile As String = "C:\Users\mnbraun\Desktop\Fisch\HELLO.txt"
    43. Dim dd As Integer = 3
    44. Dim T As String = MonthName(dd)
    45. 'Dim FinnishDateFormat As Date = New CultureInfo("fi", False).DateTimeFormat
    46. 'Dim FinnishMonths As String() = FinnishDateFormat.MonthName
    47. System.IO.Directory.CreateDirectory("C:\Users\mnbraun\Desktop\" & T & "\")
    48. 'System.IO.File.Copy(FileToCopy, NewFile)
    49. strm.Close()
    50. End If
    51. End Sub
    52. 'Tableadapter
    53. Private Sub DocManagmentBindingNavigatorSaveItem_Click(sender As System.Object, e As System.EventArgs)
    54. Me.Validate()
    55. Me.DocManagmentBindingSource.EndEdit()
    56. Me.TableAdapterManager.UpdateAll(Me.Document_ExchangeDataSet)
    57. End Sub
    58. 'Doppelklick to Edit
    59. Private Sub Dataviewer_CellDoubleClick(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles Dataviewer.CellDoubleClick
    60. txtID.Text = Dataviewer.CurrentRow.Cells(1).Value.ToString
    61. End Sub
    62. Private Sub DBRefresh()
    63. Dataviewer.DataSource = 0
    64. Dataviewer.DataSource = Document_ExchangeDataSet.Tables(0).DefaultView
    65. End Sub
    66. Private Sub Clear()
    67. txtShipper.Clear()
    68. txtDocname.Clear()
    69. txtType.Text = ""
    70. txtReason.Text = ""
    71. cmdDocDate.Value = Date.Now
    72. cmdReason.Clear()
    73. Taskbox.Items.Clear()
    74. End Sub
    75. Private Sub Disable()
    76. cmdDocDate.Enabled = False
    77. txtShipper.Enabled = False
    78. txtDocname.Enabled = False
    79. txtType.Enabled = False
    80. End Sub
    81. Private Sub Enable()
    82. cmdDocDate.Enabled = True
    83. txtShipper.Enabled = True
    84. txtDocname.Enabled = True
    85. txtType.Enabled = True
    86. End Sub
    87. 'ID Feld Pruefen ob Sendung existiert
    88. Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles txtID.TextChanged
    89. Dim al As New List(Of DataRow)
    90. If txtID.Text <> "" Then
    91. For Each te As DataRow In Document_ExchangeDataSet.Tables(0).Select("Doc_No='" & txtID.Text & "'", "ID DESC")
    92. al.Add(te)
    93. Next
    94. If al.Any = True Then
    95. Status = al(0).Item("Status").ToString()
    96. ID = al(0).Item("ID").ToString()
    97. txtShipper.Text = al(0).Item("Sender").ToString()
    98. txtDocname.Text = al(0).Item("Doc_Name").ToString()
    99. txtType.Text = al(0).Item("Doc_Type").ToString()
    100. txtReason.Text = al(0).Item("To_Manager").ToString()
    101. cmdDocDate.Value = Date.Parse(al(0).Item("Date_Create").ToString(), System.Globalization.CultureInfo.CreateSpecificCulture("de-DE"))
    102. cmdReason.Text = al(0).Item("Reason_Returned").ToString()
    103. Taskbox.Items.Clear()
    104. Select Case True
    105. Case Status = "Sent"
    106. Disable()
    107. Taskbox.Items.Add("Arrived")
    108. Taskbox.Items.Add("Return")
    109. Taskbox.Items.Add("Edit")
    110. Case Status = "Arrived"
    111. Disable()
    112. Taskbox.Items.Add("Return")
    113. Taskbox.Items.Add("Edit")
    114. Case Status = "Returned"
    115. Disable()
    116. Taskbox.Items.Add("Arrived")
    117. Taskbox.Items.Add("Edit")
    118. Case Status = "Remaining"
    119. Disable()
    120. Taskbox.Items.Add("Sent")
    121. Taskbox.Items.Add("Edit")
    122. Case Else
    123. Disable()
    124. Taskbox.Items.Add("Error")
    125. 'Taskbox.Items.Add("New Doc & Sent")
    126. End Select
    127. Else
    128. Clear()
    129. Enable()
    130. Taskbox.Items.Add("New Doc")
    131. Taskbox.Items.Add("New Doc & Sent")
    132. End If
    133. End If
    134. End Sub
    135. 'DER Ok Knopf
    136. Private Sub btnOk_Click(sender As System.Object, e As System.EventArgs) Handles btnOk.Click
    137. Select Case True
    138. Case Taskbox.Text = "New Doc"
    139. 'OpenFileDialog1.Title = "Please Select Document"
    140. 'OpenFileDialog1.InitialDirectory = "C:temp"
    141. 'OpenFileDialog1.ShowDialog()
    142. Dim dsNewRow As DataRow
    143. dsNewRow = Document_ExchangeDataSet.Tables(0).NewRow()
    144. dsNewRow.Item("Date_Create") = Date.Now
    145. dsNewRow.Item("Status") = "Remaining"
    146. dsNewRow.Item("Doc_No") = txtID.Text
    147. dsNewRow.Item("Date_Doc") = cmdDocDate.Value
    148. dsNewRow.Item("Sender") = txtShipper.Text
    149. dsNewRow.Item("Doc_Name") = txtDocname.Text
    150. dsNewRow.Item("Doc_Type") = txtType.Text
    151. dsNewRow.Item("To_Manager") = txtReason.Text
    152. dsNewRow.Item("Last_Location") = My.Settings.Location
    153. dsNewRow.Item("Last_User") = My.Settings.User
    154. Document_ExchangeDataSet.Tables(0).Rows.Add(dsNewRow)
    155. Case Taskbox.Text = "New Doc & Sent"
    156. Dim dsNewRow As DataRow
    157. dsNewRow = Document_ExchangeDataSet.Tables(0).NewRow()
    158. dsNewRow.Item("Date_Create") = Date.Now
    159. dsNewRow.Item("Status") = "Sent"
    160. dsNewRow.Item("Date_Sent") = Date.Now
    161. dsNewRow.Item("Doc_No") = txtID.Text
    162. dsNewRow.Item("Date_Doc") = cmdDocDate.Value
    163. dsNewRow.Item("Sender") = txtShipper.Text
    164. dsNewRow.Item("Doc_Name") = txtDocname.Text
    165. dsNewRow.Item("Doc_Type") = txtType.Text
    166. dsNewRow.Item("To_Manager") = txtReason.Text
    167. dsNewRow.Item("Last_Location") = My.Settings.Location
    168. dsNewRow.Item("Last_User") = My.Settings.User
    169. Document_ExchangeDataSet.Tables(0).Rows.Add(dsNewRow)
    170. Case Taskbox.Text = "Sent"
    171. Document_ExchangeDataSet.Tables(0).Rows.Find(ID).Item("Status") = "Sent"
    172. Document_ExchangeDataSet.Tables(0).Rows.Find(ID).Item("Date_Sent") = Date.Now
    173. Document_ExchangeDataSet.Tables(0).Rows.Find(ID).Item("To_Manager") = txtReason.Text
    174. Document_ExchangeDataSet.Tables(0).Rows.Find(ID).Item("Last_Location") = My.Settings.Location
    175. Document_ExchangeDataSet.Tables(0).Rows.Find(ID).Item("Last_User") = My.Settings.User
    176. Case Taskbox.Text = "Arrived"
    177. Document_ExchangeDataSet.Tables(0).Rows.Find(ID).Item("Status") = "Arrived"
    178. Document_ExchangeDataSet.Tables(0).Rows.Find(ID).Item("Date_Arrived") = Date.Now
    179. Document_ExchangeDataSet.Tables(0).Rows.Find(ID).Item("To_Manager") = txtReason.Text
    180. Document_ExchangeDataSet.Tables(0).Rows.Find(ID).Item("Last_Location") = My.Settings.Location
    181. Document_ExchangeDataSet.Tables(0).Rows.Find(ID).Item("Last_User") = My.Settings.User
    182. Case Taskbox.Text = "Edit"
    183. Document_ExchangeDataSet.Tables(0).Rows.Find(ID).Item("Date_Doc") = cmdDocDate.Value
    184. Document_ExchangeDataSet.Tables(0).Rows.Find(ID).Item("Sender") = txtShipper.Text
    185. Document_ExchangeDataSet.Tables(0).Rows.Find(ID).Item("Doc_Name") = txtDocname.Text
    186. Document_ExchangeDataSet.Tables(0).Rows.Find(ID).Item("Doc_Type") = txtType.Text
    187. Document_ExchangeDataSet.Tables(0).Rows.Find(ID).Item("Date_Edit") = Date.Now
    188. Document_ExchangeDataSet.Tables(0).Rows.Find(ID).Item("To_Manager") = txtReason.Text
    189. Document_ExchangeDataSet.Tables(0).Rows.Find(ID).Item("Last_Location") = My.Settings.Location
    190. Document_ExchangeDataSet.Tables(0).Rows.Find(ID).Item("Last_User") = My.Settings.User
    191. Case Taskbox.Text = "Return"
    192. If Status = "Sent" Then
    193. Document_ExchangeDataSet.Tables(0).Rows.Find(ID).Item("Date_Arrived") = Date.Now
    194. End If
    195. Document_ExchangeDataSet.Tables(0).Rows.Find(ID).Item("Status") = "Return"
    196. Document_ExchangeDataSet.Tables(0).Rows.Find(ID).Item("Date_Returned") = Date.Now
    197. Document_ExchangeDataSet.Tables(0).Rows.Find(ID).Item("Reason_Returned") = cmdReason.Text
    198. Document_ExchangeDataSet.Tables(0).Rows.Find(ID).Item("To_Manager") = txtReason.Text
    199. Document_ExchangeDataSet.Tables(0).Rows.Find(ID).Item("Last_Location") = My.Settings.Location
    200. Document_ExchangeDataSet.Tables(0).Rows.Find(ID).Item("Last_User") = My.Settings.User
    201. Dim dsNewRow As DataRow 'Nun wird die Sendung erneut erstellt
    202. dsNewRow = Document_ExchangeDataSet.Tables(0).NewRow()
    203. dsNewRow.Item("Date_Create") = Date.Now
    204. dsNewRow.Item("Status") = "Sent"
    205. dsNewRow.Item("Doc_No") = txtID.Text
    206. dsNewRow.Item("Date_Doc") = cmdDocDate.Value
    207. dsNewRow.Item("Sender") = txtShipper.Text
    208. dsNewRow.Item("Doc_Name") = txtDocname.Text
    209. dsNewRow.Item("Doc_Type") = txtType.Text
    210. dsNewRow.Item("Date_Sent") = Date.Now
    211. dsNewRow.Item("To_Manager") = txtReason.Text
    212. dsNewRow.Item("Last_Location") = My.Settings.Location
    213. dsNewRow.Item("Last_User") = My.Settings.User
    214. Document_ExchangeDataSet.Tables(0).Rows.Add(dsNewRow)
    215. Case Else
    216. MsgBox("Please select an Task")
    217. GoTo Skipmarke 'Vieleicht ueberpruefen. Die Communtiy ist nicht begeistert
    218. End Select
    219. DBRefresh()
    220. txtID.Text = "" 'Alles auf Null setzten
    221. Clear()
    222. txtID.Focus()
    223. btnClose.Text = "Save & Close"
    224. SkipMarke:
    225. End Sub
    226. Private Sub ToolStripComboBox1_TextChanged(sender As Object, e As System.EventArgs) Handles txtFilterStatus.TextChanged
    227. Dataviewer.DataSource = 0
    228. Dataviewer.DataSource = Document_ExchangeDataSet.Tables(0).Select("Status='" & txtFilterStatus.Text & "'", "ID DESC")
    229. End Sub
    230. End Class





    Fuer Hilfe waehre ich sehr dankbar!

    Mit freundlichen Gruessen

    HolyAbsolut
    na, du hast die DAtenbank und das Dataset so konfiguriert, dass Nullwerte zulässig sind.
    Nun musstedich auch damit herumschlagen.

    Einfacher wäre gewesen, Nullwerte von vornherein garnicht erst in die DB reinzulassen. Wenn das vonne Logik her Sinn macht.


    ErfinderDesRades - Moderator - Notiz: und bitte drauf achten, im richtigen Unterforum zu posten - thx!
    Hallo,

    Danke fuer die rasche Antwort.
    Ich glaube das ist bei mir micht moeglich. Das Programm soll den Verlauf von Dokumenten protokollieren. Daher kann es grundsaetzlich vorkommen das ein Dokument/Zeile gar nicht versendet oder bearbeitet wird so dass in der entsprechende Spalte kein Datum vorhanden ist.

    Ich bin davon ausgeangen das es in meinem Code ein Fehler gibt. Denn immerhin funktionert ja das fuellen der ganzen Tabelle und nur meinen Filter mag er nicht.

    Aber wenn es da keine Loesung gibt werde ich einfach ein voellig neues "FilterDataset" erstellen und dies dann in Viewer ueberspielen.
    Das waere zwar nicht schoen muesste aber funktionieren(und ausserdem machte es bei dem Code warscheinlich auch nichts mehr :whistling: ).

    Mit freundlichen Grussen

    HolyAbsolut
    neinnein - ein Groß-Umbau ist nicht nötig. Es ist durchaus standardmäßig vorgesehen, dass Datensatz-Properties auch DBNull sein können. Nur kann man sie nicht abrufen, wenn sie DBNull sind. Stattdessen gibts typisierte Methoden, um vor Abruf zu testen, ob der Abruf möglich ist.

    Bei dir heisst die Methode vermutlich <DocumentDataRow>.IsDate_ArrivedNull() - so sollte der DatasetDesigner die Methode generiert haben.

    genau nachgucken kannst du solch dinge wie in Dataset im OB gezeigt.
    Ich hab mir auch den Code weiter unten mal angesehen, ist mir aber zu wenig beschreibender Text.
    Sehe zwar wor du den pfad aufnimmst, aber wo wird eingelsen, wo wird das Datagridview gefüllt... bestimmt ist das irgedndwo aber...

    Zeilen in einem DatagridView auf DbNuil checken, geht so(wo es platz hat in deinem Code seh ich nicht):

    Quellcode

    1. Dim MyRowView As DataRowView = Nothing
    2. Dim i As Integer = 0
    3. For Each dataGridViewRow As DataGridViewRow In dataGridView.Rows
    4. If dataGridViewRow.IsNewRow Then
    5. Continue For
    6. End If
    7. MyRowView = DirectCast(dataGridViewRow.DataBoundItem, DataRowView)
    8. If IsDBNull(MyRowView(0)) Then ' kann man noch ergänzen um über alle Clm zu gehen
    9. 'was immer
    10. End If
    11. Next
    Hallo,

    @ErfinderDesRades

    Ich hab die stelle im Dataset.Designer gefunden

    VB.NET-Quellcode

    1. <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
    2. Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")> _
    3. Public Function IsDate_SentNull() As Boolean
    4. Return Me.IsNull(Me.tableDocManagment.Date_SentColumn)
    5. End Function

    Aber was nun? Ich habe lange gesucht und war gluecklich die stelle gefunden zu haben... Allerdings wusste ich dann gar nicht was ich machen muss.

    @Edwardschn
    Ungluecklicherweise passiert das erst in der vorletzten Zeile

    VB.NET-Quellcode

    1. Private Sub ToolStripComboBox1_TextChanged(sender As Object, e As System.EventArgs) Handles txtFilterStatus.TextChanged
    2. Dataviewer.DataSource = 0
    3. Dataviewer.DataSource = Document_ExchangeDataSet.Tables(0).Select("Status='" & txtFilterStatus.Text & "'", "ID DESC")
    4. End Sub

    Aber wenn ich deinen Code richtig lese pruefst du ob die das Feld Null ist und wuerdest dies dann ersetzen oder ?
    Da die Spalte als Date formartiert ist werde ich ja kein "" einfuegen duerfen was wiederum verhindert das die Spalte leer angezeigt wird.

    Wenn das stimmt dann waere das zumindest in meine Fall nicht so geeignet.

    Unabhaengig von euren Vorschlaegen habe ich etwas experemintiert und einfach die Fehlermeldung unterdruckt.

    VB.NET-Quellcode

    1. <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
    2. Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")> _
    3. Public Property Date_Sent() As Date
    4. Get
    5. Try
    6. Return CType(Me(Me.tableDocManagment.Date_SentColumn),Date)
    7. Catch e As Global.System.InvalidCastException
    8. 'Throw New Global.System.Data.StrongTypingException("Der Wert für Spalte Date_Sent in Tabelle DocManagment ist DBNull.", e)
    9. End Try
    10. End Get
    11. Set
    12. Me(Me.tableDocManagment.Date_SentColumn) = value
    13. End Set
    14. End Property


    Das ist sicher nicht die feine Art ..... Aber ich konnte bisher keine Nachteile entdecken...

    Vielen Dank

    HolyAbsolut
    Ich hab die stelle im Dataset.Designer gefunden
    Dassis nicht der Dataset-Designer, sondern der Designer-Code, also der, den der Designer generiert hat.
    In diesem Code hast du garnix verloren.
    Ich sagte - suche dies typisierte DataRow im ObjectBrowser, und verlinkte sogar auf ein Bildle, wie sowas aussieht.
    Hier kannste noch mehr über den ObjectBrowser lernen - is wichtig!


    .... Aber ich konnte bisher keine Nachteile entdecken...
    sobald du den Dataset-Designer nochmal nutzst, wird der DesignerCode neu generiert, und deine Änderungen sind futsch.
    Wie gesagt: In DesignerCode hast du nix verloren - gugge darfste, aber drin rumpfusche - das wird nix :thumbdown:

    Mit dieser IsDate_SendNull() - Methode musst du vor jedem Zugriff auf Date_Send prüfen, ob der Zugriff möglich ist - ist doch logisch.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()