DataSet DataAdapter mit mehreren Tabellen füllen

  • VB.NET

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

    DataSet DataAdapter mit mehreren Tabellen füllen

    Hallo zusammen,

    Das Ziel:
    - ein DataSet
    - ein DataAdapter
    - zwei Tabellen

    ich versuche einen DataSet bzw. DataAdapter mit mehreren Tabellen zu füllen.
    Geht leider in die Hose.
    Ich habe mir aus Gallileo und Microsoft Press Büchern mal so einiges zusammen gebastelt.

    Die Verbindung usw.... funktioniert soweit. Das Auslesen scheinbar auch.
    Nur bei der Zuweisung an die DataGridView's, könnte aber auch woanders dran liegen, da stimmt etwas nicht.

    Laut mehreren Beschreibungen ist es Sinnvoll mit einem DataSet und einem DataAdapter zu arbeiten.
    Was eigentlich auch logisch ist. Wenn ich später Update, brauche ich immer nur ein Update zu machen.
    Ich glaube ich habe da soweit vertanden.

    Das Problem
    die Routine läuft durch und zeigt mir nun nicht zwei Tabellen sonder nur eine.
    Gelesen werden sollen die Tabelle "Adressen" und die Tabelle "Anreden".
    Gezeigt werden aber in beiden DataGridView nur die Tabelle "Adressen"

    Wat is denn da falsch ?
    - das auslesen ?
    - die zuordnung in DataTabel oder vlt. DataView ?

    Kann da mal jemand drüber schauen.

    lieben dank
    Bernd

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. ' Verbindungszeichenfolge, mit Angaben zu welcher Datenbank es gehen soll
    3. conn.ConnectionString = "server=" & _IP & ";user id=" & _UserName & ";password=" & _Passwort & ";database=" & _DatenBanken & ";"
    4. ' Dem DataAdapter mitteilen, welches SQL Kommando er ausführen soll und welche Verbindung er dazu verwenden soll
    5. da_Verein = New MySqlDataAdapter("", conn)
    6. da_Verein.SelectCommand.CommandText = "SELECT * FROM Adressen; SELECT * FROM Anreden"
    7. da_Verein.SelectCommand.CommandType = CommandType.Text
    8. ' DataSet
    9. Dim DS As New DataSet
    10. da_Verein.Fill(DS)
    11. ' *** DataSet und DataTable-Instanz bilden
    12. ' DataTable-Instanz bilden
    13. dt_Adressen = New DataTable("Adressen")
    14. dt_Anreden = New DataTable("Anreden")
    15. ' *** Primärschlüssel-Informationen beim Fill mit übernehmen
    16. da_Verein.MissingSchemaAction = MissingSchemaAction.AddWithKey
    17. ' DataTablen füllen
    18. da_Verein.Fill(dt_Adressen)
    19. da_Verein.Fill(dt_Anreden)
    20. ' *** DataView-Instanz für DataTable bilden
    21. dv_Adressen = New DataView(dt_Adressen)
    22. dv_Adressen.Sort = "Vorname ASC" ' ASC, DESC
    23. dv_Anreden = New DataView(dt_Anreden)
    24. 'dv_Anreden.Sort = "Anrede ASC"
    25. ' *** Daten an DataGridView
    26. With DataGridView1
    27. .RowsDefaultCellStyle.BackColor = Color.Yellow ' Standard-Hintergrundfarbe
    28. .AlternatingRowsDefaultCellStyle.BackColor = Color.Turquoise ' Altern. Hintergrund
    29. .DataSource = dv_Adressen ' DataView als Datenquelle
    30. .Columns(0).ReadOnly = True
    31. .Show()
    32. End With
    33. ' *** Daten an DataGridView
    34. With DataGridView2
    35. .RowsDefaultCellStyle.BackColor = Color.Yellow ' Standard-Hintergrundfarbe
    36. .AlternatingRowsDefaultCellStyle.BackColor = Color.Turquoise ' Altern. Hintergrund
    37. .DataSource = dv_Anreden ' DataView als Datenquelle
    38. .Columns(0).ReadOnly = True
    39. .Show()
    40. End With
    41. End Sub

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

    Probier das mal so :

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. ' Verbindungszeichenfolge, mit Angaben zu welcher Datenbank es gehen soll
    3. conn.ConnectionString = "server=" & _IP & ";user id=" & _UserName & ";password=" & _Passwort & ";database=" & _DatenBanken & ";"
    4. ' Dem DataAdapter mitteilen, welches SQL Kommando er ausführen soll und welche Verbindung er dazu verwenden soll
    5. da_Adressen = New MySqlDataAdapter("SELECT * FROM Adressen", conn)
    6. da_Anreden = New MySqlDataAdapter("SELECT * FROM Anreden", conn)
    7. ' DataSet
    8. Dim DS As New DataSet
    9. 'Der jeweilige SELECT Befehl wird hier direkt in eine DataTable ins DataSet geladen. Der DataTable Name steht in den Gänsefüßchen
    10. da_Adressen.Fill(DS,"Adressen")
    11. da_Anreden.Fill(DS,"Anreden")
    12. ' *** Primärschlüssel-Informationen beim Fill mit übernehmen
    13. da_Adressen.MissingSchemaAction = MissingSchemaAction.AddWithKey
    14. da_Anreden.MissingSchemaAction = MissingSchemaAction.AddWithKey
    15. ' *** DataView-Instanz für DataTable bilden
    16. dv_Adressen = New DataView(ds.tables("Adressen"))
    17. dv_Adressen.Sort = "Vorname ASC" ' ASC, DESC
    18. dv_Anreden = New DataView(ds.tables("Anreden"))
    19. 'dv_Anreden.Sort = "Anrede ASC"
    20. ' *** Daten an DataGridView
    21. With DataGridView1
    22. .RowsDefaultCellStyle.BackColor = Color.Yellow ' Standard-Hintergrundfarbe
    23. .AlternatingRowsDefaultCellStyle.BackColor = Color.Turquoise' Altern. Hintergrund
    24. .DataSource = dv_Adressen ' DataView als Datenquelle
    25. .Columns(0).ReadOnly = True
    26. .Show()
    27. End With
    28. ' *** Daten an DataGridView
    29. With DataGridView2
    30. .RowsDefaultCellStyle.BackColor = Color.Yellow ' Standard-Hintergrundfarbe
    31. .AlternatingRowsDefaultCellStyle.BackColor = Color.Turquoise' Altern. Hintergrund
    32. .DataSource = dv_Anreden ' DataView als Datenquelle
    33. .Columns(0).ReadOnly = True
    34. .Show()
    35. End With
    36. End Sub


    Das mit zwei SELECT Befehlen in einem DataAdapter kenne ich so nicht, um verschiedene DataTables zu füllen.

    EDIT : Wenn du lieber 'greifbare' DataTables haben möchtest, kann du diese so erstellen :

    VB.NET-Quellcode

    1. Dim DT_Adressen As DataTable = DS.Tables.Add("Adressen")
    2. 'gefüllt wird dann die DataTable mit
    3. DA_Adressen.Fill(DT_Adressen)
    4. 'darauf zugreifen kannst du dann über
    5. dv_Adressen = New DataView(ds.tables("Adressen"))
    6. 'oder
    7. dv_Adressen = New DataView(DT_Adressen)

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

    Bernd schrieb:

    da_Verein.SelectCommand.CommandText = "SELECT * FROM Adressen; SELECT * FROM Anreden"

    Das stand in deine Bücher, dass das geht?
    Ein Command mit 2 SqlStatements?

    (Also ich bin ühaupt nicht der Sql-Crack - und sowas habich bisher einfach noch nie probiert)
    @HerrFrie
    ein ähnliche Lösung hatte ich mir bereits gebastelt und getestet.
    Dann habe ich aber mit 2 DataAdapter zu tun. Also auch 2 mal Update.
    Wenn ich das alles richtig verstanden habe.

    Wenn es später einiges mehr an Tabellen gibt, würde es bedeuten ich arbeite mit mehreren DataAdaptern.
    Somit darf ich keinen vergessen. Also bei Update, vor Programmende.

    Nu gut dann werde ich mal weiter lesen.

    @ErfinderDesRades
    vieleicht habe ich das auch nur falsch vertanden !? Möglich bei soviel neuem Informationsfluß in den letzten Tagen.
    Galileo
    Kapitel 25.4

    Microsoft Press
    Datenbank-Programmierung mit Visual Basic 2008
    Kapitel 5 -> Das DataSet - Objekt im Detail
    Seite 280
    Erste Eintrag in Tabelle
    DataSet- Representiert eine "Mini-DatenBank" (ohne Verbindung zur Datenquelle) autark i m Arbeitsspeicher existiert und sowohl Daten (das können mehrere Tabellen sein) als auch Strukturinformationen (Metadaten) und Beziehungen (Relationen) zwischen den Tabellen.

    wie gesagt, vielleicht vertehe ich was falsch.

    Bernd
    habichjetzt ausprobiert. Also Access kanns nicht, SqlServer kanns. Mit einem CommandString 2 Tabellen füllen.
    Was nützt das aber?
    Willst du mit untypiesierten Datasets rumwursteln?
    Dann lies man weiter Galileio-Book. Die Erklärung deines problems steht übrigens kurz darunter, wo du den Snippet her hast: es werden durchaus 2 Tabellen eingelesen, nur werden die im Dataset unter einem anneren Namen gehalten, als du vlt. dachtest.
    Und dann kommt noch jede Menge anneres Zeugs, nämlich TableMappings, ColumnMappings, DataRelations, und wasweißichnich alles
    Muß ja alles eingerichtet sein, und bei untypisierten halt händisch gecodet.
    Dann noch die Update-Delete-Insert-Commands händisch einrichten, inklusive der richtigen Konfiguration der DBParameter. Spätestens hier wird das mit den 2 Commands in einem DataAdapter nicht mehr hinhauen.
    Dassis glaub das Buch, zu dem ich mich gelegentlich auch äußere, wa? Nämlich also: Das VB-Openbook von Galileo ist Mist
    Nee - ups - sorry: Es ist ein anneres Buch. Habich nur jetzt kurz reingeguckt, aber kann gut sein, dasses auch Mist ist.
    Ich glaub fast. Naja, wenigstens proggen sie Strict On.
    Aber vor TryCatch warnen sie auch nicht, sondern setzen sich ausgiebig damit auseinander, unter dem Thema "Debugging". Dabei ist TryCatch das exakte Gegenteil von Debugging - die Fehlermeldungen werden ja weggecatcht.
    Aber zur DB:
    Beschäftigen sich 5 Kapitel mit untypisierten DB-Zugriffen, und nur eines mittm typisierten (welches die ganzen vorherigen Kapitel obsolet macht, denn die Generatoren coden das Zeug korrekt, sodass die Beschäftigung mit der untypisierten Technologie vlt. ein "Nice to Know" ist, aber nicht wirklich erforderlich.)

    Naja - im Faszit (Kap 28.7) nennter die Vorteile ja selbst beim Namen.
    Nur, allein Vorteil 1 und Vorteil 2 (Typisierung und Databinding) sind für mich so gravierend, dass untypisierte DB-Zugriffe IMO schlicht NoGo sind.

    Habich dieses Buch Lesen dir noch nicht empfohlen?

    ErfinderDesRades schrieb:

    Habich dieses Buch Lesen dir noch nicht empfohlen?

    Hast du glaube ich nicht empfohlen, was aber weiter nicht schlimm ist. Weil ich das Buch im Schrank stehen habe und ab und zu auch drin lese.
    Dort steht ein kurz gehaltenes Kapitel über DataSet usw.. jedoch beziehen die sich wieder auf SQL und nicht "MySql".
    Egal

    Beim weiter schnökern habe ich schon mal einen weiteren Lösungsansatz gefunden.
    Es gibt eine Programm Namens "MySql Connector".
    Und siehe da, es läuft sogar.
    Nun bekomme ich im Server Explorer sogar eine Verbindung zu Stande.

    Jetzt kann ich auf einer anderen Basis mal Testen.

    Was ich auch schon getan habe.
    Nun kommen neue für mich unbekannte Probleme. Die ich nun in einem neuen Post bringe.

    lieben dank
    bernd
    Hi Bernd,
    du machst dich fertig mit dem zeug.
    Einem Dataset ist egal ob die Daten von MySQL, Oracle ode MsSQl kommen. Ist ein Behälter auf deiner maschine.

    Wenn du den MySQlDatadapter deklariert hast, kannst du ihn ja weiterverwenden. Das übersiehst du eventl weil du nur diese Form kennst
    da_Adressen = New MySqlDataAdapter("SELECT * FROM Adressen", conn)

    sieht dann so aus:

    Quellcode

    1. Dim myCmd as New MySQLommand
    2. myCmd.CommandText = strSQL
    3. myCmd.Connection = myCnn 'connectionobject
    4. da_Adressen.SelectCommand = myCmd
    5. da_Adressen.fill(DS,"Anreden")

    Edwardschn schrieb:

    Einem Dataset ist egal ob die Daten von MySQL, Oracle ode MsSQl kommen.

    Das würde aber doch bedeuten
    - die Adressen könnten von Xxxxxx kommen (http....MySql...
    - die Anreden könnten von Yyyyyyy kommen (http....Sql...
    - die Titel der person von Zzzzzzz kommen (C:\....... Acess

    He danke,
    das macht mich wieder etwas schlauer.
    Ich glaube bis ich die erste vernünftige Anwendung anfange zu scheiben, brauche ich noch einige Zeit und einiges an Lesen und Fragen stellen.

    danke