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.