Integrare un database in un’applicazione Visual Basic Windows Forms

Introduzione

I Database sono degli archivi di dati strutturati e organizzati che memorizzano grandi quantità di informazioni, e permettono agli utenti di differenti applicazione di estrarre informazioni, manipolarle e gestire in modo semplice e intuitivo attraverso delle applicazioni DBMS con front end come ad esempio il software Microsoft Access, o mediante il linguaggio SQL mediante l’uso di DBMS da riga di comando o con delle interfacce Web Mysql, SQL Server, Oracle DBMS, ecc.

Obiettivo

In modo pratico e veloce vediamo come integrare un database access in un’applicazione Windows Forms, e di visualizzare i dati un Form personalizzato.
Avviamo l’ambiente Visual Studio, creiamo una nuova soluzione Windows Forms .NET e il software prepara la soluzione che è composta dal nostro Form. Inseriamo nel nostro Form quattro etichette, quattro caselle di testo e quattro pulsanti come mostrato in figura.

La tabella sotto ripotata indica le proprietà da cambiare in fase di progettazione della GUI.

 Tipo ControlloProprietàValore
Caselle di testo (TextBox)NameTxtcognome, txtnome, txtage, txtcodiceclasse
Bottoni (Button)NamecmdInserisci, cmdAvanti, cmdIndietro, cmdFine
BottoniTextInserisci, Avanti, Indietro, Fine

L’applicazione apre la connessione ad un Database, seleziona la tabella “Studenti”, e visualizza in automatico i dati estratti mediante una query dal Database.
I pulsanti Avanti e Indietro sposteranno i dati sul record successivo e precedente muovendo il DataTable ovvero l’oggetto che contiene i dati estratti mediante il Dataset.
Il pulsante “Fine” termina l’applicazione, il pulsante “Inserisci” (sarà presentato nel prossimo articolo) inserisci i dati nella tabella del Database.
Per realizzare la connessione al Database abbiamo inserito il file Access nella cartella principale del progetto onde evitare per ora di specificare il Path della sorgente dati.
Per accedere al Database Access usiamo la libreria Microsoft.ACE.OleDB.12.0 che deve installata attraverso il gestore dei pacchetti Nuget nella soluzione.
Per installare il pacchetto andiamo nella voce di Menù Visualizza -> Esplora Soluzione, e selezioniamo la nostra soluzione come mostrato in figura:


Esplora soluzione

Selezioniamo il nome del progetto “AppDB2” e dalla voce di Menù Progetto – Installa Pacchetto Nuget, si apre una finestra di dialogo che permette di installare i pacchetti da Internet sul repository ufficiale e installiamo il Provider “Microsoft.ACE.OlEDB.12.0” attendiamo e l’installazione integra il pacchetto alla nostra soluzione. E’ mostrato in figura la finestra di dialogo.

Fatte queste operazioni preliminari il codice da integrare è per l’evento Form_Load:

Public Class Form1
    Dim stConn As String = "Provider = Microsoft.ACE.OLEDB.12.0;Data Source=scuola.accdb"
    Dim conn As New OleDbConnection(stConn)
    Dim k As Integer = 0
    Dim dataset As New DataSet

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Try
            conn.Open()

            MessageBox.Show("Connessione al Database Risucita -)", "Avviso")
            Dim query As String = "SELECT * FROM Studente;"
            Dim ris As New OleDbDataAdapter(query, conn)
            ris.Fill(dataset, "Studente")
            Dim dt As DataTable = New DataTable("Studente")
            'Dim righe As DataRow
            'Dim colonne As DataColumn = New DataColumn

            txtmatricola.Text = dataset.Tables("Studente").Rows(0)("num_matricola").ToString
            txtcognome.Text = dataset.Tables("Studente").Rows(0)("cognome").ToString
            txtnome.Text = dataset.Tables("Studente").Rows(0)("nome").ToString
            txtcodiceclasse.Text = dataset.Tables("Studente").Rows(0)("cod_classe").ToString
        Catch ex As Exception
            MessageBox.Show("Errore nella connessioen ad Database:" & ex.Message, "Errore Attenzione")
            End
        Finally
            If (conn.State = ConnectionState.Open) Then
                conn.Close()
            End If
        End Try

    End Sub


