.Net la gestione del database Microsoft Access tramite VB.Net e C#

Terzo ed ultimo articolo sulla gestione del database Access 2016 con tecnologia .Net.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

In questa terza ed ultima parte del tutorial per la gestione dei database di Microsoft Access, vedremo come effettuare l’inserimento dei dati, la cancellazione dei record e la modifica.
Riprendendo l’articolo precedente qui https://www.iprogrammatori.it/articoli/microsoft-net-framework/art_net-la-gestione-del-database-microsoft-access-tramite-vbnet-e-c_1678.aspx il secondo, , vedremo come tramite Ado.Net ed istruzione SQL possiamo gestire i dati.
Si riprende il progetto precedente con il quale abbiamo già impostato la nostra form, con il quale verrà effettuate tutte le operazioni CRUD.

Stesura del codice


Facciamo doppio click sul pulsante “Inserisci” posto nella cornice relative alla fattura ed in modalità codice scriveremo il codice per inserire i dati nella tabella fatture.
Qui di seguito si riporta il frammento di codice per l’evento click del pulsante inserimento.

VB.Net
Private Sub BtnInserisciFattura_Click(sender As Object, e As EventArgs) Handles BtnInserisciFattura.Click
Try
If TxtNumerofattura.Text.Trim() = "" Then
MessageBox.Show("Campo Numero fattura obbligatorio.", "Informazione", MessageBoxButtons.OK, MessageBoxIcon.Information)
Return
ElseIf IsNumeric(TxtNumerofattura.Text.Trim()) = False Then
MessageBox.Show("Campo Numero fattura dev'essere numerico.", "Informazione", MessageBoxButtons.OK, MessageBoxIcon.Information)
Return
End If
Dim Sql = "INSERT INTO fatture (NumeroFattura, idclienti, DataFattura, Consegna, [Note]) VALUES  (" & TxtNumerofattura.Text & "," & cmbClienti.SelectedValue.ToString() & ",#" & DateTimePicker1.Value & "#" & ",'" & txtConsegna.Text & "','" & txtNote.Text & "')"
Using sqlConnessione As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Dati\Dati.accdb")
sqlConnessione.Open()
Using CommandSql As New OleDbCommand(Sql, sqlConnessione)
Dim inserimento As Integer = CommandSql.ExecuteNonQuery()
End Using
End Using
CaricaDati()
Catch ex As Exception
MessageBox.Show("Errore: " + ex.Message, "Gestione Errore", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
C#
private void BtnInserisciFattura_Click(object sender, EventArgs e)
{
try
{
if (TxtNumerofattura.Text.Trim() == "")
{
MessageBox.Show("Campo Numero fattura obbligatorio.", "Informazione", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
else
{
var isNumeric = int.TryParse(TxtNumerofattura.Text.Trim(), out int n);
if (isNumeric == false)
{
MessageBox.Show("Campo Numero fattura dev'essere numerico.", "Informazione", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
}
var Sql = @"INSERT INTO fatture (NumeroFattura, idclienti, DataFattura, Consegna, [Note]) VALUES  (" + TxtNumerofattura.Text + "," + cmbClienti.SelectedValue.ToString() + ",#" + DateTimePicker1.Value + "#" + ",'" + txtConsegna.Text + "','" + txtNote.Text + "')";
using (OleDbConnection sqlConnessione = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Dati\Dati.accdb"))
{
sqlConnessione.Open();
using (OleDbCommand CommandSql = new OleDbCommand(Sql, sqlConnessione))
{
int inserimento = CommandSql.ExecuteNonQuery();
}
}
CaricaDati();
}
catch (Exception ex)
{
MessageBox.Show("Errore: " + ex.Message, "Gestione Errore", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

Nell’esempio precedente vengono utilizzare le classi  Oledbconnection e oledbcommand con il quale facciamo l’inserimento dei dati. Il campo Note essendo una parola chiave di Microsoft Access va inserita tra parentesi quadrate.
Inoltre vengono svolti dei controlli sui dati, come se è valorizzato il campo numero fattura e se è di tipo numerico.
Ora non ci resta che eseguire il nostro programma e fare le prove di inserimento.
Appurato il funzionamento dell’inserimento per il pulsante delle fatture dobbiamo scrivere il codice per l’inserimento dei dati relativo alla fatture, che tramite id fattura metterà in relazione le fatture.
Qui di seguito il codice per entrambi i linguaggi per l’evento click del pulsante inserimento della sezione ordini.

VB.Net
Private Sub BtnInserisciOrdini_Click(sender As Object, e As EventArgs) Handles BtnInserisciOrdini.Click
Try
Dim Sql = "INSERT INTO Ordini (idfattura, Descrizione, Quantita, prezzo, Imponibile, IVA, TotaleFattura) VALUES  (" & cmbFattura.SelectedValue & ",'" & TxtDescrizione.Text & "'," & txtQuantita.Text & "," & txtPrezzo.Text & "," & txtImponibile.Text & "," & txtIva.Text & "," & txtTotale.Text & ")"
Using sqlConnessione As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Dati\Dati.accdb")
sqlConnessione.Open()
Using CommandSql As New OleDbCommand(Sql, sqlConnessione)
Dim inserimento As Integer = CommandSql.ExecuteNonQuery()
End Using
End Using
CaricaDati()
Catch ex As Exception
MessageBox.Show("Errore: " + ex.Message, "Gestione Errore", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
C#
private void BtnInserisciOrdini_Click(object sender, EventArgs e)
{
try
{
var Sql = "INSERT INTO Ordini (idfattura, Descrizione, Quantita, prezzo, Imponibile, IVA, TotaleFattura) VALUES  (" + cmbFattura.SelectedValue + ",'" + TxtDescrizione.Text + "'," + txtQuantita.Text + "," + txtPrezzo.Text + "," + txtImponibile.Text + "," + txtIva.Text + "," + txtTotale.Text + ")";
using (OleDbConnection sqlConnessione = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Dati\Dati.accdb"))
{
sqlConnessione.Open();
using (OleDbCommand CommandSql = new OleDbCommand(Sql, sqlConnessione))
{
int inserimento = CommandSql.ExecuteNonQuery();
}
}
CaricaDati();
}
catch (Exception ex)
{
MessageBox.Show("Errore: " + ex.Message, "Gestione Errore", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

Effettuiamo anche in questo caso l’esecuzione del programma e facciamo delle prove per verificare il corretto funzionamento.

Come si è visto dai due esempi di codice precedenti, il codice è uguale per le fasi di inserimento utilizzando le classi oledbconnection per collegarsi al database, ed un oggetto di tipo oledbcommand per eseguire le query.
Il pulsante annulla dovrà nascondere e visualizzare alcuni pulsanti. Qui di seguito il frammento di codice che il lettore troverà famigliare.

VB.Net
Private Sub BtnAnnulla_Click(sender As Object, e As EventArgs) Handles BtnAnnulla.Click
btnSalva.Visible = False
BtnAnnulla.Visible = False
BtnModifica.Visible = True
End Sub
C#
private void BtnAnnulla_Click(object sender, EventArgs e)
{
btnSalva.Visible = false;
BtnAnnulla.Visible = false;
BtnModifica.Visible = true;
}

Ora dobbiamo scrivere il codice per il pulsante “Modifica” con il quale andiamo a caricare i valori nella casella di testo del box riguardante le fatture, in questo caso i dati che verranno modificati sono solamente per il campo “Consegna” e per il campo “Note”.

VB.Net
Private Sub BtnModifica_Click(sender As Object, e As EventArgs) Handles BtnModifica.Click
If DtgDati.Rows.GetRowCount(DataGridViewElementStates.Selected) > 0 Then
'prendo id della fattura e carico i dati nella casella di testo
Dim idFattura As Integer = DtgDati.SelectedCells().Item(0).Value
TxtNumerofattura.Text = DtgDati.SelectedCells().Item(3).Value
If DtgDati.SelectedCells().Item(4).Value.ToString() <> "" Then
DateTimePicker1.Value = DtgDati.SelectedCells().Item(4).Value
End If
txtConsegna.Text = DtgDati.SelectedCells().Item(5).Value.ToString()
txtNote.Text = DtgDati.SelectedCells().Item(6).Value.ToString()
Else
MessageBox.Show("Selezionare un record.", "Informazione", MessageBoxButtons.OK, MessageBoxIcon.Information)
Return
End If
btnSalva.Visible = True
BtnAnnulla.Visible = True
BtnModifica.Visible = False
End Sub
C#
private void BtnModifica_Click(object sender, EventArgs e)
{
if (DtgDati.Rows.GetRowCount(DataGridViewElementStates.Selected) > 0)
{
// prendo id della fattura e carico i dati nella casella di testo
int idFattura = (int)DtgDati.SelectedCells[0].Value;
TxtNumerofattura.Text = DtgDati.SelectedCells[3].Value.ToString();
if (DtgDati.SelectedCells[4].Value.ToString() != "")
DateTimePicker1.Value = (DateTime)DtgDati.SelectedCells[4].Value;
txtConsegna.Text = DtgDati.SelectedCells[5].Value.ToString();
txtNote.Text = DtgDati.SelectedCells[6].Value.ToString();
}
else
{
MessageBox.Show("Selezionare un record.", "Informazione", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
btnSalva.Visible = true;
BtnAnnulla.Visible = true;
BtnModifica.Visible = false;
}

Il codice del pulsante salva, che sarà visibile solo nel momento in cui si andranno ad applicare alle casella di testo i valori selezionati nella griglia che avviene tramite il pulsante “modifica” permetterà di effettuare una modifica dei dati delle colonne “Consegna” e “Note” della tabella fattura, tramite istruzione “Update”.
Qui di seguito il frammento di codice delle suddette operazioni.

VB.Net
Private Sub btnSalva_Click(sender As Object, e As EventArgs) Handles btnSalva.Click
Try
Dim idFattura As Integer = DtgDati.SelectedCells().Item(0).Value
Dim Sql As String = "update fatture set Consegna='" & txtConsegna.Text & "', [Note]='" & txtNote.Text & "'     where id=" & idFattura
Using sqlConnessione As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Dati\Dati.accdb")
sqlConnessione.Open()
Using CommandSql As New OleDbCommand(Sql, sqlConnessione)
Dim Cancellazione As Integer = CommandSql.ExecuteNonQuery()
End Using
End Using
CaricaDati()
btnSalva.Visible = False
BtnAnnulla.Visible = False
BtnModifica.Visible = True
Catch ex As Exception
MessageBox.Show("Errore: " + ex.Message, "Gestione Errore", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
C#
private void btnSalva_Click(object sender, EventArgs e)
{
try
{
int idFattura = (int)DtgDati.SelectedCells[0].Value;
string Sql = "update fatture set Consegna='" + txtConsegna.Text + "', [Note]='" + txtNote.Text + "'     where id=" + idFattura;
using (OleDbConnection sqlConnessione = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Dati\Dati.accdb"))
{
sqlConnessione.Open();
using (OleDbCommand CommandSql = new OleDbCommand(Sql, sqlConnessione))
{
int Cancellazione = CommandSql.ExecuteNonQuery();
}
}
CaricaDati();
btnSalva.Visible = false;
BtnAnnulla.Visible = false;
BtnModifica.Visible = true;
}
catch (Exception ex)
{
MessageBox.Show("Errore: " + ex.Message, "Gestione Errore", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

Dopo tutte queste operazioni andiamo ad eseguire il nostro programma ed effettuiamo le prove di modifica, annullamento e salvataggio dei dati, in modo di verificare se  il codice scritto è corretto.

Come si è visto dal codice precedente, si fa uso dell’istruzione update per aggiornare i dati prendendo ID della fattura.
Essendo questo un articolo per fornire delucidazioni all’autore sulle operazioni CRUD, il codice Idfattura sarebbe buona norma che viene messo in memoria in una classe creata appositamente oppure in un controllo label in modo che l’utente durante la modifica non cambia id.
Anche in questo caso, le classi utilizzate sono le stesse di quelle utilizzate per l’inserimento, un oggetto di tipo “OledbConnection” un oggetto di tipo “OledbAdapter”.


Siamo giunti all’ultima fase della stesura del codice, quella della cancellazione dei record, questo avviene tramite l’istruzione “SQL” di tipo “Delete” con il quale andiamo ad eliminare il record selezionato prendendo come riferimento il campo chiave della fattura ed eliminando a sua volta tutte gli ordini che fanno parte della colonna chiave di tale tabella.
Qui di seguito si riporta il frammento di codice per entrambi i linguaggi delle suddette operazioni.

VB.Net
Private Sub BtnElimina_Click(sender As Object, e As EventArgs) Handles BtnElimina.Click
Try
If DtgDati.Rows.GetRowCount(DataGridViewElementStates.Selected) > 0 Then
'prendo id della fattura e carico i dati nella casella di testo
Dim idFattura As Integer = DtgDati.SelectedCells().Item(0).Value
If MessageBox.Show("Sei sicuro di voler eliminare la fattura selezionata numero: " & idFattura & "?", "Informazioni", MessageBoxButtons.YesNo, MessageBoxIcon.Information) = DialogResult.Yes Then
Dim Sql As String = "Delete from fatture where id=" & idFattura
Using sqlConnessione As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Dati\Dati.accdb")
sqlConnessione.Open()
Using CommandSql As New OleDbCommand(Sql, sqlConnessione)
Dim Cancellazione As Integer = CommandSql.ExecuteNonQuery()
End Using
Sql = "Delete from Ordini where idfattura = " & idFattura
Using CommandSql As New OleDbCommand(Sql, sqlConnessione)
Dim Cancellazione As Integer = CommandSql.ExecuteNonQuery()
End Using
End Using
CaricaDati()
End If
Else
MessageBox.Show("Selezionare un record.", "Informazione", MessageBoxButtons.OK, MessageBoxIcon.Information)
Return
End If
Catch ex As Exception
MessageBox.Show("Errore: " + ex.Message, "Gestione Errore", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
C#
private void BtnElimina_Click(object sender, EventArgs e)
{
try
{
if (DtgDati.Rows.GetRowCount(DataGridViewElementStates.Selected) > 0)
{
// prendo id della fattura e carico i dati nella casella di testo
int idFattura = (int) DtgDati.SelectedCells[0].Value;
if (MessageBox.Show("Sei sicuro di voler eliminare la fattura selezionata numero: " + idFattura + "?", "Informazioni", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
{
string Sql = "Delete from fatture where id=" + idFattura;
using (OleDbConnection sqlConnessione = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Dati\Dati.accdb"))
{
sqlConnessione.Open();
using (OleDbCommand CommandSql = new OleDbCommand(Sql, sqlConnessione))
{
int Cancellazione = CommandSql.ExecuteNonQuery();
}
Sql = "Delete from Ordini where idfattura = " + idFattura;
using (OleDbCommand CommandSql = new OleDbCommand(Sql, sqlConnessione))
{
int Cancellazione = CommandSql.ExecuteNonQuery();
}
}
CaricaDati();
}
}
else
{
MessageBox.Show("Selezionare un record.", "Informazione", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
}
catch (Exception ex)
{
MessageBox.Show("Errore: " + ex.Message, "Gestione Errore", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

Ora non ci resta che testare il codice appena scritto per verificare il corretto funzionamento.
Naturalmente è buona prassi prima di cancellare un record quello di visualizzare l’utente che si sta cancellando un dato e quindi se è sicuro di tale operazioni.

Conclusioni


Si conclude con questo articolo il mini tutorial riguardante l’utilizzo della base dati creata in Microsoft Access per le operazioni di CRUD ossia lettura, inserimento, modifica e cancellazione dei dati, su un progetto di tipo Windows Application. L’utilizzo del database Microsoft Access può tornare utile per programmi di poche righe di codice e con una bassa utenza, ma è consigliabile affidarsi ad un database più professionale e gratuito come Microsoft Sql Server express, una versione gratuita e ridotta del famoso server Microsoft.
Naturalmente alcuni aspetti del programma andavano affrontati in maniera diversa per via di un codice più professionale e soprattutto per una corretta gestione interfaccia utente, ma per evitare di essere dispersivo e soprattutto fornire al lettore in pochi articoli una delucidazione completa e chiara sulla semplice gestione del database si è cercato di evitare alcuni passaggi per affrontare i temi principali.