Tutorial: mySQL unter Visual Basic 6 (1)

Dieses Thema im Forum "Visual Basic" wurde erstellt von SphinxFFH, 14 Oktober 2003.

  1. SphinxFFH

    SphinxFFH
    Expand Collapse
    New Member

    Registriert seit:
    24 Mai 2002
    Beiträge:
    776
    Zustimmungen:
    0
    Guten Morgen,

    da ich feststelle dass die Mitglieder dieses Forums nun vermehrt Interesse an dem Zugriff auf mySQL Datenbanken haben habe ich beschlossen Schritt für Schritt ein Tutorial zu entwickeln welches den Verbindungsaufbau zu einer solchen Datenbank ganz einfach erklärt.

    In Teil 1 wollen wir eine Verbindung zur Datenbank herstellen und die Datensätze in einer vorhandenen Tabelle auslesen lassen.

    Vorbereitungen:
    Zu allererst muss der ODBC Treiber für mySQL installiert werden. Der stabilste ist momentan die Version 3.51. Dieses Tutorial baut auf diese Version auf. Ihr könnt den ODBC Treiber als Freeware von http://www.mysql.de runterladen. Nach der Installation solltet Ihr Euer Windows-System auf jeden Fall neu starten.
    [rot]EDIT by Schmitti
    Hier der Link zur Downloadseite: http://www.mysql.de/downloads/api-myodbc-3.51.html[/rot]

    Nachdem wir nun in Visual Basic ein neues Projekt angelegt haben erstellen wir einen Verweis auf Microsoft ActiveX Data Objects 2.5 Library. Wie das geht wisst Ihr hoffentlich. Es kann auch eine höhere Version sein, wie z.B. 2.6 oder 2.7, aber die 2.5 ist das minimum.

    Das waren auch schon die Vorbereitungen, nun können wir auch schon...

    ...die Verbindung aufbauen:
    In diesem Schritt kommt nun der erste Code zum Einsatz und Ihr müsst das erste mal ein paar Daten auf Eure Bedürfnisse anpassen. Zunächst schreiben wir folgende Definitionen in den Programmheader:

    Code:
      Private CnA As New ADODB.Connection
      Private RsA As New ADODB.Recordset
    
    Diese beiden "Variablen" dienen uns später zum Verbindungsaufbau (CnA) und zum Abfragen der Ergebnisse (RsA). Wer die beiden Datentypen nicht kennt und sich darüber genauer informieren will findet alles hilfreiche in der hoffentlich installierten MSDN Library.

    Nun definieren wir noch eine allgemeine Funktion die mir nützlich erscheint:

    Code:
      Public Function GetFld(Field As Variant) As String
        If IsNull(Field) Then
           GetFld = ""
        Else
           GetFld = Field
        End If
      End Function
    
    Diese Funktion prüft ob das abgefragte Feld leer ist oder ob es Daten enthält. Bei einer SQL Datenbank ist ein leeres Feld nämlich nicht gleich dem String "".

    Nun aber zum eigentlichen Verbindungsaufbau

    Code:
      With CnA
       .CursorLocation = adUseClient
       .Mode = adModeShareDenyNone
       .ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver};" _
                         & "SERVER=127.0.0.1;" _
                         & "DATABASE=test;" _
                         & "UID=web1" _
                         & "PWD=0815" _
                         & "OPTION=" & 1+2+8+32+2048+16384
       Debug.Print .ConnectionString
       .Open
      End With
    
    Das sieht im ersten Moment komplizierter aus als es ist. Die With-Deklaration sollte jeder kennen der ernsthaft an das Programmieren mit mySQL und Visual Basic denkt. Danach werden dann einige Einstellungen als "ConnectionString" übergeben. Angepasst werden muss dabei von Euch:

    Die Version des ODBC Treibers (hier 3.51)
    Die IP des mySQL Servers (hier 127.0.0.1)
    Die gewünschte Datenbank (hier test)
    Der Benutzername (hier web1)
    Das Passwort (hier 0815)

    Wenn Ihr diese Daten auf Eure belange angepasst habt dann könnt Ihr mit diesen paar Codezeilen schon eine Verbindung aufbauen. In meinem Beispiel würd der fertige Connectionstring noch mal im Debugger ausgegeben. Ob Ihr das nutzt oder nicht sei Euch überlassen.

    Daten abfragen
    Nun wollen wir mit der vorhandenen Verbindung aber auch etwas anfangen und eine unserer Tabellen auslesen. Ich lasse die Daten dabei in ein ListView schreiben, wenn Ihr den Code also so verwenden wollt dann müsst Ihr ein ListView in Euer Projekt einfügen.

    Code:
      sSql = "Select * From test1"
     
      With RsA
       .CursorType = adOpenKeyset
       .LockType = adLockPessimistic
       .Open sSql, CnA
       .MoveFirst
      End With
       
      Do While Not RsA.EOF
       Set Item = ListView1.ListItems.Add(, , GetFld(RsA!Feldbezeichnung1), 0)
       RsA.MoveNext
      Loop
    
    In der ersten Zeile erstellen wir den sogenannten "QUERY", also die Abfrage. Hier in dem Fall ist es eine ganz einfache, nämlich:
    Zeige alle Daten der Tabelle test1 an
    (Die Tabelle test1 muss sich natürlich in der von uns gewählten Datenbank test befinden.

    In dem nachfolgenden With-Block wird diese Abfrage an die von uns geöffnette Verbindung übergeben und das Ergebnis in das RecordSet RsA eingetragen. (Wie gesagt, wer den Typ RecordSet nicht kennt sollte sich darüber schlau machen).

    Abschließend wird nun in einer "Do - Loop" Schleife jeder Datensatz in der Tabelle durchlaufen und in ein ListView eingetragen. Wir fragen dabei die Spalte Feldbezeichnung1 ab, die von Euch wieder entsprechend geändert werden muss.

    Bitte beachtet das wir die Verbindung offen lassen weil ich dieses Tutorial erweitern will von Zeit zu Zeit wenn Interesse da ist. Wollt Ihr das bis dahin schon in einem richtigen Programm nutzen außerhalb dieses Tutorials, dann solltet Ihr ein CnA.Close an das Ende setzen damit die Verbindung nicht offen bleibt.
     
    #1 SphinxFFH, 14 Oktober 2003
    Zuletzt von einem Moderator bearbeitet: 16 Oktober 2003
  2. pRyMaN

    pRyMaN
    Expand Collapse
    New Member

    Registriert seit:
    22 August 2001
    Beiträge:
    76
    Zustimmungen:
    0
    hi,
    ich habe deine Zeilen eingeben aber ich bekomme schon in der ersten eine Fehlermeldung (FEHLER: BENUTZERDEFINIERTER TYP NICHT DEFINIERT). Das kommt auch in der zweiten Zeile. Meine zweite Frage ist, wo ich die Zeilen mit "With" zum Verbindungsaufbau einfügen muss?

    greetz
     
  3. SphinxFFH

    SphinxFFH
    Expand Collapse
    New Member

    Registriert seit:
    24 Mai 2002
    Beiträge:
    776
    Zustimmungen:
    0
    Hi,

    wahrscheinlich hast Du den Verweis nicht erstellt, oder?

    Wenn Du eine Variable vom Typ ADODB.blabla erstellst, kommt dann beim setzen des Punktes der Autocomplete? Wenn nicht, dann erkennt er den Datentypen nämlich nicht und es fehlt ein Verweis.
     
  4. pRyMaN

    pRyMaN
    Expand Collapse
    New Member

    Registriert seit:
    22 August 2001
    Beiträge:
    76
    Zustimmungen:
    0
    Ich werd's versuchen. Und dann sollte es alles funktionieren? Und was ist mit dem "With"-Aufruf? Wohin kommt der?

    greetz
     
  5. pRyMaN

    pRyMaN
    Expand Collapse
    New Member

    Registriert seit:
    22 August 2001
    Beiträge:
    76
    Zustimmungen:
    0
    Ich habe das jetzt soweit ausorobiert und des verbinden klappt bei mir, ich bekomme aber einen Fehler in folgender Zeile:

    Set Item = ListView1.ListItems.Add(, , GetFld(RsA!Feldbezeichnung1), 0)

    Der Fehler lautet:

    Ein Objekt, das dem angeforderten Namen oder dem Ordinalverweis entspricht, kann nicht gefunden werden.

    Ich habe die Zeile
    -- sSql = "Select * From test1"
    in
    -- sSql = "Select * From namen"
    umgeändert, weil ich diese Tabelle angelegt habe. (DB = test)
    Wo liegt der Fehler?

    greetz
     
  6. pRyMaN

    pRyMaN
    Expand Collapse
    New Member

    Registriert seit:
    22 August 2001
    Beiträge:
    76
    Zustimmungen:
    0
    Oh, ich seh grad, dass ich 'Feldbezeichnung1' nicht geändert habe... :rolleyes: Was muss ich denn dafür einfügen? Tritt das obenstehende Problem dann nicht mehr auf??

    greetz
     
  7. Sabine_Illes

    Sabine_Illes
    Expand Collapse
    Member Deluxe

    Registriert seit:
    2 August 2001
    Beiträge:
    309
    Zustimmungen:
    0
    Hallo,

    Für "Feldbezeichnung1" mußt du den Namen deines Feldes einfügen, das du abfragen möchtest. Wenn du in der Tabelle Namen also eine Spalte NameID hast, dann setze ein: RsA!NameID

    Deine Fehlermeldung kommt immer, wenn man ein Feld anspricht, das es in der Tabelle nicht gibt.
     
  8. pRyMaN

    pRyMaN
    Expand Collapse
    New Member

    Registriert seit:
    22 August 2001
    Beiträge:
    76
    Zustimmungen:
    0
    Und in welcher Weise führt man dann den Befehl "Select * From namen" aus, wenn ich lediglich die die Spalte NameID ausgeben lasse? Gibt es eine Möglichkeit die SQL-Befehle richtig umzusetzen, ohne auf eine bestimmte Spalte zu verweisen? Auch kann man leider nicht "RsA!Text1.Text" o. ä. schreiben. Oder dies vorher in einer Variablen speichern und die dann einsetzen. Das finde ich unvorteilhaft. :(
     
  9. Sabine_Illes

    Sabine_Illes
    Expand Collapse
    Member Deluxe

    Registriert seit:
    2 August 2001
    Beiträge:
    309
    Zustimmungen:
    0
    Wenn du nur die Spalte NameID haben möchtest, führe folgenden Select aus:

    Select NameID From namen

    Was meinst du damit?

    Damit du nicht immer den Textfeldern die Werte deines Recordset zuweisen mußt, kannst du mit Databinding arbeiten. Schau dir dazu mal die Hilfe der Data-Properties (-Source, -Field,...) näher an.
     
  10. SphinxFFH

    SphinxFFH
    Expand Collapse
    New Member

    Registriert seit:
    24 Mai 2002
    Beiträge:
    776
    Zustimmungen:
    0
    Hallo pRyMaN,

    wie ich das so sehe gibt es bei dir noch jede Menge nachholbedarf in Sachen mySQL. Das tutorial hat sich eher an solche gerichtet, die mySQL schon können und nur an der Anbindung an Visual Basic scheitern.

    Auch in mySQL kann ich nichts "direkt" zuweisen. Wie auch, das ist ja eine Spaltenbezeichnung und nicht ein einzelnes Feld. Du musst dafür mit Insert Befehlen und / oder Update Befehlen arbeiten... das kommt in nem späteren Tut...

    Was ich nicht verstehe ist, was du mit direktem ausführen von mySQL Befehlen meinst. Die SQL Befehle werden doch direkt ausgeführt.!
     
  11. pRyMaN

    pRyMaN
    Expand Collapse
    New Member

    Registriert seit:
    22 August 2001
    Beiträge:
    76
    Zustimmungen:
    0
    Hi,
    es ist doch so, dass wenn ich die Abfrage "Select * From namen" benutze trotzdem mit Hilfe von "GetFld(RsA!Name)" nur die Spalte "Name" abfrage. Ich erkläre es mal an einem Bsp.: Ich hab eine Grid auf meinem Form. In eine Textbox gebe ich meine Anfrage ein. In meinem Fall "Select * From namen". Nun ist es aber so, dass ich mit dem Befehl "GetFld(RsA!Name)" immer nur eine Spalte abfragen kann und nicht die ganze Tabelle. Das bedeutet, dass ich hier jede Spalte "einzeln" in mein Grid eintragen muss. Ich wollte eigentlich nur wissen, ob es auch eine Möglichkeit gibt die aus der Abfrage entstandene Tabelle so an VB zu übergeben, wie sie ist, also ohne jedesmal eine bestimmte Spalte auszuwählen. Ich meine damit, wenn ich schon die ganze Tabelle abfrage, kann sie doch auch einfach so übergeben werden. Das ist doch umständlich, oder leide ich da jetzt an einem Denkfehler? Hoffe man kann mir folgen... :D

    greetz

    P.S.: Wann soll denn ein weiteres Tut von dir kommen? Mich würde nämlich interessieren, wie ich in eine SQL-DB bestimmte Werte eintrage.
     
  12. SphinxFFH

    SphinxFFH
    Expand Collapse
    New Member

    Registriert seit:
    24 Mai 2002
    Beiträge:
    776
    Zustimmungen:
    0
    Das geht ganz einfach, du kannst z.B. eine ListView nehmen und dann halt so:


    Code:
      Set Item = ListView1.ListItems.Add (,,,0)
      Item.Text = GetFld(RsA!Feldname1)
      Item.SubItems(1) = GetFld(RsA!Feldname2)
      Item.SubItems(2) = GetFld(RsA!Feldname3)
      ' ... usw
    
    So übernimmst du sofort die ganze Tabelle.!

    Das Tut. wird am Wochenende fortgesetzt wenn ich Zeitfinde und wenn die Interesse von Euch da ist.
     
  13. pRyMaN

    pRyMaN
    Expand Collapse
    New Member

    Registriert seit:
    22 August 2001
    Beiträge:
    76
    Zustimmungen:
    0
    Was aber tun wenn die Spaltenname nicht bekannt sind? Naja egal...
    Ich würde gern wissen, wie man in eine DB Daten einschreibt. Wäre dir wirklich sehr verbunden, wenn du es mir sagen könntest, brauche das nämlich dringends für mein Programm.

    greetz Pryman
     
  14. Sabine_Illes

    Sabine_Illes
    Expand Collapse
    Member Deluxe

    Registriert seit:
    2 August 2001
    Beiträge:
    309
    Zustimmungen:
    0
    Hallo!

    Angenommen, du kennst die Spaltennamen der Tabelle nicht. Du hast x Textboxen in einem ControlArray und auch x Spalten in deiner Tabelle (ich geh mal davon aus, daß es nicht passieren kann, daß mehr Spalten als Textboxen vorhanden sind). Der Inhalt einer Spalte soll in eine Textbox geschrieben werden:

    Code:
    Dim RSField As ADODB.Field
    
    '  Laden eines Datensatzes
    RSlocal.Open "SELECT * FROM MyTable WHERE Key = 1", pa_uConnDB, adOpenKeyset
        If Not RSlocal.EOF Then
            '  hier werden alle Spalten des Datensatzes durchlaufen
            For Each RSField In RSlocal.Fields
                txtText(li - 1).Text = RSField.Value
            Next
        End If
    RSlocal.Close
    
    Neue Daten in Tabelle schreiben:

    Code:
    ' Verbindung zur Tabelle herstellen
    RSlocal.Open "SELECT * FROM MyTable WHERE Key = 0", pa_uConnDB, adOpenKeyset, adLockOptimistic
       '  neuen Datensatz hinzufügen
       RSlocal.AddNew
       '  befüllen
       RSlocal!Name = txtName.Text
       RSlocal!Datum = txtDate.Text
       '  speichern
       RSlocal.Update
    RSlocal.Close
    
    Das ginge auch kürzer mittels eines Update-Statements, dazu mußt du aber schon ein bißchen Transact-SQL können (ist aber nicht schwer).
     
  15. pRyMaN

    pRyMaN
    Expand Collapse
    New Member

    Registriert seit:
    22 August 2001
    Beiträge:
    76
    Zustimmungen:
    0
    Hm, das sieht gar nicht so schwer aus. Allerdings verstehe ich folgende Zeile nicht:

    RSlocal.Open "SELECT * FROM MyTable WHERE Key = 0", pa_uConnDB, adOpenKeyset, adLockOptimistic

    Muss ich quasi erst eine Abfrage starten in die ich dann sozusagen hineinschreibe, oder wie? Ich habe mich an das Beispiel von SphinxFFH gehalten. Kann das sein, dass du das irgendwie anders machst?

    greetz
     
  16. pRyMaN

    pRyMaN
    Expand Collapse
    New Member

    Registriert seit:
    22 August 2001
    Beiträge:
    76
    Zustimmungen:
    0
    Achso, ich kenne natürlich die Spaltenköpfe der DB, war nur mal so gefragt... trotzdem danke ;)

    greetz
     
  17. SphinxFFH

    SphinxFFH
    Expand Collapse
    New Member

    Registriert seit:
    24 Mai 2002
    Beiträge:
    776
    Zustimmungen:
    0
    Hi,

    auch ich mach eine Abfrage, anderst geht das gar nicht... nur hab ich das etwas anderst gecodet weil ich es für mich übersichtlicher finde:

    Code:
      sSql = "Select * From test1"
     
      With RsA
       .CursorType = adOpenKeyset
       .LockType = adLockPessimistic
       .Open sSql, CnA
       .MoveFirst
      End With
       
      Do While Not RsA.EOF
       Set Item = ListView1.ListItems.Add(, , GetFld(RsA!Feldbezeichnung1), 0)
       RsA.MoveNext
      Loop
    
    Bei mir wird die Abfrage oben in die Variable sSql gelegt und dann mit RsA.Open sSql, CnA im Prinzip ganz genau so ausgeführt.

    Ist halt geschmackssache...

    Jetzt wo das Forum wieder geht folgt am WE dann auch Teil 2.!
     
  18. pRyMaN

    pRyMaN
    Expand Collapse
    New Member

    Registriert seit:
    22 August 2001
    Beiträge:
    76
    Zustimmungen:
    0
    juhu endlich wieder dumme fragen stellen ^^

    Also, ich würde gern wissen, wie man aus einer bestimmten Tabelle einer DB alle Datensetze löschen kann.

    greetz
     
  19. pRyMaN

    pRyMaN
    Expand Collapse
    New Member

    Registriert seit:
    22 August 2001
    Beiträge:
    76
    Zustimmungen:
    0
    weiß denn niemand einen Antwort? hm?

    greetz
     
  20. Sabine_Illes

    Sabine_Illes
    Expand Collapse
    Member Deluxe

    Registriert seit:
    2 August 2001
    Beiträge:
    309
    Zustimmungen:
    0
    Um sicher zu gehen müßte ich nachsehen, aber ich würde sagen:

    Code:
    DELETE * FROM MyTable
    
     
Die Seite wird geladen...

Diese Seite empfehlen