MySQL-DB auslesen: Kein Recordset statt DataReader?

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Jendis.

    MySQL-DB auslesen: Kein Recordset statt DataReader?

    Hallo,

    ich schon wieder. Sorry, dass ich schon wieder ein neues Thema aufmache, aber das alte hatte ich schon als "erledigt" geflaggt.
    Inzwischen funktioniert auch die Verbindung zur Datenbank problemlos, aber es ist eine neue Tücke aufgetaucht.

    Etwas Code:

    VB.NET-Quellcode

    1. Imports Scripting
    2. Imports MySql.Data.MySqlClient
    3. Dim con As New MySqlConnection
    4. Dim cmd As New MySqlCommand
    5. Dim rd As MySqlDataReader
    6. con.ConnectionString = "Server=localhost;Database=test; User=myUID;Password=myPW;"
    7. cmd.Connection = con
    8. con.Open()
    9. cmd.CommandText = "SELECT vonipnumber, countrycode FROM tab1"
    10. rd = cmd.ExecuteReader
    11. Do While rd.Read()
    12. cmd.CommandText = "UPDATE tab2 SET countrycode='" & rd("countrycode") & "' WHERE vonipnumber='" & rd("vonipnumber") & "'"
    13. Debug.Print(cmd.CommandText)
    14. cmd.ExecuteNonQuery()
    15. Loop
    16. rd.Close()
    17. con.Close()


    Hier will ich 2 Spalten aus einer Datenbanktabelle auszulesen und eine andere Tabelle in Abhängigkeit dieser Daten upzudaten. Das funktioniert natürlich so nicht, weil ich den zweiten SQL-Befehl nicht ausführen kann, solange der DataReader offen ist. Ich finde aber keine Option "recordset", mit der das problemlos klappen sollte und die ich statt des DataReaders verwenden könnte.
    Was tun?

    EDIT: Hab mich erstmal damit beholfen, die Daten in eine Listbox auszulesen und dann auf die Listbox zuzugreifen. Tut zwar seinen Zweck, ist aber reichlich plump...

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

    ErfinderDesRades schrieb:


    sieht mir nach einem Fehler im Datenmodell aus - Verstoß gegen eine der NormalFormen.

    tab2 sollte glaub keinen countrycode enthalten, denn sie verweist ja bereits auf tab1, wo der countrycode drin ist.


    LOL ? xD

    Hi uHu

    Das was du suchst nennt sich SqlDataAdapter:

    Du kannst diesem einen Select, Insert,Update und Delete Command geben, oder sogar nur einen SelectCommand und den Rest dann per SqlCommandBuilder erstellen lassen.
    Mit dem Adapter kannst du DataSets/tables befüllen. Offline dran rum manipulieren und dann per BatchUpdate wieder in die DB schreiben.

    Lg Mono
    Das ist meine Signatur und sie wird wunderbar sein!

    Mono schrieb:

    LOL ? xD

    Ist das eine Zustimmung oder ein "Gegenargument" auf meine Einlassung zum Datenmodell?

    Wenn ich uHus Anliegen nämlich richtig verstehe, hat sich in tab1 ein countryCode geändert, und nun musser in tab2 diesen an verschiedenen Stellen nachbessern.

    Das relationale Datenmodell ist aber extra dafür erfunden worden, um solche Nachbesserungen überflüssig zu machen (wenn richtig modelliert wird).

    uHu sollte also seinen Workaround ad acta legen, und stattdessen seine Datenmodellierung korrigieren.

    ErfinderDesRades schrieb:

    Wenn ich uHus Anliegen nämlich richtig verstehe, hat sich in tab1 ein countryCode geändert, und nun musser in tab2 diesen an verschiedenen Stellen nachbessern.
    Da hast du mich wohl etwas missverstanden. Ich muss meine Tabellen überhaupt erstmal füllen, und dazu lese ich diverse .csv-Dateien aus, über die die relevanten Informationen weit verstreut sind. Ich teste ohnehin gerade nur auf einer lokalen Datenbank, für die weitaus komplexere Produktivdatenbank müssen die SQL-Befehle nochmal angepasst werden.

    @mono
    Danke, werde den DataAdapter gleich mal ausprobieren.
    Ich muss hier ErfinderDesRades zustimmen, wenn man davon ausgehen kann, dass in beiden Tabellen die Spalte 'vonipnumber' als Primärschlüssel eingestellt ist, könnte man mit einem Join die das ganze geschickter lösen. Hier wäre wie ErfinderDesRades schon korrekt gesagt hat eine Ummodellierung der Datenbank sinnvoll.

    Sollte es kein PrimaryKey sein, so wäre es ggf. Sinnvoll(sofern beide die gleichen Daten enthalten) jeweils einen daraus zu machen.

    lg.

    LucaWelker
    lg.

    LucaWelker

    uHu schrieb:

    Ich muss meine Tabellen überhaupt erstmal füllen, und dazu lese ich diverse .csv-Dateien aus, über die die relevanten Informationen weit verstreut sind. Ich teste ohnehin gerade nur auf einer lokalen Datenbank, für die weitaus komplexere Produktivdatenbank müssen die SQL-Befehle nochmal angepasst werden.
    Dann wunderts mich, dass du einen Update an die DB sendest, wenn du sie doch erst befüllst. Da hätte ich dann ein Insert erwartet.


    Nochn Tipp: Solange deine Datenbank noch nicht fertig ist, empfehle ich, ohne DB zu arbeiten, also mit Dataset Only.
    Ist flexibler.
    Hmm, das hätte auch von mir kommen können, dass kommt davon wenn man nicht alle Beiträge liest:D omg ich trottel :) wenn du die DB erstmal füllen musst ist der UpdateBefehl natürlich total Falsch. Wie der name scon sagt ist der Updatebefehl dazu da um die Daten zu Aktualisieren nicht um Sie einzufügen.

    Ansonsten kann ich ErfinderDesRades nur zustimmen, ich würde in diesem Fall auch nicht mit einer DB Arbeiten.

    lg.
    lg.

    LucaWelker
    Neenee, da hab ich mich blöd ausgedrückt. Befüllt mit INSERT hab ich schon weiter oben (im hier nicht aufgeführten Code) gehabt, wobei der countrycode default NULL gesetzt wurde. Deswegen klappt's auch mit UPDATE.

    Danke nochmal für die Hinweise, ich werd's im Hinterkopf behalten.
    Für's erste bin ich sehr glücklich mit dem DataAdapter :)
    Hi, die Lössung ist ganz einfach. Mache eine zweite Connection:
    Imports Scripting
    Imports MySql.Data.MySqlClient

    Dim con As New MySqlConnection
    Dim cmd As New MySqlCommand
    Dim rd As MySqlDataReader
    Dim con2 As New MySqlConnection
    Dim cmd2 As New MySqlCommand


    con.ConnectionString = "Server=localhost;Database=test; User=myUID;Password=myPW;"
    con2.ConnectionString = con.ConnectionString
    cmd.Connection = con
    cmd2.Connection = con2
    con2.Open()
    con.Open()
    cmd.CommandText = "SELECT vonipnumber, countrycode FROM tab1"
    rd = cmd.ExecuteReader
    Do While rd.Read()
    cmd2.CommandText = "UPDATE tab2 SET countrycode='" & rd("countrycode") & "' WHERE vonipnumber='" & rd("vonipnumber") & "'"
    Debug.Print(cmd2.CommandText)
    cmd2.ExecuteNonQuery()

    Loop
    rd.Close()
    con.Close()
    con2.Close()


    So klapt es.

    Jendis