Benvenuto! Per postare e godere delle funzionalità del forum registrati, occorrono pochi secondi ed è gratis!

[VB.NET] Gestione di un database MySql remoto (Tutorial)
(Questo messaggio è stato modificato l'ultima volta il: 10/08/2014, 18:32 da Admin.)

Amministratore
Messaggi: 2,338
Discussioni: 233
Registrato: 03-2011
Mix: 2,578.4
In questa guida vi spiego come sviluppare un software per la gestione di un database MySql remoto col Visual Basic.NET.

Requisiti:
  • Impegno e basi solide del vb.net e del MySql;
  • Visual Basic 2008/2010 (con framework 4 ovviamente);
  • Driver della connettività MySql (

    [Per vedere i link devi REGISTRARTI.]

    )

<a name="i">Indice guida:</a>
  1. Sistema di Login al database MySql
    • <a href="#f1p">Form1.vb [Progettazione]</a>
    • <a href="#f1c">Form1.vb</a>

  2. Sistema di gestione del database MySql
    • <a href="#f2p">Form2.vb [Progettazione]</a>
    • <a href="#f2c">Form2.vb</a>

  3. <a href="#c">Conclusione</a>

<a name="f1p">Sistema di Login al Database MySql</a> <a href="#i">↑</a>
Form1.vb [Progettazione]
Un database sicuro avrà delle credenziali di accesso, quindi il nostro programma prima di farci gestire un database, ci deve far identificare.
Appena lo apriamo, niente è visibile tranne che un form per effettuare il login.
Quindi cominciamo a fare i disegnini, apriamo VB.net e creiamo un nuovo "Applicazione Windows Form".
Mettiamo 4 textbox e un bottone sul Form1.
La prima textbox riceverà l'indirizzo del server, a seguire il nome del database, nome utente e password.
Il bottone ovviamente ci consentirà di ottenere una risposta, in base all'indirizzo del server, se le credenziali sono valide, ci si apriranno le porte verso la gestione del database.
Sconsiglio VIVAMENTE di creare un login già contenuto nel codice del programma, poichè basta una piccola spiata del programma con software per il reversing per scoprire le vostre credenziali.
Se seguirete questa guida, problemi password a rischio sono pressochè nulle, poi vi spiego perchè.
Per far sì che vb.net riconosca le classi della libreria del MySql, dobbiamo aggiungere il riferimento MySql.data.dll, quello che abbiamo scaricato sul sito del MySql appunto.
Quindi "Progetto > Aggiungi riferimento... > Sfoglia", dovete andare nella directory in cui avete installato il driver, nella cartella ./MySql/MySql Connector Net 5../Binaries eccetera troverete il file MySql.data.dll.

[Immagine: form1.png]

<a name="f1c">Codice Form1.vb</a> <a href="#i">↑</a>
Finito il dipinto ad olio su tela, passiamo al codice. Happywide
Se abbiamo aggiunto quel riferimento, dobbiamo importarlo nel form che ne fa uso, quindi siccome nel login useremo determinate classi contenuto in quella libreria, importiamola!

    VBNET Programming
  1. Imports MySql.Data.MySqlClient



Ora pensiamo al codice inerente il login.
Creiamo la classe "connessione", all'interno del Public Class Form1

    VBNET Programming
  1. Public Class Form1
  2. 'Queste variabili conterranno ciascuna il contenuto della textbox associata
  3. Public server, dbname, user, password As String
  4.  
  5. Public Sub connessione()
  6. server = TextBox1.Text
  7. dbname = TextBox2.Text
  8. user = TextBox3.Text
  9. password = TextBox4.Text
  10. Try 'Con il Try possiamo intercettare errori
  11. 'Str_Co conterrà la stringa standard per la connessione al MySql, le variabili
  12. 'richiamano il contenuto della textbox
  13. Dim Str_Co As String = "host=" & server & ";" & _
  14. "database=" & dbname & ";" & _
  15. "user=" & user & ";" & _
  16. "password=" & password
  17.  
  18. Dim connessione As MySqlConnection = New MySqlConnection(Str_Co)
  19. connessione.Open() 'Apriamo la connessione
  20. Button1.Text = "Connetti" 'Cliccando "Connetti" il bottone mostrerà "Attendi" fino a quando
  21. 'ci sarà una risposta
  22. Form2.Show()
  23. connessione.Close() 'Chiudiamo la connessione, di già? Perchè? Ve lo spiego dopo
  24. connessione.Dispose() 'Puliamo la ram dagli elementi salvati per effettuare la connessione
  25. Catch errore As MySqlException 'Catturiamo eventuali errori che il MySql ci fornirà
  26. Button1.Text = "Connetti" 'ignoratelo per ora
  27. Button1.Enabled = True 'ignoratelo per ora
  28. MsgBox("Impossibile connettersi al database!" & vbCr &
  29. "Messaggio d'errore: " & vbCr + errore.Message, vbCritical, "Errore!") 'e li mostriamo con una MsgBox
  30. End Try
  31. End Sub



Ma come, mi sono fatto il mazzo per riuscire a connettermi al database, che già il "connessione.Close()" mi chiude la connessione?
E io vi aggiungo che oltre a chiuderla, la linea di codice successiva vi cancella pure i dati in ram delle credenziali che avete immesso nella textbox!
Questo perchè ogni operazione che faremo, connessione, lettura tabelle, immissione query, richiede una autenticazione, e dopo l'azione effettuata una disconnessione. Noi in questa classe, stabiliamo la connessione solo per identificarci.
Ovviamente col programma, facciamo in modo che una volta inseriti i dati del login, questi vengano usati per ogni azione che necessita di una connessione al db (mi pare ovvio).

Il codice del bottone per connettersi sarà semplicissimo.

    VBNET Programming
  1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
  2. Handles Button1.Click
  3.  
  4. Button1.Text = "Attendere"
  5. 'La prossima linea la ritengo molto importante, una volta cliccato, il 'bottone sarà disabilitato, per
  6. 'evitare di creare inutilmente un ulteriore caricamento da parte del 'database. Ecco perchè alla
  7. 'fine della classe "connessione" dentro il "Catch errore..." il bottone verrà 'riabilitato, così possiamo
  8. 'ritentare il login senza riaprire il programma.
  9.  
  10. Button1.Enabled = False
  11. connessione()
  12. Button1.Enabled = True 'Riattiviamo il bottone, sennò se chiuderemo il Form2, il bottone
  13. ' rimarrà disabilitato
  14. End Sub



<a name="f2p">Sistema di gestione del Database MySql</a> <a href="#i">↑</a>
Form2.vb [Progettazione]
Come già detto, il Form2 che conterrà la gestione del db, si aprirà solo a identificazione avvenuta.
Da questo form, potremo vedere la struttura e il contenuto di qualsiasi tabella presente nel db, che selezioneremo dalla ComboBox.
Il tutto verrà mostrata nel DataGridView.
Il bottone Aggiorna, aggiornerà appunto le tabelle e quindi il contenuto di queste.
Il bottone disconnetti, ci consentirà di chiudere la connessione, chiudere il Form2 e far riapparire il Form1 così da poter effettuare la connessione su un altro database.
La RichTextBox ci permette di eseguire qualsiasi tipo di query, che invieremo dal bottone "Invia", mentre il bottone "X" pulisce il contenuto della RichTextBox.
Che farà la StatusStrip? Ho avuto quest'idea per dare un tocco di professionalità al programma. Ogni azione che svolgeremo sarà accompagnata da questa barra, che ci comunica l'ultima l'operazione svolta e se è stata effettuata correttamente o meno.
Riprendiamo la nostra vena artistica e facciamo un bel "disegno".

Ricapitoliamo:
  • 4 bottoni;
  • 1 StatusStrip;
  • 1 ComboBox;
  • 1 DataGridView;
  • 1 RichTextbox;


Io da amante della semplicità ho fatto una cosa del genere.

[Immagine: immagine2xl.png]

La label che vedete in alto a sinistra non ha alcuna funzionalità se non quella di mostrare del testo.

<a name="f2c">Codice Form2.vb</a> <a href="#i">↑</a>
Il codice del Form2 sarà più complesso.
Per non ripetere sempre la funzione che svolge la classe "connessione" faremo uso di 2 flag (aprirò un nuovo topic per spiegare cosa sono) differenti per intercettare degli eventi.
Perchè? Siccome quasi ogni funzione del programma necessita di una connessione al database scelto al momento del login, io voglio fare in modo che queste funzioni sfruttino sempre la stessa classe "connessione".
Se la flag avrà un determinato valore (che può essere o vero o falso) allora "connessione" mi svolgerà una determinata funzione, oltre a quella di connettersi al db.
"Connessione" quindi, attraverso la funzione If, svolgerà solo quelle funzioni che hanno la flag su vero, altrimenti passeranno alla funzione successiva.

Non deve mancare, come per il Form1, la stringa per importare la libreria del MySql, e aggiungere quindi lo stesso riferimento aggiunto per il Form1.
Dichiariamo in Public Class del Form2 le due flag, la variabile cmd come MySqlCommand e di nuovo la stringa per connetterci, che sfrutteremo per tutte le volte che è necessario stabilire una connessione, per qualsivoglia azione (come ad esempio leggere le tabelle, eseguire una query ecc).

    VBNET Programming
  1. Dim RichFlag As Boolean = False
  2. Dim ComboFlag As Boolean = False
  3. Dim cmd As New MySqlCommand()
  4. Dim Str_Co As String = "host=" & Form1.server & ";" & _
  5. "database=" & Form1.dbname & ";" & _
  6. "user=" & Form1.user & ";" & _
  7. "password=" & Form1.password



Apriamo ora la classe "connessione": Public Sub connessione()
In questa classe, dobbiamo fare un'altra serie di dichiarazioni.
    VBNET Programming
  1. Dim connessione As MySqlConnection = New MySqlConnection(Str_Co)


Per richiamare la stringa con le credenziali per l'identificazione, a seguire:

    VBNET Programming
  1. Public Sub connessione()
  2. Dim adapter As MySqlDataAdapter 'MySqlDataAdapter è una classe contenuta nel riferimento
  3. 'aggiunto, alla fine del codice vi spiego meglio
  4. Dim table As DataTable 'Sarà la struttura della tabella selezionata che più avanti
  5. 'visualizzeremo nel DataGrid
  6. Dim query As String
  7.  
  8. connessione.Open() 'apriamo la connessione
  9. cmd.Connection = connessione 'sarebbe MySqlCommand.Connection
  10.  
  11. 'Se la condizione dell'if si verifica, con questo codice visualizzeremo nel datagrid
  12. 'la struttura della tabella selezionata nella combobox
  13. If ComboFlag = True Then 'se ComboFlag è True eseguirà quella sfilza di codice
  14. Try
  15. 'ComboBox1.SelectedItem assume il nome della tabella selezionata
  16. 'mostreremo quindi la tabella eseguendo una query MySql
  17. query = "SELECT * FROM " & ComboBox1.SelectedItem
  18. 'alla fine del codice vi spiego le prossime 4 linee
  19. adapter = New MySqlDataAdapter(query, Str_Co)
  20. table = New DataTable
  21. adapter.Fill(table)
  22. DataGridView1.DataSource = table
  23. Catch errore As MySqlException 'se ci sono errori li mostrerà sia sulla StatusStrip
  24. 'che come MsgBox
  25. ToolStripStatusLabel2.Text = TimeOfDay & " - Errore nel selezionare la tabella."
  26. MsgBox("Messaggio d'errore:" & vbCr + errore.Message, vbCritical, "Errore!")
  27. Finally 'concludiamo con la disconnessione dal db e la rimozione dei dati
  28. connessione.Close()
  29. connessione.Dispose()
  30. End Try
  31. MostraTables() 'Classe che mostra/aggiorna le tabelle visualizzate nella combobox,
  32. 'dopo vedrete il codice
  33. End If
  34.  
  35. 'Se la condizione dell'if si verifica, con questo codice visualizzeremo eseguiremo
  36. 'la query immessa nel RichTextBox
  37. If RichFlag = True Then
  38. Try
  39. 'MySqlCommand.CommandText ovvero faccio capire a vb.net che sto per comunicargli
  40. 'un comando MySql, che potrà estrapolarlo dalla RichTextBox1
  41. cmd.CommandText = RichTextBox1.Text.Trim
  42. cmd.ExecuteNonQuery()
  43. 'una volta eseguita la query, sarebbe istintivo cliccare "Aggiorna" per vedere i cambiamenti
  44. 'quindi possiamo fare in modo che si aggiorna automaticamente appena la query è stata eseguita
  45. ComboBox1.Items.Clear()
  46. MostraTables() 'poi spiego
  47. ToolStripStatusLabel2.Text = TimeOfDay & " - Query eseguita correttamente."
  48. RichTextBox1.Clear() 'se la query è stata eseguita, la RichTextBox si ripulirà
  49. Catch errore As Exception
  50. ToolStripStatusLabel2.Text = TimeOfDay & " - Esecuzione query fallita."
  51. MsgBox("Messaggio d'errore:" & vbCr + errore.Message, vbCritical, "Errore!")
  52. Finally
  53. connessione.Close()
  54. connessione.Dispose()
  55. RichFlag = False 'le flags vengono reimpostate su False in caso l'operazione si ripete
  56. ComboFlag = False
  57. End Try
  58. End If
  59. End Sub



Armatevi di pazienza e concentrazione, perchè quello che sto per spiegarvi è un pochino ostico. (Linea 19 dell'ultimo codice)

adapter = New MySqlDataAdapter(query, Str_Co)
table = New DataTable
adapter.Fill(table)
DataGridView1.DataSource = table

MySqlDataAdapter, in base alla query, in questo caso interpreta la struttura della tabella, facendo in modo che il DataGrid successivamente riconosca la struttura da poter visualizzare.
DataTable sarà una tabella virtuale, memorizzata ma non visualizzata. Serve solo per permettere al programma di crearsi una mappa della struttura e contenuto della tabella.
adapter ha assunto il contenuto di query, quindi la query, che mostra il contenuto della tabella, permette al DataTable di essere riempito con la struttura della tabella ( "adapter.fill(table)" ).
DataGridView1.DataSource = table visualizzerà quindi la struttura e il contenuto della tabella selezionata dalla combobox.

Per quanto riguarda MostraTables, come già detto, è una classe che vi mostra o aggiorna le tabelle visualizzate dalla combobox.
Questo è il codice.

    VBNET Programming
  1. Private Sub MostraTables()
  2. Dim connessione As MySqlConnection = New MySqlConnection(Str_Co)
  3. connessione.Open()
  4. 'per mostrare le tabelle nella combobox, la query mysql è semplicemente questa
  5. cmd.CommandText = "SHOW TABLES"
  6. cmd.Connection = connessione
  7.  
  8. Try
  9. 'le prossime linee di codice ve le spiego dopo
  10. Dim DataReader As MySqlDataReader = cmd.ExecuteReader
  11. While DataReader.Read() 'si apre un ciclo
  12. ComboBox1.Items.Add(DataReader(0))
  13. End While 'finisce il ciclo
  14. DataReader.Close()
  15. Catch ex As Exception
  16. MessageBox.Show(ex.Message & Environment.NewLine & ex.StackTrace)
  17. Finally
  18. connessione.Close()
  19. connessione.Dispose()
  20. End Try
  21. End Sub



Dim DataReader As MySqlDataReader = cmd.ExecuteReader
While DataReader.Read()
ComboBox1.Items.Add(DataReader(0))
DataReader.Close()

DataReader è una variabile, che andrà a "leggere" i nomi di tutte le tabelle presenti nel database.
Ci avvaliamo della classe MySqlDataReader.
Il ciclo aggiungerà in successione nella combobox le tabelle del database, partendo dall'elemento 0 (il primo) finchè non ne trova più.

Il grosso è stato fatto, ora non ci resta che richiamare la classe "connessione", in base alla funzione richiesta.
Per esempio, se clicchiamo su una tabella nella combobox, il datagrid ci deve mostrare la struttura e il contenuto della tabella.
Per fare ciò bastano 4 linee di codice.
    VBNET Programming
  1. Private Sub Combobox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
  2. Handles ComboBox1.SelectedIndexChanged
  3. 'settando la ComboFlag = True, la classe "connessione" eseguirà solamente il contenuto del primo If
  4. ComboFlag = True
  5. connessione()
  6. ToolStripStatusLabel2.Text = TimeOfDay & " - Tabella " & ComboBox1.SelectedItem & " selezionata."
  7. End Sub



Se invece vogliamo che il bottone "Invia" esegua una query inserita nella RichTextBox, allora:
    VBNET Programming
  1. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
  2. Handles Button2.Click
  3. 'settando RichFlag = True, la classe "connessione" eseguirà solamente il contenuto del secondo If
  4. RichFlag = True
  5. connessione()
  6. End Sub



Cliccando il tasto "Aggiorna", il programma dovrebbe caricare di nuovo le tabelle, prima di fare ciò, ripuliamo la ComboBox se non volete vedere le vostre tabelle duplicate!
    VBNET Programming
  1. Private Sub btnAggiorna_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
  2. Handles btnAggiorna.Click
  3. ComboBox1.Items.Clear()
  4. MostraTables()
  5. ToolStripStatusLabel2.Text = TimeOfDay & " - Tabelle aggiornate."
  6. End Sub



Dove c'è scritto ToolStripStatusLabel etc, modificherete il label della StatusBar, io ho voluto fare così per rendere più chiaro l'uso del programma all'utente finale.
Senza la StatusStrip, l'utente finale non saprebbe ad esempio se una query è stata eseguita o no. Potrete mettere delle MessageBox se non vi piace la StatusStrip, ma con le MsgBox prima o poi vi annoierete a cliccare sempre su ok per chiuderle.
Il codice che ho inserito, non è il 100% del codice del programma, sicuramente è la parte più importante. Questo per evitare che qualche utente che non ha nemmeno le basi, non riuscirebbe a farlo funzionare col copia incolla, sarebbe inutile!


<a name="c">Conclusione</a> <a href="#i">↑</a>
A molti sicuramente non piacerà l'idea, ma a certi come me, sicuramente affascina il fatto di creare un software per entrare in un database remoto, in modo sicuro, e leggerne e modificarne il contenuto.
Per modificarne il contenuto, usando questo software, bisogna per forza conoscere i comandi MySql in modo approfondito, visto che bisogna inserire query intere. Ma se vi volete sfiziare, potete usare questo programma, e ampliarlo, in modo di fare ad esempio oltre all'inserimento manuale della query, anche una procedura guidata!
Per testare il funzionamento del programma, potete creare un database MySql in locale, oppure se non ne avete uno remoto, potete crearne gratuitamente uno dal sito db4free.net
Se volete scaricare il software completato, che ho fatto io, scaricate l'allegato.

.zip   Database.zip (Dimensione: 2.81 MB / Download: 26)

Devo dire che una volta completato, mi sono sentito molto soddisfatto! Happywide
E spero che vi piacerà anche a voi!


[Per vedere i link devi REGISTRARTI.]

Prima di aprire ogni contenuto scaricato su siti esterni ad HackMix, scansionatelo su VirusTotal.
18/08/2011, 18:06
#1
Cerca


Messaggi in questa discussione
Gestione di un database MySql remoto (Tutorial) - da Admin - 18/08/2011, 18:06
[Nessun oggetto] - da Skyline@69 - 18/08/2011, 18:41
[Nessun oggetto] - da Luca360 - 18/08/2011, 23:13
[Nessun oggetto] - da Skyline@69 - 18/08/2011, 23:27
[Nessun oggetto] - da Admin - 18/08/2011, 23:39
[Nessun oggetto] - da digger - 19/08/2011, 16:00
[Nessun oggetto] - da IAL32 - 20/04/2012, 17:29
[Nessun oggetto] - da impazienza - 21/09/2012, 22:03
[Nessun oggetto] - da Pocciox - 21/09/2012, 23:45
[Nessun oggetto] - da digger - 22/09/2012, 0:15
[Nessun oggetto] - da impazienza - 22/09/2012, 19:00
[Nessun oggetto] - da Liuk - 22/09/2012, 16:35
[Nessun oggetto] - da Pocciox - 22/09/2012, 22:59
[Nessun oggetto] - da pauldomy - 16/12/2012, 19:46



Utenti che stanno guardando questa discussione: 2 Ospite(i)