Erneuter Codedurchlauf im selben Debug-Prozess klappt nicht

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Erneuter Codedurchlauf im selben Debug-Prozess klappt nicht

    Hallo Leute,

    ich habe mich gerade bei VB-Paradise angemeldet und hoffe, dass ich mit meiner Frage im richtigen Bereich gelandet bin (dies ist mein erster Post in einem VB-Forum).
    Ich versuche es mal zu erklären:

    Ich arbeite an einem Programm, das Berechnungen mit Access-Tabellen anstellt. Die Access-Tabellen fülle ich am Anfang des Programms (in einem extra Modul) alle in ein einziges global definiertes DataSet ein.
    Bei einer Oberfläche (Form) des Programms kann man sich in einer DataGridView Tabellenwerte anzeigen lassen. In dem Code dieser Form werden diese Tabellenwerte in Schleifen aus verschiedenen DataTables herausgefiltert. Zudem werden bei DataTable drei Spalten hinzugefügt.
    Bis hierhin klappt alles.

    Mein Problem:

    Wenn ich von dieser Form auf die vorige Form zurückgehe und dann wieder auf meine Form gehe, tritt ein Fehler auf.
    (Ich starte den Debug-Prozess nicht neu)

    dt7 , dt5 und dt13 sind global definierte DataTables. Die Spalte "Gewicht" habe ich bei dt13 zuvor hinzugefügt. Wenn ich in der Form auf den Button "Zurück" klicke, lösche ich diese Spalte wieder mit dt13.Columns.Remove("Gewicht") .

    Besagter Fehler: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

    Betroffener Codeabschnitt:

    Dim Schlüssel_KM
    dt13.Columns.Add("Gewicht")
    For i = 0 To dt13.Rows.Count - 1
    Dim Schlüssel_KM_K = dt13.Rows(i).Item("Komponentenmerkmale").ToString
    Dim Name_KK = dt13.Rows(i).Item("Komponentenklasse")
    If Schlüssel_KM_K = "" Then
    Dim Rows1() As DataRow = dt5.Select("Name_KK = '" & Name_KK & "'")
    If Rows1.Count > 0 Then
    Dim Schlüssel_KM_KK = Rows1(0).Item("Komponentenmerkmale").ToString

    If Schlüssel_KM_KK = "" Then
    dt13.Rows(i).Item("Gewicht") = 0
    Else
    Schlüssel_KM = Schlüssel_KM_KK
    End If
    End If
    dt5.Clear()

    Else
    Schlüssel_KM = Schlüssel_KM_K
    End If

    Dim Rows33() As DataRow = dt7.Select("Name_BEZ = 'Gewicht' AND Schlüssel_KM = '" & Schlüssel_KM & "'")
    Dim Merkmalswert As String = Rows33(0).Item("Merkmalswert").ToString
    If Merkmalswert <> "" Then
    dt13.Rows(i).Item("Gewicht") = Merkmalswert '''''''''''''''''''FEHLER: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt
    'Merkmalswert = "" 'neu
    Else
    dt13(i).Item("Gewicht") = 0
    End If
    Next

    Ich kann mir den Fehler nicht erklären, da dt15 doch global definiert ist und ich doch die Spalte "Gewicht" am Ende lösche. : /
    Für jegliche Denkanstöße bin ich dankbar, da ich mich grad im Kreis drehe.

    Liebe Grüße VBlisa
    DAtenverarbeitung hat kein Sinn, wenn mans nicht mit typisierten Datasets ausführt.

    Das ist vlt. n Haufen Stoff zu lernen, aber dann befleißigt man sich eines völlig anneren Programmier-Stils, der üblicherweise nicht ein viertel des Codes benötigt, wie der herkömmliche (wobei "herkömmlich" nicht ganz das passende Adjektiv ist, denn das typDataset ist die vorgesehene Technologie, und also herkömmlich, und das genannte Code-Gewurstel ist besser qualifiziert als der "noob-Stil").

    guggemol "Datenbank in 10 Minuten" auf Movie-Tuts

    Du hast dir als Anfänger gleich noch ein Problem aufgehalst, nämlich eine Datenverarbeitung mit global zugreifbaren Daten.
    Ich würde empfehlen, diese Komplexität erstmal hinanzustellen, und den Umgang mittm typDataset erstmal auf ein und demselben Form zu erlernen.
    Es geht gewaltig viel Funktionalität auf ein Form, wenn man die Funktions-Module auf verschiedenen Tabpages eines TabControls anbringt.

    Dassis meist auch noch userfreundlicher als ein Design mit aufpoppenden Dialogen.

    jdfs.: Ärger dich erstmal mit "Datenbank in 10 Minuten" auf Movie-Tuts rum ;)
    Hallo,

    vielen Dank für die schnellen Antworten. :)

    @ErfinderDesRades: Deinen Linktipp werde ich mir zu Gemüte führen. Was das Programm betrifft: Ich habe das Programm von meinem Vorgänger übernommen und habe vor allem die Aufgabe, die ganzen Datenbankzugriffe in Zugriffe auf den Zwischenspeicher umzuwandeln (macht ja in Schleifen Sinn). Ich habe bloß den Eindruck gewonnen, dass man das nicht so "einfach" mal umschreiben kann. ;) Die äußere Form mit den ganzen Oberflächen und Buttons usw. soll ich laut meinem Betreuer so lassen.
    "Umschreiben" kannste total vergessen.
    Wenn dein Vorgänger nicht mit Databinding programmiert hast, dann kann das alles in die Tonne, und neu coden.

    Verwendbar ist allenfalls die Datenbank-Struktur (also das Datenmodell), aus der sich dann ja das typDataset generieren lässt.

    Wenn das Datenmodell gut ist, ist das übrigens durchaus nicht wenig, um nicht zu sagen: schon mal das wichtigste.
    Wenn es gut ist...

    "Die Oberfläche so lassen" ist Quark - du mußt eine neue, datengebundene machen - dassis eiglich auch kein Act.
    Und kannst versuchen, sie genauso aussehen zu lassen wie vorher - wenn sie vorher gut war.
    Wenn bei deiner Entwicklung aber bessere Möglichkeiten sich eröffnen, sollteste mit deim Betreuer darüber sprechen, was Vorrang hat: der alte Zopf, oder eine benutzerfreundlichere Oberfläche.

    VBlisa schrieb:

    Erneuter Codedurchlauf im selben Debug-Prozess
    kann nur dann identisch funktionieren, wenn Du Datenbanken und andere externe Ressourcen ebenfalls zurücksetzt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    VBlisa schrieb:

    Erneuter Codedurchlauf im selben Debug-Prozess
    kann nur dann identisch funktionieren, wenn Du Datenbanken und andere externe Ressourcen ebenfalls zurücksetzt.
    Die Verbindung zur Datenbank öffne ich am Anfang des Programms 1x um alle Tabellen daraus ins DataSet einzuspeisen.
    Danach arbeite ich im Programm nur noch mit den DataTables aus dem Zwischenspeicher.
    Die DataTables habe ich in der betroffenen Form lokal definiert - also müssten diese doch beim schließen der Form wieder "weg sein" oder nicht? Ich glaub ich habe ein Brett vorm Kopf... mein Betreuer kann mir leider auch nicht helfen. :thumbdown:
    Am Ende der betroffenen Form setze ich nur die Tabellen aus dem DataSet wieder zurück ... und das klappt auch bis auf das Problem mit der Objektinstanz beim zweiten Mal durchlaufen. Wenns nicht klappen würde, gäb's ja das Problem, dass die Tabellenspalten, die ich in der Form eig. neu reinladen möchte, schon existieren usw.
    Wenn das Programm beim 1. Mal nicht vollständig und / oder nicht korrekt durchläuft, wird ggf. eine defekte / andersartige Datenbank hinterlassen.
    Vielleicht generierst Du Dir eine Master-DB und lässt sie vom Studio nach jedem (erfolgreichen) Build an die entsprechende Stelle kopieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!