A seguito del precedente articolo [excel] Aggiungere all’origine dati delle tabelle da un database MySQL ho deciso di integrare l’esercizio creando una classe per leggere e scrivere tramite VBA su un database MySQL.
Affinché la classe funzioni ricordiamoci di installare il connettore recuperabile sul sito ufficiale (Connector/ODBC 8.0.19). Inoltre ricordiamoci anche che per poter eseguire la connessione ADO abbiamo bisogno di importare l’opportuna libreria dai riferimenti. In questo modo:
Detto tutto questo possiamo creare una classe MySQL con le seguenti istruzioni all’interno:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | Private cs As String Private Sub Class_Initialize()     cs = "DRIVER={MySQL ODBC 8.0 ANSI Driver}" End Sub Public Sub setConnectionString( _                                 ByVal driver As String, _                                 Optional ByVal server As String = "localhost", _                                 Optional ByVal database As String = "", _                                 Optional ByVal user As String = "", _                                 Optional ByVal pass As String = "")     cs = "DRIVER={" & driver & "}"     If server <> "" Then         cs = cs & ";SERVER=" & server     End If     If database <> "" Then         cs = cs & ";DATABASE=" & database     End If     If user <> "" Then         cs = cs & ";USER=" & user     End If     If pass <> "" Then         cs = cs & ";PASSWORD=" & pass     End If End Sub Public Function dbout(ByVal query As String) As Variant     Dim conn As ADODB.Connection     Dim rs As ADODB.Recordset     Dim risultato() As Variant     Set conn = CreateObject("ADODB.Connection")     Set rs = CreateObject("ADODB.Recordset")     conn.Open cs     rs.Open query, conn     ' mi calcolo le dimensioni del recordset     righe = 0     colonne = 0     If Not rs.EOF Then         Do             righe = righe + 1             colonne = rs.Fields.Count             rs.MoveNext         Loop Until rs.EOF     End If     ' mi riposiziono all'inizio     rs.MoveFirst     ReDim risultato(righe, colonne)     ' leggo i dati nel risultato     righe = 0     If Not rs.EOF Then         Do             For j = 0 To rs.Fields.Count - 1                 risultato(righe, j) = rs(j)             Next j             righe = righe + 1             rs.MoveNext         Loop Until rs.EOF     End If     rs.Close     conn.Close     dbout = risultato End Function Public Function dbin(ByVal query As String)     Dim conn As ADODB.Connection     Set conn = CreateObject("ADODB.Connection")     conn.Open cs     conn.Execute query     conn.Close End Function Public Function clear(ByVal testo As String) As String     testo = Replace(testo, "\", "\\")     testo = Replace(testo, "'", "\'")     clear = testo End Function | 
Possiamo usare la classe nel modo seguente:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | Sub MostraTotale()     Dim db As New MySQL     db.setConnectionString driver:="MySQL ODBC 8.0 ANSI Driver", server:="localhost", database:="miodb", user:="root"     Dim righe As Variant     ' inseriamo dei valori     nome = "Mario"     cognome = "D'Angelo"     indirizzo = "Via delle prove"     db.dbin "INSERT INTO `clienti`(`nome`, `cognome`, `indirizzo`) VALUES ('" & db.clear(nome) & "','" & db.clear(cognome) & "','" & db.clear(indirizzo) & "')"     ' leggiamo diverse righe     righe = db.dbout("SELECT * FROM clienti")     For i = 0 To UBound(righe, 1) - 1         Debug.Print righe(i, 0) & " - " & righe(i, 1)     Next i     ' leggiamo una singola riga     righe = db.dbout("SELECT COUNT(*) FROM clienti")     Debug.Print righe(0, 0) End Sub | 
Faccio notare che con il metodo clear possiamo aggiungere gli slash agli apici, presenti nel cognome.
