Nachhilfe DataAdapter DataSet und DataTable

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Haudruferzappeltnoch.

    Nachhilfe DataAdapter DataSet und DataTable

    Hallo,

    Fülle ich mit einem DataAdatpter immer ein DataSet oder kann ich direkt eine DataTable befüllen. Eine schlichte SQL-Abfrage ist doch nur eine Tabelle, oder gibt es da mehr zu beachten?
    Wie unterscheidet sich normalerweise ein DataSet mit nur einer Tabelle zu einer DataTable?

    Viele Grüße
    Ja das geht

    Dim dt as new DataTable
    Dim adapter As New sqladapter()
    adapter.Fill(dt)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Ok, dann bin ich am Ende meiner Idee. Ich erhalte beim Füllen eine Fehlermeldung: Fill: SelectCommand.Connection wurde nicht initialisiert
    Ich denke es handelt sich dann um einen Fehler bei NpgConn? Ich hole die aus einer anderen Class, werden die Eigenschaften (.ConnectionString) mit übernommen oder gibt es da einen Reset?

    VB.NET-Quellcode

    1. Using cmd = New NpgsqlCommand(Npgstring, f.NpgConn)
    2. Using sda As New NpgsqlDataAdapter(cmd)
    3. Using dt As New DataTable()
    4. sda.Fill(dt)
    5. dgv1.DataSource = dt
    6. End Using
    7. End Using
    8. End Using

    Ich sag mal so, in Form1 verwende ich denselben cmd ohne Probleme. Dass das einmal geht und einmal nicht, würde mich definitiv auf Form2 festsetzen.

    Also dort dann ohne f., aber theoretisch könnte ich ja auch f. mal in Form1 probieren. (Schaff ich leider erst morgen)

    VB.NET-Quellcode

    1. Using cmd = New NpgsqlCommand(Npgstring, NpgConn)
    Denke f.NpgConn ist leer oder Nothing oder ähnliches… wo kommt das „f“ überhaupt her?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Haudruferzappeltnoch schrieb:

    Ich sag mal so, in Form1 verwende ich denselben cmd ohne Probleme. Dass das einmal geht und einmal nicht, würde mich definitiv auf Form2 festsetzen.
    Ich hab nicht das Gefühl, dass du damit auf irgendetwas eingehst, was ich den Post davor gesagt habe, nämlich:

    ErfinderDesRades schrieb:

    der meldung nach würde ich als erstes gucken, ob dieses npgCommand-Dingens auch einen CommandText hat, und was da drin steht.
    Tatsächlich verstehe ich den Sinn des Satzes garnet:
    Wieso würde es dich auf Form2 festsetzen (was immer das bedeutet), wenn es in Form1 funktioniert?

    Aber egal, was deine Einlassung auch bedeutet - ich sehe es nachwievor als den Königsweg, wenn du der Fehlermeldung einfach nachgehst, anstatt irgendwie was anderes herumzuprobieren.
    Dem Fehler nachgehen bedeutet: Das in der Fehlermeldung bemängelte Command untersuchen.
    Also wenn der Fehler auftritt, im Lokal-Fenster es aufsuchen, expandieren, wie gesagt: gucken, ob und was im .CommandText steht.
    Falls dir das (Benutzung des LokalFenster) böhmische Dörfer sind (der häufigste Grund, warum meine Posts ignoriert werden), kannst du hier lernen, was damit gemeint ist:
    VisualStudio richtig nutzen (Google ist nicht deine Mami)
    Da wird auch noch einiges weitere Must-Knowhow angerissen.
    Ja klar habe ich da rein geguckt, es war eher so gemeint, dass es nicht am CommandText liegt. Ich dachte ich könnte das dadurch auch ausdrücken, dass sich der Commandtext zwischen den Forms nicht ändert.

    Davon abgesehen sagt mir die Fehlermeldung ja auch garnichts zum .CommandText, sondern zur .Connection

    Dort konnte ich jetzt auch @mrMos Gedanken bestätigen .Connection ist Nothing und das kommt wahrscheinlich von der Form dessen Problem ich an anderer Stelle auch schon auf der Spur bin, siehe Link oben (ist ein Post von @RodFromGermany)

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

    Ok, ich denke ich habe den Fehler, aber weiß nicht wie ich es richtig hinkriege:

    In Form1 verwende ich schon eine Verbindung, das Ganze ist als Variable gespeichert, daher dachte ich nehme ich die Variable einfach direkt mit auf Form2 damit ich das nicht doppelt machen muss.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Friend PostgreConnString As String
    3. Friend npgConnection As NpgsqlConnection
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. ...
    6. npgConnection = New NpgsqlConnection()
    7. npgConnection.ConnectionString = PostgreConnString
    8. ...
    9. End Sub
    10. End Class
    11. Public Class Form2
    12. Private f as New Form1
    13. Private Sub btnrefresh_Click(sender As Object, e As EventArgs) Handles btnrefresh.Click
    14. ...
    15. Using cmd = New NpgsqlCommand()
    16. cmd.Connection = f.npgConnection '<--- das bleibt Nothing, also hab ich offensichtlich keinen richtige Aufruf der Variable aus Form1
    17. cmd.CommandText = cmdTextstring
    18. ...
    19. End Class

    ja stimmt - der Fehler redet ja von nichtvorhandener Connection - garnet vom CommandText.

    Ansonsten erzeugst du in #14 ein neues Form1 - was du aber niemals anzeigst.
    Die Connection erzeugst im Form1 im Form1_Load - Ereignis.
    Welches nur gefeuert wird, wenn das Form angezeigt wird.

    Lösung: Die Connection hat in Form1 nix verloren, weil sie ja auch in Form2 benötigt wird, und womöglich sonstwo auch noch.
    Erschaffe am besten eine Extra-Klasse für Datenbank-Zugriffe, nenne sie etwa DAL (Data Access Layer).
    Darin erstelle eine Public Shared Connection - die ist dann von überall zugreifbar.

    VB.NET-Quellcode

    1. public class DAL
    2. public shared readonly npgConnection As new NpgsqlConnection("blabla")
    3. end class
    so ungefähr

    Ist zunächst bischen doof, eine Extra-Klasse zu schreiben, mit nur einer Zeile Code.
    Aber möglicherweise kommen noch weitere Bedarfe hinzu, die ebenfalls form-übergreifend verfügbar sein müssen.
    Googel und versteh das Schlüsselwort Shared.
    Vielen Dank!
    Ich habe das so ähnlich betrachtet wie Speicherpfade.
    Specifies that one or more declared programming elements are associated with a class or structure at large, and not with a specific instance of the class or structure

    Ohne Shared kann ich also gar nichts von anderen Klassen verwenden?

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

    Haudruferzappeltnoch schrieb:

    Ohne Shared kann ich also gar nichts von anderen Klassen verwenden?
    Natürlich doch -. machst du doch die ganze Zeit.
    Der Normalfall ist ohne Shared - alles wie immer: Objekt eines Datentyps instanzieren, die Objekt-Methoden benutzen.
    SonderFall mit Shared Methoden: Objekt nicht instanzieren , Objekt-Methoden nicht benutzen.
    Aber die Shared Methoden - die kannste benutzen.
    Die gegooglete Definition ist extrem schwer verständlich - findet sich nix - kein Tut, keine Beispiele, wo mal drauf eingegangen wird?
    Sonst ladt dir das Löffelmann-Buch runter, oder den Kühnel-Leibhard.
    Da sind bestimmt Kapitel drin, die vernünftig drauf eingehen.

    NOch meine Kurz-Erklärung: Shared ist englisch und heisst "geteilt", oder "frei zugänglich".
    Normale Methoden "gehören" dem Objekt, daher muss man erstmal eines instanzieren.
    Shared Methoden sind quasi Allgemeingut - sie gehören quasi dem Datentyp insgesamt - nicht einem einzelnen Objekt dieses Datentyps.
    Ja unter der Definition ist auch noch mehr zu finden. Ich wollte auch nochmal klarstellen was ohne Shared denn möglich ist.

    Also die Instanzierung hab ich ja von Form1 als f, ich dachte Form1 muss nur das Load-Event hinter sich haben und danach kann ich die Connection in anderen Bereichen nutzen. Das Form1 bleibt auch angezeigt, aber im Hintergrund, ich schätze das zählt dann schon nicht mehr als angezeigt? Oder ist f ein anderes Form1 das auch noch angezeigt werden muss um sein eigenes Load-Event zu triggern?

    Haudruferzappeltnoch schrieb:

    Oder ist f ein anderes Form1 das auch noch angezeigt werden muss um sein eigenes Load-Event zu triggern?
    Ja, was denn sonst? (englisch: "What else?")

    New ist auch englisch, und bedeutet "neu".

    f ist ein neues Form1 - steht da ja, guck einfach hin:

    VB.NET-Quellcode

    1. Private f as New Form1
    Und das ist eben Mist, weil das willste ja garnet.
    Du wollteste da ja nur die Connection rauspicken, und - Mist! - dazu müssteste das Form1 erst anzeigen, was ja ein irrer Overhead wäre.
    Lösung wie gesagt: die Connection hat im Form1 garnix verloren - sie gehört ins DAL.

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

    Du solltest dich dringend (!) mit dem Thema Objektorientierung beschäftigten. Das funktioniert am Ende alles identisch. Ganz wichtiges Thema, ohne das verstanden zu haben wirst du nie richtig programmieren können.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen