pcfjkg
Goto Top

VB.NET: Der Wert darf nicht NULL sein. Parametername: dataSource

In VB.Net (Visual Studio Version 16.11.40) soll an ein Datagridview eine Datatable gebunden werden. Lange funktionierte wie üblich: DGV.Datasource = xxx.Dataset.Tables("T_xxx"). Ich habe im Projekt Mehreres geändert, weiß aber nicht mehr alle Änderungen. Jetzt sagt der Debugger an dieser Stelle: ... Der Wert darf nicht NULL sein. Parametername: dataSource ...
Ich habe gesucht, die mir noch erinnerlichen Änderungen rückgängig gemacht, finde aber die letztlich die Ursache nicht. Das ansonsten hilfreiche Internet ist bei diesem Fehler nicht sehr ergiebig. Was bzw. wie könnte ich debuggen, um der Ursache näher zu kommen ? Die datatable hat 1 Row mit 7 Columns. Nichts besonderes (1 PK, sonst "normale" integer und string Spalten).
Danke, PCFJKG

Content-ID: 668109

Url: https://administrator.de/contentid/668109

Ausgedruckt am: 24.11.2024 um 03:11 Uhr

150704
150704 13.09.2024 aktualisiert um 15:55:32 Uhr
Goto Top
WOW Respekt, ich seh hier nix an Code ... face-sad
Der Wert darf nicht NULL sein. Parametername: dataSource
Vertippt beim Tabellennamen des Datasets? Oder Dataset leer.
Snuffchen
Snuffchen 13.09.2024 um 15:54:41 Uhr
Goto Top
Schau doch erstmal ob in deinem Dataset überhaupt was drin ist! Und wenn nicht, dann schau wo du es befüllst.
PCFJKG
PCFJKG 13.09.2024 um 15:56:43 Uhr
Goto Top
OK, Ergänzung wie folgt:
If IsNothing(TP.Controls("DGV_ICD10")) Then  
			DGV = New DataGridView With {.Name = "DGV_ICD10"}  
			TP.Controls.Add(DGV)
			AddHandler DGV.KeyUp, AddressOf Me.DGV_KeyUp
			AddHandler DGV.CellDoubleClick, AddressOf Me.DGVCellDoubleClick
		Else
			DGV = DirectCast(TP.Controls("DGV_ICD10"), DataGridView)  
			DGV.Visible = True
		End If

			With DGV
				.AllowUserToAddRows = False
				.AllowUserToResizeRows = False

				.DataSource = FAR.DS.Tables("T_ICD10") 'icd10DS  
usw.usf.
PCFJKG
PCFJKG 13.09.2024 um 15:58:13 Uhr
Goto Top
Danke, die Tabelle hat 1 Row, was nicht möglich wäre, wenn das Dataset leer ist.
150704
150704 13.09.2024 aktualisiert um 16:03:07 Uhr
Goto Top
Breakpoints im Code setzen und im Debugger alle Variablen und Ausdrücke live nachprüfen dann findest du auch den Fehler!
FAR.DS.Tables("T_ICD10")
Fehlt uns hier der Kontext, das bringt so nix, denke daran das wir hier nur das haben was du uns an Infos lieferst! No input no output.
Snuffchen
Snuffchen 13.09.2024 um 16:01:54 Uhr
Goto Top
Heißt die Tabelle im Dataset auch "T_ICD10"
PCFJKG
PCFJKG 13.09.2024 um 16:06:05 Uhr
Goto Top
In dieser Funktion
Function DGVICD10CodeCreateAndShow(TP As TabPage) As Boolean <<<
gibt es nut 3 Variable

		Dim CDF As New C_DivFkt
		Dim DGV As DataGridView
		Dim FAR As F_Abrechnungen = F_Abrechnungen
Alle 3 und auch die übergebene TP zeigen keinen Fehler oder andere "Auffälligkeiten".
PCFJKG
PCFJKG 13.09.2024 aktualisiert um 16:11:34 Uhr
Goto Top
Ja. an anderer Stelle : ... FAR.DS.Tables.Add("T_ICD10"). Die Frage ist eben, was bedeutet NULL in diesem Zusammenhang und wo bzw. wie kann man diese NULL suchen oder auch nur vermuten.
Snuffchen
Snuffchen 13.09.2024 aktualisiert um 16:12:11 Uhr
Goto Top
Die ursprüngliche Meldung besagt doch, das du der Datasource einen NULL-Wert übergibst,
also ist höchstwahrscheinlich irgendwas mit deinem Dataset/Datatable nicht in Ordnung

