NullReferenceException

  • VB.NET

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

    NullReferenceException

    Liebe Helfergemeinde, ich verstehe folgende Situation nicht:
    Eine an Dataset1 gebundene Tabelle lässt sich speichern und wieder lesen, in der weiteren Bearbeitung der in jener Tabelle vorhandenen Werte wird aber immer wieder eine Null Reference Exception angegeben. Und die Table, die wenige Codezeilen zuvor noch geladen und sichtbar gemacht wurde, wird als "Nothing" bezeichnet. Dieses Verhalten verstehe ich nicht.
    Der Codeausschnitt sieht wie folgt aus:

    VB.NET-Quellcode

    1. Dim table As New DataTable
    2. table = DataSet1.Tables(xmlFilePath)
    3. Dim i As Integer
    4. Dim Zeile() As DataRow
    5. DataSet1.Clear()
    6. DataSet1.ReadXml(xmlFilePath)
    7. If Not File.Exists(xmlFilePath) Then
    8. MsgBox("File scheint nicht zu existieren")
    9. End If
    10. If table Is Nothing Then Stop
    11. Else
    12. If table.Rows.Count = Nothing Then Stop
    13. If table.Rows.Count = 0 Then Stop
    14. If table.Rows.Count > 49 Then
    15. MsgBox(" ! ! Tabelle ist gefüllt, Dateneingabe nicht möglich !")
    16. End If

    Die Read-Anweisung zeigt in einem Datagridview sämtliche Daten an, aber "table" ist angeblich nicht existent.
    Hat jemand eine Idee, welchen Denkfehler ich mache ?
    Danke für Rückmeldung !

    CodeTags gesetzt ~VaporiZed

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

    Ein paar Sachen versteh ich nicht.
    Wozu in Zeile#1: As New DataTable, wenn in der nächsten Zeile das wieder neu zugwewiesen wird. Da reicht für Z#1 und #2: Dim table = DataSet1.Tables(xmlFilePath)
    Wozu schaust Du erst ab Z#7, ob die Datei existiert, obwohl sie schon 2x verwendet wurde?
    Was bewirkt Deines Erachtens table = DataSet1.Tables(xmlFilePath)? Was soll denn der Compiler drunter verstehen, wenn dann folgendes entsteht: table = DataSet1.Tables("C:\Users\woofy49\Dokumente\DataSet1.xsd")? Das ergibt inhaltlich wahrscheinlich nicht sonderlich viel Sinn, oder? Und wird wahrscheinlich der Grund sein, warum Dein Programm nicht macht, was es soll. Ich glaube nicht, dass es eine Tabelle mit jenem Namen in Deinem DataSet gibt. Aber genau den forderst Du an.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ist doch wohl sonnenklar:

    VB.NET-Quellcode

    1. table = DataSet1.Tables(xmlFilePath)
    Dataset1 enthält keine Table namens <xmlFilePath> - was immer in xmlFilePath auch drin stehen mag.



    woofy49 schrieb:

    Die Read-Anweisung zeigt in einem Datagridview sämtliche Daten an
    Die ReadAnweisung zeigt garnix an, die Read-Anweisung befüllt Dataset1.
    Das ändert ja nix daran, dass table Nothing ist - wie sollte es auch?
    Vielen Dank für die rasche Antwort!
    Dieses Code-Kauderwelsch kommt durch meine - offensichtlich untauglichen - Versuche zustande, jene "Hinweise zur Fehlerbehebung" der Intellisense-Abtlg. umzusetzen. Und hier war eine der Empfehlungen, mit new zu instanziieren (was ich offenbar fälschlich auf table bezogen habe)
    Meine Ausgangssituation war genau die, die Du schreibst: Dim table = Dataset1.Tables(xmlFilePath).
    Ich habe dies wieder zurück geändert und bin beim Zustand von zuvor, dass nämlich Zeile 13 (siehe oben) angemeckert wird mit der NullReferenceException.
    Die Abfrage, ob das File existiert, läuft nun offenbar durch, aber wenige Zeilen später kommt der Rausschmiss .
    Ich kann nicht nachvollziehen, weshalb eine Prüfung auf Nothing selbst als NullReferenzException angemeckert wird.

    Zu EdR:
    Wie kann ich mir denn erklären, dass die an Dataset1 gebundene table gespeichert und wieder eingelesen werden kann?
    Und wie kann ich - wenn table nothing ist - diese entstehen lassen ohne new-Instanziierung ?



    Zur Erläuterung meiner "Blockade" im Verständnis der Aussage, dass table gleich nothing ist:
    Die Tabelle ("table") hatte ich gem. den aus meiner Sicht sehr plausiblen Vorgaben des Tutorials von EdR (die vier Views) als typisierte Datasets angelegt. Deshalb ging ich davon aus, dass die dort angelegte Tabelle weiter ausgewertet werden kann. Deshalb werde ich nicht schlau aus der Kritik des Intellisence.
    Und das Funktionieren des WriteXML und ReadXML dieses Datasets schien mir das Funktionieren des Tabelle-Anlegens zu bestätigen. Warum ist "table" leer, wenn der Befehl table = Dataset1.Tables(Pfad...) akzeptiert wird?

    Zwei Stunden später:
    Die Erklärung: Der Speicherort wurde zu einem späteren Zeitpunkt als zur Entwicklung des Dataset geändert. Dies konnte ich nicht sehen, da im Code sämtliche Pfad-Angaben übereinstimmten, aber offenbar nicht deckungsgleich der im Hintergrund laufenden Befehle. Danke EdR - denn Deine Bemerkung
    "Die ReadAnweisung zeigt garnix an, die Read-Anweisung befüllt Dataset1.Das ändert ja nix daran, dass table Nothing ist - wie sollte es auch?"
    brachte mich darauf !

    Jetzt kommt das Problem an nächster Stelle - ein Rauswurf (NulException...) beim ersten Aufruf der Zeile. Aber hier versuche ich mich zunächst selbst :)

    Beiträge zusammengefügt. ~Thunderbolt

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Thunderbolt“ ()

    Tippe Dim myTable = DataSet1. ''Hier gucken was Intellisense für Vorschläge nach dem Punkt macht.

    Sagen wir der schlägt 'TolleTabelle' vor.
    Dann reicht dein Code so:

    VB.NET-Quellcode

    1. DataSet1.Clear
    2. DataSet1.ReadXml(xmlFilePath)
    3. If DataSet1.TolleTabelle.Count > 0 Then MessageBox.Show("Tabelle ist gefüllt, Dateneingabe nicht möglich")
    Danach gibt es auch bei einer Row keine NullReference.
    Eine Row ist dann z.B. DataSet1.TolleTabelle(Zeilenindex)

    Und wenn da keine Tabelle vorgeschlagen wird, dann hast du das DataSet noch gar nicht entworfen. Das würde ich aber raten zu tun, siehe obige Abkürzungen

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

    woofy49 schrieb:

    Aber hier versuche ich mich zunächst selbst

    ach - arbeitest du mit einem typisierten Dataset?
    Na dann sind die zeilen #1, #2 auch post#1 bereits pures Gift. Bei Arbeit mit einem typDataset darf schon das wort DataTable im Code überhaupt garnicht irgendwo auftauchen.
    Kannste auch im Tut-Code gucken: DataTable gibts da nicht.
    Weil DataTable ist die untypisierte Basisklasse der typisierten Table-Klassen, und dieser Basisklasse fehlen sämtliche Features, die ein typisiertes Dataset typisiert machen.
    Was ich sagen will: Probiere nicht selber weiter rum - mit DataTable bist du auf dem Holzweg, und es geht immer tiefer in den Wald.
    Beherzige meinen Vorposter.
    Was du auch machen kannst, poste ein Bild deines typDatasets. Daran können wir ablesen, wie bei dir die Tabellen heissen, und dir genauer zeigen, wie mans richtig macht.
    Danke für die Aufklärung hinsichtlich des DataSet-Gebrauchs - das hatte ich in der Tat nicht verstanden, nach der Erklärung jetzt über den Unterschied (Basisklasse....) schon.
    Die von "Hausdruf...." vorgeschlagene Vorgehensweise half mir, den ursprünglich verwendeten Namen der Tabelle wiederzufinden: Eingabe Maske (wobei Intellisense immer einen Unterstrich einfügt, das hatte mich ohnehin schon verwirrt). Aber jetzt ist zumindest das korrekte Einlesen der Tabelle gewährleistet.
    Aus den Tutorials hatte ich in Erinnerung, dass in der weiteren Verwendung der Tabelle immer die BindingSource angesprochen werden muss - ich gestehe, dass ich dies nicht verstehe bzw. hinbekomme - deshalb der Code mit datatable....
    Im Folgenden der Screenshot der Eingabemaske (ich weiß nicht, ob Dir dies reicht?)
    Dateien

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

    Das Tut verweist auch auf ein anderes Tut auf Codeproject. Dort werden wichtige Tipps zur Benamung gegeben.
    Eine Tabelle Eingabe Maske zu nennen - unglücklicher gehts kaum.

    Ansonsten frug ich nach einem Screenshot des Datasets. Von einer Eingabemaske brauche ich keinen Screenshot.
    Jo, und ich seh gar kein Screenshot - was bedeutet "im Folgenden"?
    @woofy49: Lade keine PDF, sondern eine Bilddatei hoch, dann können wir das Bild auch sofort sehen, siehe EdR-Tutorial zu Anhängen
    8| Visual Basic 2010 Express?!? Wir sind inzwischen bei der kostenlosen VS 2022 Community Edition angelangt …
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    Dann läuft das doch alles, wie oben gezeigt.

    VB.NET-Quellcode

    1. DataSet1.Clear
    2. DataSet1.ReadXml(xmlFilePath)
    3. If DataSet1.Eingabe_Maske.Count > 0 Then MessageBox.Show("Tabelle ist gefüllt, Dateneingabe nicht möglich")

    BindingSource brauchst du erst wenn du was anzeigen willst. Entweder du ziehst dir eine BS aufs Form, dann ist das zuordnen schöner oder du schreibst es in den Code
    Dim bs as New BindingSource With {.DataSource = DataSet1.Eingabe_Maske}
    Controls die eine DataSource haben kriegen dann diese bs als DataSource zugewiesen. Die Combobox hat zum Beispiel noch einen DisplayMember, da kannst du die Spalte auswählen.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Dank Eurer Hilfe bin ich jetzt weiter gekommen.
    Erstens gab es das beschriebene Benamsungs-Kuddelmuddel, welches durch das Intellisense-Angebot "nach dem Punkt" geklärt werden konnte. Ein schwerwiegenderes Problem war aber die NullReferenz-Anklage. Es stellte sich heraus, dass ich die (als Vereinfachung gedachte) Einführung der indizierten Variablen "Zeile()" nicht richtig eingeführt habe, so dass die vorgesehene Ableitung von "Tabelle.rows()" nicht funktionieren konnte. Ich habe nun "Zeile" durch "Tabelle.rows()" ersetzt, und nun werden die Schleifen alle durchlaufen.
    Vielen Dank an EdR und Haudruff...