mySQL-DB auslesen

  • VB.NET

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von gammlo.

    mySQL-DB auslesen

    Hallo,
    erstmal ein Lob an das VB-Paradise-Forum. Durch die Suchfunktion konnte mir schon bei vielen Problemen geholfen werden.

    Ich möchte nun folgendes realisieren:
    Ein kleines LAN Tool, welches 2 Tabellen aus einer Datenbank ausliest und anzeigt:
    a) Newsticker. In der Datenbank sind folgende Felder definiert:
    Uhrzeit, Text

    b) Spielplan. In der Datenbank sind folgende Felder definiert:
    Uhrzeit, Game, Mode, ServerIP, Text

    Der mySQL-Server steht bei mir im lokalen Netzwerk und wird auch problemlos von anderen Rechnern erreicht. Habe auf die schnelle mal ein PHP-Script programmiert, die Daten können damit korrekt von einem anderen PC bezogen werden. Grundlegende bis gute mySQL und PHP-Kenntnisse sind also vorhanden.

    Nun stecke ich aber bei meinem kleinen VB 2008 Programm fest. Ich habe bereits folgende Threads durchgelesen:
    [VB.NET] MySQL-Datenbanken mit VB.net/VB2005/VB2008
    [VB 2008] MySQL Abfrage in Textbox
    [VB.NET] Verbindung zu einer MySQL-Datenbank via PHP-Skript

    Bei dem zweiten Link fehlt mir aber irgendwie eine Schleife, damit die Datensätze nacheinander abgefragt werden. Wie sollte ich nun genau weitermachen?

    Bisher habe ich den Connector (mysql-connector-net-5.2.7) installiert. In meinem Projekt habe ich über Projekt -> Verweis hinzufügen -> MySQL.Data auch die DLL hinzugefügt.

    Den Code, den ich bisher angepasst habe funktioniert soweit.

    Quellcode

    1. Private Sub cmdSpielplanabrufen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSpielplanabrufen.Click
    2. Dim conn As New MySql.Data.MySqlClient.MySqlConnection
    3. Dim myConnectionString As String
    4. myConnectionString = "server=XXX.XXX.XXX.XXX;" _
    5. & "uid=XXX;" _
    6. & "pwd=XXX;" _
    7. & "database=XXX;"
    8. Try
    9. conn.ConnectionString = myConnectionString
    10. conn.Open()
    11. Catch ex As MySql.Data.MySqlClient.MySqlException
    12. MessageBox.Show(ex.Message)
    13. End Try
    14. End Sub


    Aber wie gehe ich jetzt weiter vor? Das ist ja eigentlich ein 0-8-15 Projekt - über die Suchfunktion finde ich aber nichts passendes. Bin in VB ein absoluter Newbie.

    Hoffe auf Hilfe.
    Vielen Dank

    gammlo

    EDIT: Habe dieses hier natürlich auch schon gefunden:
    openbook.galileocomputing.de/e…98b9747d6b09b06a128efa30f

    Was ich mich aber noch frage.... braucht JEDER Client denn nochmal extra diesen mySQL-Connector? Ich würde das gerne so haben, dass jeder Client nur die .exe-Datei lädt, aber trotzdem sämtliche Daten aus der mySQL-DB auslesen kann.

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

    Openbook Galileo ist mist!
    Les dieses Buch dazu.

    Und bitte schreibt keine Zugangsdaten in eure SourceCodes!
    Benutzt ein PHP-Script zur Verbindung...

    Und nein du brauchst du auf den Rechner den Connector, wo deine Datenbank installiert ist :)
    @n1nja:
    Wow - drei Aussagen in einem Post. Eine OffTopic, die nächste sinnlos, weil der Eingangspost nicht richtig gelesen wurde und die dritte einfach nur falsch. Da hat die Tageszeit wohl ihren Beitrag geleistet.

    @gammlo:
    Du hast zwei Möglichkeiten:
    - Benutze dein PHP-Script, um die Datenbank auszulesen, und hole das Ergebnis in VB mit einem HttpWebRequest vom Script ab.
    - Benutze den MySQL-Connector in VB, um die Datenbank direkt zu befragen. Da dein geposteter Code in diese Richtung geht, soll es wohl diese Variante sein. Du hast schon eine Verbindung zur Datenbank - nun musst du nur noch ein Kommando definieren und das Ergebnis abholen. Das könnte so aussehen:

    VB.NET-Quellcode

    1. 'Verbindung vorher öffnen.
    2. conn.Open()
    3. Dim cmd As New MySqlCommand("Select * From bla", conn)
    4. Dim reader As MySqlDataReader = cmd.ExecuteReader()
    5. While reader.Read()
    6. 'Daten lesen
    7. End While
    8. reader.Close()
    9. conn.Close()

    Hier ist ein vollständiges Beispiel: dev.mysql.com/doc/refman/5.0/e…ples-mysqldatareader.html

    Du brauchst den MySQL-Connector für .NET auf jedem Rechner, der das VB-Programm ausführen soll (woher sollen sonst die Typen kommen, die das .NET-Framework ohne den Verweis nicht kennt?).
    Gruß
    hal2000
    Hi,
    danke erstmal für eure Antworten.

    Das mit dem MySQL-Connector auf JEDEM PC würde ich ungern machen, das LAN-Tool soll eine stinknormale .exe Datei sein, einfach ausführen und fertig. Halt ohne Installer oder irgendwelche zusätzlichen Programme (Connector).
    Die PHP-Variante braucht das ja vermutlich keinen Connector, ich denke dann nehme ich lieber diese Variante.

    Kennt jemand von euch da einen guten Leitfaden, den ich auf mein Projekt anpassen kann?

    Liebe Grüße :o)
    Halli hallo,
    danke nochmals für deine fixe Antwort.

    Durch weitere Recherchen im Internet, habe ich ein tolles Video gefunden:
    youtube.com/watch?v=BsYFm-WtIUk

    Habe nun etwas rumprobiert, und bin bei folgender funktionsfähiger Lösung angelangt:

    Quellcode

    1. Private Sub cmdNewsticker_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdNewsticker.Click
    2. Dim con As New MySqlConnection
    3. Dim cmd As New MySqlCommand
    4. Dim reader As MySqlDataReader
    5. Dim val_newsticker As String
    6. val_newsticker = ""
    7. con.ConnectionString = "server=XXX.XXX.XXX.XXX;" _
    8. & "uid=XXX;" _
    9. & "pwd=XXX;" _
    10. & "database=XXX;"
    11. cmd.Connection = con
    12. cmd.CommandText = "SELECT * FROM newsticker ORDER BY id DESC"
    13. Try
    14. con.Open()
    15. reader = cmd.ExecuteReader()
    16. Do While reader.Read()
    17. val_newsticker &= "+++ " & reader("date") & " +++" & vbCrLf & reader("newstext")
    18. If reader("id") > 1 Then
    19. val_newsticker &= vbCrLf & vbCrLf
    20. End If
    21. Loop
    22. reader.Close()
    23. con.Close()
    24. txtBoxNewsticker.Text = val_newsticker
    25. Catch ex As Exception
    26. MsgBox(ex.Message)
    27. End Try
    28. End Sub


    Wie würdet ihr das Ergebnis beurteilen?

    Danke!

    EDIT: Ich sehe gerade, das Datum wird ja automatisch formatiert 8|

    In der Datenbank steht folgendes:
    2013-02-10 01:02:05

    Ausgegeben im VB.Net Programm wird:
    10.02.2013 00:52:32

    Bekomme ich die Sekunden vielleicht noch weg?

    EDIT2:
    Nach dem Erstellen des Projekts, habe ich unter bin -> Release nur 3 Dateien im Ordner.

    <Projektname>.exe
    <Projektname>.pdb
    <Projektname>.xml

    Die dll fehlt da ja komplett. Was muss ich denn da tun?

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

    Wie würdet ihr das Ergebnis beurteilen?
    Sollte funktionieren, aber einige Dinge kann man noch bemängeln:
    - MsgBox ist eine alte VB6-Funktion --> MessageBox.Show(). Darüber gibts hier einen ganzen Thread.
    - Der Try-Block fängt die allgemeinste aller Exceptions - die sollten spezieller sein. Auch darüber gibts einen Thread: "Avoid TryCatch"
    - "If reader("id") > 1" benutzt späte Bindung --> stell "Option Strict" auf "On" (in den Projekteigenschaften).

    Bekomme ich die Sekunden vielleicht noch weg?

    VB.NET-Quellcode

    1. reader("date").ToString("g")
    2. 'oder (falls der Rückgabetyp von reader("date") nicht "Date" ist):
    3. CType(reader("date"), Date).ToString("g")


    Die dll fehlt da ja komplett. Was muss ich denn da tun?
    Da du den Connector auf deinem Rechner installiert hast, sind die DLLs im sogenannten Global Assembly Cache, wo du nicht direkt rankommst. Lade dir die DLLs also separat runter und kopiere sie in den Release-Ordner. Auf der MySQL-Seite gibts nur den Installer und den Sourcecode - an die vorkompilierte Dateien kommst du nur, wenn du den Downloadlink änderst ("src" in "noinstall"). Das habe ich hier schonmal gemacht:

    Quellcode

    1. www.mysql.de/get/Downloads/Connector-Net/mysql-connector-net-6.6.5-noinstall.zip/from/http://cdn.mysql.com/


    Edit: Link editiert.
    Gruß
    hal2000

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „hal2000“ ()

    Hi,
    danke für deine Antwort. Der Link funktioniert nicht, ich glaube da hast du einen Fehler gemacht - so gehts:

    mysql.de/get/Downloads/Connect…rom/http://cdn.mysql.com/

    Leider verstehe ich noch nicht genau, was ich mit der .dll machen soll. Es reicht doch nicht, dass ich die mysql.data.dll aus dem v2 Verzeichnis einfach in den Release-Ordner kopiere, und den Release-Ordner dann praktisch an meine LAN-Clients versende. Da fehlt doch zumindest die Pfadangabe oder wie sieht das aus?

    Und nochetwas:
    Leider springt bei dem Programm der Antivirenscanner (Avast) an. Kann man dagegen etwas tun?

    gammlo schrieb:

    Leider verstehe ich noch nicht genau, was ich mit der .dll machen soll. Es reicht doch nicht, dass ich die mysql.data.dll aus dem v2 Verzeichnis einfach in den Release-Ordner kopiere, und den Release-Ordner dann praktisch an meine LAN-Clients versende. Da fehlt doch zumindest die Pfadangabe oder wie sieht das aus?
    Doch, genau das reicht vollkommen aus. Vorausgesetzt Deine Clients starten die Applikation aus dem Verzeichnis. Sprich .exe und .dll müssen im gleichen Ordner liegen und die Clients starten die .exe aus dem Ordner (vermutlich via Verknüpfung. Dann muss die Eigenschaft "ausführen in" eben den Ordner als Inhalt haben).

    gammlo schrieb:

    Moin nochmal,
    habe das Ganze mal von 2 Freunden (die noch nicht den mysql-Connector installiert haben so wie ich) testen lassen.

    gammlo schrieb:

    Ergebnis:
    Bei beiden funktioniert es nicht. Es kommt folgende Meldung:


    Kann ich leider nicht nachvollziehen. Stelle bitte folgendes sicher:

    appname.exe und mysql.data.dll befinden sich im selben Ordner (dabei ist es egal ob der Ordner auf den Clients lokal gespeichert ist, oder als Share im Netzwerk verfügbar= habe ich so gemacht und es funzt)

    appname.exe wird aus diesem Ordner gestartet

    Zielframework = Dein Framework. Will heißen, wenn die mysql.data.dll mit dem Framework 3.5 (bspw) erstellt wurde muss Deine Applikation auch dieses Framework als Kompilierziel aufweisen (was es automatisch ist, außer es wird nachträglich geändert) und darüberhinaus muss das gleiche Framework auch bei den Clients installiert sein (ich bilde mir ein es kommt ein anderer Fehler wenn das Zielframework abweicht, aber wir gehen mal auf Nummer sicher).



    Was genau makelt denn Dein AV an?
    Hi,
    danke für die Antwort.

    Den letzten Absatz von deinem Post habe ich leider nicht verstanden. Kannst du mir das etwas genauer mit dem Zielframework erklären? Muss zugeben, dass ich da voll aufem Schlauch stehe. Bin noch nen VB Anfänger. Genaue Antivirenmeldung bekommst Du heute Abend.

    danke!

    gammlo
    Ja, ich gebs zu der ist nicht so richtig schön geschrieben...

    Unter Projekteigenschaften -> Kompilieren -> Erweiterte Kompilierungsoptionen gibt es den Punkt "Zielframework". Hier kannst Du auswählen in welches Framework Du kompilieren willst. Mindestens dieses müssen dann Deine Clients auch installiert haben.

    Wenn man jetzt einen Verweis im Projekt hat, kompiliert und danach das Framework ändert (ist mir mal passiert) kann es passieren dass die .dll nicht mehr funktioniert, weil unter anderem Framework erstellt. (Die Leute die mehr Ahnung haben als ich können das sicher besser erklären, oder mich sogar korrigieren wenn ich hier falsch liege. Kann nur aus eigener Erfahrung berichten).

    Mal ne "dumme" Frage: Hast Du mal die Version Deiner .dll kontrolliert (Rechtsklick -> Eigenschaften -> Dateiinfo?).

    Wenn diese nicht mit der Version Deines bei Dir installierten mysql-connectors übereinstimmt, hast Du schon den Fehler gefunden. Dann einfach mal im Ordner "C:\Program Files (x86)\MySQL\MySQL Connector Net X.X.X\Assemblies\" nachschauen ob Du dort die passende DLL findest.

    EDIT: Jetzt erst gesehen: Wenn Du die .dll mittels Link aus Post #8 heruntergeladen hast, ist genau hier der Fehler = andere Version als auf dem Rechner wo die Anwendung erstellt wurde
    Hi,
    hat geklappt =)

    Habe jetzt die dll aus dem mysql-Connector genommen:
    C:\Program Files (x86)\MySQL\MySQL Connector Net 5.2.7\Binaries\.NET 2.0\MySql.Data.dll

    Vielen lieben Dank für deine kompetente Hilfe!!! Echt super nett.

    Hoffe, ich darf nochmal auf dich zurückkommen ;)
    Moin moin nochmal,
    ich muss mal wieder nerven :D

    Ich habe nun eine zweite Datenbank erstellt. Da habe ich mehrere Spalten, wo ich gerne mehrere Spalten auslesen möchte um sie dann im VB anzuzeigen. Perfekt wäre dann noch, wenn ich per Doppelklick auf einen Eintrag ein Event auslösen könnte. Beispielsweise dass etwas an die Datenbank gesendet wird oder sich der Browser öffnet und eine ID, die in einer extra Datei liegt per GET-Methode übermittelt wird.

    Ich habe nun schon viel über DataGridView gelesen.

    Wäre das für meine Wünsche passend? Habs gerade mal ausprobiert - haut aber überhaupt nicht hin. Habe dem DataGridView einen Namen gegeben, die Datenbankverbindung habe ich genau wie hier im Thread bereits geschrieben steht hergestellt. Aber wie bekomme ich nun die Daten aus dem SQL-Befehl ins Grid?
    guck dirmal "Datenbank in 10 Minuten" auf Movie-Tuts an, oder die Forms over Data Videos

    Vor allem aber empfehle ich immer, erstma mit DB-Programmierung ohne Datenbank zu beginnen, weil das ist genug Stoff, und die DB-Zugriffs-Querelen vertagt man besser auf wenn man ersteres beherrscht.
    Aber da kapieren die wenigsten, dasses wirklich der effektivste Weg ist.
    Hi,
    ich habe mir das nun durchgelesen, aber ich habe noch offene Fragen. Ich möchte, dass ich gewisse Spalten aus der Datenbank anzeigen lassen kann, praktisch in einer Art Tabelle. Wenn man dann auf einen Eintrag klickt (oder auf ein Symbol) soll sich der Browser öffnen und auf eine bestimmte Webseite gehen.

    Lässt sich sowas mit DataGridView überhaupt lösen?

    Danke!
    Hi,
    okay - welches sollte ich denn nun nehmen? Und könntest du mir ein ganz einfaches Beispiel posten, wie ich dann in das Grid auch die Daten aus der Datenbank reinbekomme? Habs im Moment nur mit Textboxen und Label, das klappt auch super. Mit dem Gridview komme ich aber noch nicht ganz zurecht. Und wie ich dann das Click-Event programmieren muss weiß ich auch noch nicht.

    Liebe Grüße und DANKE!