Sollte sich aber bei Debuggen schnell finden lassen, was steht denn in der EX-Message und im Stacktrace wenn der Fehler auftritt?
150704
150704 13.09.2024 aktualisiert um 16:15:23 Uhr
Goto Top
Hier nen Brocken da nen Brocken 🤮 , mittels Breakpoint kurz vor der Zuweisung kannst du schön selbst prüfen was da NULL ist, nicht nur die Variablen sondern explizit der Ausdruck den den du der Datasource zuweist!
Und auch das DataGridView selbst.
PCFJKG
PCFJKG 13.09.2024 um 16:15:07 Uhr
Goto Top
Sehe ich auch so. Wie aber kann eine Datatable NULL sein, wenn sie 1 Row hat.
150704
150704 13.09.2024 aktualisiert um 16:24:18 Uhr
Goto Top
Dim FAR As F_Abrechnungen = F_Abrechnungen
Das sieht mit sehr verdächtig aus, ein Objekt genauso benannt wie eine Klasse?? Da wird der Hase im Pfeffer liegen.
PCFJKG
PCFJKG 13.09.2024 um 16:22:21 Uhr
Goto Top
Sorry, ich wollte nur das vermeintlich Wesentliche senden. Nun ausführlicher:

Function DGVICD10CodeCreateAndShow(TP As TabPage) As Boolean
		Dim CDF As New C_DivFkt
		Dim DGV As DataGridView
		Dim FAR As F_Abrechnungen = F_Abrechnungen

		If IsNothing(TP.Controls("DGV_ICD10")) Then  
			DGV = New DataGridView With {.Name = "DGV_ICD10"}  
			TP.Controls.Add(DGV)
			AddHandler DGV.KeyUp, AddressOf Me.DGV_KeyUp
			AddHandler DGV.CellDoubleClick, AddressOf Me.DGVCellDoubleClick
		Else
			DGV = DirectCast(TP.Controls("DGV_ICD10"), DataGridView)  
			DGV.Visible = True
		End If

		Try
			With DGV
				.AllowUserToAddRows = False
				.AllowUserToResizeRows = False
				.DataSource = FAR.DS.Tables("T_ICD10")  
				.Location = New Point(1022, 26)

				.BackgroundColor = SystemColors.GradientInactiveCaption

				.MultiSelect = False
Bei Ausführung von .DataSource = FAR.DS.Tables("T_ICD10")
wird die exception (mittels try - catch) der o.g. Fehlermeldung ausgelöst.
PCFJKG
PCFJKG 13.09.2024 um 16:27:04 Uhr
Goto Top
Dim FAR As F_Abrechnungen = F_Abrechnungen
F_Abrechnungen ist eine Form. Hier wird auf sie in einer anderen Klasse verwiesen. Zugegeben etwas ungewöhnlich, hat aber tatsächlich bisher funktioneirt.
150704
150704 13.09.2024 aktualisiert um 16:34:09 Uhr
Goto Top
Zitat von @PCFJKG:

Dim FAR As F_Abrechnungen = F_Abrechnungen
F_Abrechnungen ist eine Form. Hier wird auf sie in einer anderen Klasse verwiesen. Zugegeben etwas ungewöhnlich, hat aber tatsächlich bisher funktioneirt.
Nä das ist bäh, fällt dir aber auch jetzt auf die Füße wie du siehst face-smile. Und wieso eine neue Variable wenn die die ja schon direkt im Zugriff hast??
FAR.DS.Tables("T_ICD10")
Eine Form hat per Default keine Property Namens DS, wird diese überladen?
Deswegen sag ich ja Breakpoint setzen dann siehst du solche Schweinereien sofort.
PCFJKG
PCFJKG 13.09.2024 aktualisiert um 16:35:32 Uhr
Goto Top
Public Class F_Abrechnungen (ist das Formular)
...
...
...
Public DS As DataSet

und später in einer anderen Klasse beim Öffnen des Formulars (auch hier FAR As F_Abrechnungen = F_Abrechnungen):

If IsNothing(FAR.DS) Then
FAR.DS = New DataSet
End If
150704
150704 13.09.2024 aktualisiert um 16:39:09 Uhr
Goto Top
Wie gesagt, Variablen gleich benennen wie eine Klasse führt zu solchen Problemen. Das solltest du als erstes ändern.

Außerdem ist das Zugreifen auf externe Objekte aus der Funktion schlechter Stil. Du gehst davon aus das das Objekt existiert ohne das du es prüfst, ohne Try Catch führt das dann zusätzlich zum kompletten Abschmieren.
PCFJKG
PCFJKG 13.09.2024 aktualisiert um 16:45:41 Uhr
Goto Top
Von mir kein Widerspruch, das sind Programmmodule aus meiner alten Umstiegzeit von Access. Ändern ist aber viel Aufwand und - wie gesagt hat bisher funktioniert - und Erfahrung: never touch a working system hielt mich davon ab.
Mal sehen. Auf alle Fälle hast Du Dir wenigstens die Mühe und Überlegungen gemacht. Dafür unbedingt danke, vielleicht gibt es diese Nacht eine Eingebung für das Programmierwochende. Dir ein schönes WE und vielleicht bis bald.
PCFJKG