In questa guida vi spiego come sviluppare un software per la gestione di un database MySql remoto col Visual Basic.NET.
Requisiti:
[Per vedere i link devi REGISTRARTI.]
- Sistema di Login al database MySql
- Sistema di gestione del database MySql
[Per vedere i link devi REGISTRARTI.]
[Per vedere i link devi REGISTRARTI.]
[Per vedere i link devi REGISTRARTI.]
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.
[Per vedere i link devi REGISTRARTI.]
[Per vedere i link devi REGISTRARTI.]
Finito il dipinto ad olio su tela, passiamo al codice.
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
Imports MySql.Data.MySqlClient
Ora pensiamo al codice inerente il login.
Creiamo la classe "connessione", all'interno del Public Class Form1
VBNET Programming
Public Class Form1
'Queste variabili conterranno ciascuna il contenuto della textbox associata
Public server, dbname, user, password As String
Public Sub connessione()
server = TextBox1.Text
dbname = TextBox2.Text
user = TextBox3.Text
password = TextBox4.Text
Try 'Con il Try possiamo intercettare errori
'Str_Co conterrà la stringa standard per la connessione al MySql, le variabili
'richiamano il contenuto della textbox
Dim Str_Co As String = "host=" & server & ";" & _
"database=" & dbname & ";" & _
"user=" & user & ";" & _
"password=" & password
Dim connessione As MySqlConnection = New MySqlConnection(Str_Co)
connessione.Open() 'Apriamo la connessione
Button1.Text = "Connetti" 'Cliccando "Connetti" il bottone mostrerà "Attendi" fino a quando
'ci sarà una risposta
Form2.Show()
connessione.Close() 'Chiudiamo la connessione, di già? Perchè? Ve lo spiego dopo
connessione.Dispose() 'Puliamo la ram dagli elementi salvati per effettuare la connessione
Catch errore As MySqlException 'Catturiamo eventuali errori che il MySql ci fornirà
Button1.Text = "Connetti" 'ignoratelo per ora
Button1.Enabled = True 'ignoratelo per ora
MsgBox("Impossibile connettersi al database!" & vbCr &
"Messaggio d'errore: " & vbCr + errore.Message, vbCritical, "Errore!") 'e li mostriamo con una MsgBox
End Try
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
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button1.Click
Button1.Text = "Attendere"
'La prossima linea la ritengo molto importante, una volta cliccato, il 'bottone sarà disabilitato, per
'evitare di creare inutilmente un ulteriore caricamento da parte del 'database. Ecco perchè alla
'fine della classe "connessione" dentro il "Catch errore..." il bottone verrà 'riabilitato, così possiamo
'ritentare il login senza riaprire il programma.
Button1.Enabled = False
connessione()
Button1.Enabled = True 'Riattiviamo il bottone, sennò se chiuderemo il Form2, il bottone
' rimarrà disabilitato
End Sub
[Per vedere i link devi REGISTRARTI.]
[Per vedere i link devi REGISTRARTI.]
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.
La label che vedete in alto a sinistra non ha alcuna funzionalità se non quella di mostrare del testo.
[Per vedere i link devi REGISTRARTI.]
[Per vedere i link devi REGISTRARTI.]
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
Dim RichFlag As Boolean = False
Dim ComboFlag As Boolean = False
Dim cmd As New MySqlCommand()
Dim Str_Co As String = "host=" & Form1.server & ";" & _
"database=" & Form1.dbname & ";" & _
"user=" & Form1.user & ";" & _
"password=" & Form1.password
Apriamo ora la classe "connessione": Public Sub connessione()
In questa classe, dobbiamo fare un'altra serie di dichiarazioni.
VBNET Programming
Dim connessione As MySqlConnection = New MySqlConnection(Str_Co)
Per richiamare la stringa con le credenziali per l'identificazione, a seguire:
VBNET Programming
Public Sub connessione()
Dim adapter As MySqlDataAdapter 'MySqlDataAdapter è una classe contenuta nel riferimento
'aggiunto, alla fine del codice vi spiego meglio
Dim table As DataTable 'Sarà la struttura della tabella selezionata che più avanti
'visualizzeremo nel DataGrid
Dim query As String
connessione.Open() 'apriamo la connessione
cmd.Connection = connessione 'sarebbe MySqlCommand.Connection
'Se la condizione dell'if si verifica, con questo codice visualizzeremo nel datagrid
'la struttura della tabella selezionata nella combobox
If ComboFlag = True Then 'se ComboFlag è True eseguirà quella sfilza di codice
Try
'ComboBox1.SelectedItem assume il nome della tabella selezionata
'mostreremo quindi la tabella eseguendo una query MySql
query = "SELECT * FROM " & ComboBox1.SelectedItem
'alla fine del codice vi spiego le prossime 4 linee
adapter = New MySqlDataAdapter(query, Str_Co)
table = New DataTable
adapter.Fill(table)
DataGridView1.DataSource = table
Catch errore As MySqlException 'se ci sono errori li mostrerà sia sulla StatusStrip
'che come MsgBox
ToolStripStatusLabel2.Text = TimeOfDay & " - Errore nel selezionare la tabella."
MsgBox("Messaggio d'errore:" & vbCr + errore.Message, vbCritical, "Errore!")
Finally 'concludiamo con la disconnessione dal db e la rimozione dei dati
connessione.Close()
connessione.Dispose()
End Try
MostraTables() 'Classe che mostra/aggiorna le tabelle visualizzate nella combobox,
'dopo vedrete il codice
End If
'Se la condizione dell'if si verifica, con questo codice visualizzeremo eseguiremo
'la query immessa nel RichTextBox
If RichFlag = True Then
Try
'MySqlCommand.CommandText ovvero faccio capire a vb.net che sto per comunicargli
'un comando MySql, che potrà estrapolarlo dalla RichTextBox1
cmd.CommandText = RichTextBox1.Text.Trim
cmd.ExecuteNonQuery()
'una volta eseguita la query, sarebbe istintivo cliccare "Aggiorna" per vedere i cambiamenti
'quindi possiamo fare in modo che si aggiorna automaticamente appena la query è stata eseguita
ComboBox1.Items.Clear()
MostraTables() 'poi spiego
ToolStripStatusLabel2.Text = TimeOfDay & " - Query eseguita correttamente."
RichTextBox1.Clear() 'se la query è stata eseguita, la RichTextBox si ripulirà
Catch errore As Exception
ToolStripStatusLabel2.Text = TimeOfDay & " - Esecuzione query fallita."
MsgBox("Messaggio d'errore:" & vbCr + errore.Message, vbCritical, "Errore!")
Finally
connessione.Close()
connessione.Dispose()
RichFlag = False 'le flags vengono reimpostate su False in caso l'operazione si ripete
ComboFlag = False
End Try
End If
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
Private Sub MostraTables()
Dim connessione As MySqlConnection = New MySqlConnection(Str_Co)
connessione.Open()
'per mostrare le tabelle nella combobox, la query mysql è semplicemente questa
cmd.CommandText = "SHOW TABLES"
cmd.Connection = connessione
Try
'le prossime linee di codice ve le spiego dopo
Dim DataReader As MySqlDataReader = cmd.ExecuteReader
While DataReader.Read() 'si apre un ciclo
ComboBox1.Items.Add(DataReader(0))
End While 'finisce il ciclo
DataReader.Close()
Catch ex As Exception
MessageBox.Show(ex.Message & Environment.NewLine & ex.StackTrace)
Finally
connessione.Close()
connessione.Dispose()
End Try
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
Private Sub Combobox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles ComboBox1.SelectedIndexChanged
'settando la ComboFlag = True, la classe "connessione" eseguirà solamente il contenuto del primo If
ComboFlag = True
connessione()
ToolStripStatusLabel2.Text = TimeOfDay & " - Tabella " & ComboBox1.SelectedItem & " selezionata."
End Sub
Se invece vogliamo che il bottone "Invia" esegua una query inserita nella RichTextBox, allora:
VBNET Programming
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button2.Click
'settando RichFlag = True, la classe "connessione" eseguirà solamente il contenuto del secondo If
RichFlag = True
connessione()
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
Private Sub btnAggiorna_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles btnAggiorna.Click
ComboBox1.Items.Clear()
MostraTables()
ToolStripStatusLabel2.Text = TimeOfDay & " - Tabelle aggiornate."
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!
[Per vedere i link devi REGISTRARTI.]
[Per vedere i link devi REGISTRARTI.]
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.
Database.zip (Dimensione: 2.81 MB / Download: 26)
Devo dire che una volta completato, mi sono sentito molto soddisfatto!
E spero che vi piacerà anche a voi!