Il codice è molto semplice definisco la stringa di connessione “stConn” che prevede due parametri il nome del Provider DBMS (che contiene le API di interfacciamento a qual particolare DBMS) e la posizione del file di database (in questo caso è nella cartella del progetto).
E’ poi definita un oggetto di tipo OleDBConnection di nome “conn” che ha come parametro la stringa di connessione definita in precedenza. E’ definito il valore k intero che indica il numero del record da selezionare nell’oggetto Tabella.
Viene gestita l’apertura della connessione con try .. catch .. finally in quanto se le connessione fallisce deve dare un errore e non terminare bruscamente il programma. Viene definito un Dataset.
Se la connessione va a buon fine nel blocco try è definita la query SQL come stringa, viene eseguta la query mediante l’oggetto OleDBAdpater che prende due parametri la connessione e la query.
La query è eseguita (abbiamo tralasciato la try .. catch in caso di errori SQL). L’oggetto “ris” viene utilizzato per popolare il dataset con etichetta pari al nome della tabella per semplicità “Studente”.
E’ definito l’oggetto di output DataTables con i dati estratti dal dataset (è necessario rispettare la sequenza di operazioni).
Nel blocco di righe:

Public Class Form1
    Dim stConn As String = "Provider = Microsoft.ACE.OLEDB.12.0;Data Source=scuola.accdb"
    Dim conn As New OleDbConnection(stConn)
    Dim k As Integer = 0
    Dim dataset As New DataSet

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Try
            conn.Open()

            MessageBox.Show("Connessione al Database Risucita -)", "Avviso")
            Dim query As String = "SELECT * FROM Studente;"
            Dim ris As New OleDbDataAdapter(query, conn)
            ris.Fill(dataset, "Studente")
            Dim dt As DataTable = New DataTable("Studente")
            'Dim righe As DataRow
            'Dim colonne As DataColumn = New DataColumn

            txtmatricola.Text = dataset.Tables("Studente").Rows(0)("num_matricola").ToString
            txtcognome.Text = dataset.Tables("Studente").Rows(0)("cognome").ToString
            txtnome.Text = dataset.Tables("Studente").Rows(0)("nome").ToString
            txtcodiceclasse.Text = dataset.Tables("Studente").Rows(0)("cod_classe").ToString
        Catch ex As Exception
            MessageBox.Show("Errore nella connessioen ad Database:" & ex.Message, "Errore Attenzione")
            End
        Finally
            If (conn.State = ConnectionState.Open) Then
                conn.Close()
            End If
        End Try

    End Sub

ad ogni casella di testo è assegnata un’istanza della tabella di riga “0” selezionando per ogni casella di testo una colonna con nome pari al campo definito nella tabella del database, convertendo il valore a string.a La casella di testo accetta come input / output solo stringhe.
La clausola “catch” avverte di eventuali eccezioni.

L’evento cmdAvanti_Click ha il seguente codice:

Private Sub cmdAvanati_Click(sender As Object, e As EventArgs) Handles cmdAvanati.Click
    k = k + 1
    If (k < dataset.Tables("Studente").Rows.Count) Then
        txtmatricola.Text = dataset.Tables("Studente").Rows(k)("num_matricola").ToString
        txtcognome.Text = dataset.Tables("Studente").Rows(k)("cognome").ToString
        txtnome.Text = dataset.Tables("Studente").Rows(k)("nome").ToString
        txtcodiceclasse.Text = dataset.Tables("Studente").Rows(k)("cod_classe").ToString
    Else
        k = dataset.Tables("Studente").Rows.Count - 1
    End If
End Sub

Il codice è identico a quello utilizzato nel evento Load del Form con la differenza di controllare il valore del numero di riga / istanza della tabella che parte da zero e arriva fino al valore Count, onde evitare la generazione di un’eccezione “out of Range” ovvero fuori dall’itnervallo.
L’evento cmdIndietro_Click si occupa di verificare che k non sia minore di zero.
Ecco il codice:

    Private Sub cmdIndietro_Click(sender As Object, e As EventArgs) Handles cmdIndietro.Click    
If k > 0 Then
        If k > dataset.Tables("Studente").Rows.Count Then
            k = dataset.Tables("Studente").Rows.Count - 1
        End If
        k = k - 1
        txtmatricola.Text = dataset.Tables("Studente").Rows(k)("num_matricola").ToString
        txtcognome.Text = dataset.Tables("Studente").Rows(k)("cognome").ToString
        txtnome.Text = dataset.Tables("Studente").Rows(k)("nome").ToString
        txtcodiceclasse.Text = dataset.Tables("Studente").Rows(k)("cod_classe").ToString
    End If
End Sub

Anche il codice per l’evento indietro è molto semplice e tiene conto del fatto che k non deve essere mai minore di zero.
Al fine di tutto il codice inseriamo “End Class”.
Il codice completo è disponibile all’indirizzo Github

Video dell’articolo