.Net utilizzo del database SqLite in Windows Application

Articolo introduttivo che fornisce le basi per iniziare a muoversi con il database Sqlite con Entity Framework.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

In questo articolo vedremo come utilizzare il database SqLite https://www.sqlite.org/index.html per la gestione dei dati come un normale database server.
L’utilizzo di questo database che risiede in una dll è quello di avere il vantaggio di non installare nessun software server come avviene per altri database, ma di avere in un file tutte le informazioni, permettendo in questo modo anche di realizzare semplici applicazioni, per di più Windows Application, che non richiedono ulteriori installazioni se non quelli del programma che si è realizzato.
In questo articolo, vedremo come tramite il linguaggio di programmazione C# ed in ambiente Windows Application utilizzando l’ultima versione del Framework 4.8 e l’ambiente di sviluppo Visual Studio 2019 community possiamo creare una semplice applicazioni.


Creazione del progetto

Prima di creare il progetto occorre installare sul proprio computer un componente gratuito di Visual Studio 2019 community per la gestione dei database SqLite, qui https://marketplace.visualstudio.com/items?itemName=ErikEJ.SQLServerCompactSQLiteToolbox il quale ci permette di amministrare tramite una barra il database SqLite.
Dopo averlo installato con tutti gli ambienti di sviluppo Visual Studio chiusi, e se l’installazione è andata a buon fine, apriamo il nostro ambiente di sviluppo.
Dopo aver selezionato il linguaggio di programmazione C#, selezioniamo come progetto App Windows Forms (.Net Framework) presente in Windows e desktop, a questo punto facciamo click sul pulsante “Avanti”.
Facciamo click sul pulsante “Avanti” e nella finestra che viene aperta impostiamo il nome del progetto.


Creazione del database


Appena aperta la form, iniziamo con il creare il database. Dalla voce di menu Strumenti, facciamo click sulla voce “SqLite/Sql Server Compatct Toolbox” (figura 1) in modo che viene aggiunta la possibilità di creare e gestire una fonte dati con questo database.
 

Figura 1 – La voce di menu per visualizzare la barra

Per saper se abbiamo installato Entity Framework per questo database, dobbiamo fare click sul pulsante informazioni e vedere se nella finestra che viene aperta (figura 2) viene visualizzato la voce “


Figura 2 – La finestra delle informazioni per la gestione dei database

Se la finestra è come quella di sopra, non abbiamo installato correttamente il pacchetto di Sqlite.
Nel momento in cui scriviamo, il pacchetto da installare è il seguente “sqlite-netFx46-setup-bundle-x86-2015-1.0.112.0.exe (17.24 MiB)” dal titolo “Setups for 32-bit Windows (.NET Framework 4.6)” e nell’installazione dobbiamo indicare di installare nella GAC. Se invece l’installazione è andata a buon fine, avremo la barra degli strumenti come la seguente, con la voce SQlite EF6 DBprovider in GAC impostata a yes, come nella figura di seguito (figura 3).

Figura 3 – La corretta installazione di entity framework


Nella barra che viene visualizzata, facciamo click con il tasto destro sopra alla voce “Data Connection” e nel menu che viene visualizzato selezioniamo la voce “Add SqLite connection…” (Figura 4).

Figura 4 – Il menu per la creazione dei database SqLite e Sql Server Compact

Nella finestra che viene aperta (figura 5) , ci permette di creare il database tramite il pulsante “Create”.

Figura 5 – la creazione del database


Facciamo click sul pulsante “Create” ed assegniamo un nome al database, nel nostro caso è stato impostato “Dati”. Facciamo click sul pulsante “Close” e vedremo aggiornarsi la barra con il nome del database appena creato.
Nella cartella “Tables” facciamo click con il tasto destro e selezioniamo la voce “Build Table (beta)” in modo che visualizza una finestra (figura 4) con la quale possiamo creare una tabella.

Figura 6 – La creazione della tabella


Quando si apre la finestra, darà una riga con un valore predefinito, che è il campo chiave contatore.
Nella casella “Name” assegniamo un nome in questo caso abbiamo impostato il valore “Anagrafica” inoltre sono stati aggiunti due campi, che sono le tabelle, di tipo testo e lunghezza 10. Uno riguarda il nome e l’altro il cognome.
A questo punto facciamo click sul pulsante “Script!”  verrà visualizzata una finestra (figura 7) con lo script per la creazione della tabella.

Figura 7 – Lo script per la generazione della tabella

Tramite il pulsante della freccia verde verso destra, andremo ad eseguire lo script e quindi generare la tabella.

Dopo aver eseguito lo script verrà creata la tabella come riportato in figura 8.

Figura 8 – La tabella creata

Ora tramite Nuget aggiungiamo la possibilità di utilizzare la gestione dei dati tramite Entity Framework per Sqlite. Nella finestra Esplora soluzioni, facciamo click con il tasto destro sul nome del progetto e poi dal menu selezioniamo “Gestisci Pacchetti Nuget…” , nella finestra che viene aperta, inseriamo nella casella sotto la voce “Sfoglia” il valore “System.Data.SQLite.EF” che sarebbe il componente per la gestione del database SqLite tramite Entity Framework (figura 9).

Figura 9 -Il pacchetto per gestire SqlIte tramite Entity Framework

Si consiglia di installare il pacchetto tramite riga di comanda dalla console di Nuget, scrivendo la seguente istruzione.

Install-Package System.Data.SQLite


Dopo aver aggiunti al progetto, iniziamo ad aggiungere al nostro progetto il model di Entity Framework per il database SQlite che abbiamo appena creato con la relativa tabella.
Dalla finestra di esplora soluzione, facciamo click con il tasto destro sul nome del progetto e dal menu che viene visualizzato, selezioniamo la voce “Aggiungi” e poi “nuovo Elemento”, nella finestra che viene aperta, selezioniamo la categoria “Dati” e poi “Ado.Net Entity Data Model” assegniamo un nome se vogliamo e nella finestra successiva selezioniamo la voce “Entity Framework Designer da database”, in modo che crea il tutto partendo da un database.
Facciamo click sul pulsante avanti, e nella finestra che viene visualizza, impostiamo una connessione al database precedente creato, di norma dovrebbe già visualizzare tale connessione.
A questo punto procediamo facendo click sul pulsante “Avanti” in modo che si passa alla finestra per la selezione degli oggetti da database.
Può capitare in questo caso, di visualizzare un messaggio di errore, come quello qui di seguito.

Figura 10 - il messaggio di errore

In questo caso, occorre togliere i riferimenti delle dll “System.Data.SQLite”, “System.Data.SQLite.EF6”, “System.Data.SQLite.Linq” ed aggiungere quelle che abbiamo installato in precedenza con il pacchetto di installazione, che abbiamo scaricato dal seguente sito https://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki .
I file potrebbero trovarsi nella cartella C:\Program Files (x86)\System.Data.SQLite\2015\bin
Compiliamo il progetto e ripetiamo i passi per aggiungere il modello di Entity Framework, che abbiamo illustrato poco fa.
Vedremo che questa volta sarà visibile la tabella, come riportato in figura 11.

Figura 11 – La selezione delle varie tabelle

Facciamo click sul pulsante “Fine” in modo da creare il modello di Entity Framework nel progetto con la tabella selezionata, compiliamo il tutto in modo che siamo sicuri  che non ci sono problemi.


Stesura del codice


Ora che abbiamo creata la parte architetturale del progetto, con il database, le tabelle e l’aggiunta di Entity Framework non ci resta da scrivere il codice per utilizzare nel nostro applicativo.
Facciamo doppio click sulla form, in modo da passare in modalità visualizzazione codice, ed in particolare nell’evento load della form.
In questo evento dovremmo scrivere il codice riguardante il caricamento dei dati, tramite linq to entity.
Qui di seguito un esempio di codice che effettua la selezione dei record nella tabella Anagrafica e visualizza a video tramite Messagebox il risultato.

C#
private void Form1_Load(object sender, EventArgs e)
{
mainEntities entita = new mainEntities();
var risultato = (from Dati in entita.Anagrafica select Dati).ToList();
foreach (var elementoTrovato in risultato)
{
MessageBox.Show("ID: " + elementoTrovato.Id + " Nome: " + elementoTrovato.Nome + " Cognome: " + elementoTrovato.Cognome);
}
}

Se viene eseguito il codice, può verificarsi un errore con i riferimenti di Entity Framework, visualizzando un messaggio di errore di tipo “System.NotSupportedException: 'Unable to determine the provider name for provider factory of type 'System.Data.SQLite.SQLiteFactory'. Make sure that the ADO.NET provider is installed or registered in the application config.'
“ come mostrato in figura 12

Figura 12 – L’eccezione che viene sollevata durante la select


Per risolvere questo problema, dobbiamo intervenire nel file app.config, in particolare “providers” dove andranno aggiunti altri tag e nella sezione “DbProviderFactories” .
Nel providers avremo un codice simile a questo:

<entityFramework>
<providers>
<provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
</providers>
</entityFramework>

Che diventa

<entityFramework>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>
<provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6"/>
</providers>
</entityFramework>

Con l’aggiunta di due tag .
Mentre per “DbProviderFactories” avremo questo

<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite.EF6" />
<add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
<remove invariant="System.Data.SQLite" />
</DbProviderFactories>
</system.data>


Che diventa


<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite.EF6"/>
<add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6"
description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6"/>
<remove invariant="System.Data.SQLite"/>
<add name="SQLite Data Provider" invariant="System.Data.SQLite"
description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite"/>
</DbProviderFactories>
</system.data>

Con l’aggiunta di altri tag. Ora se compiliamo ed avviamo il tutto, il programma funzionerà.

Conclusioni

In questo articolo si è visto come utilizzare Entity Framework con il database SQlite, un database di piccole dimensioni che non richiede installazioni particolari di software e quindi facilità il deploy di applicazioni, questo perchè è tutto in una semplice dll.
Si è visto come anche durante lo sviluppo possono sorgere delle problematiche e quali le possibili soluzioni.
Un articolo introduttivo che permette di affrontare lo sviluppo di applicazioni gestionali con SQlite in maniera agevolata con le tante problematiche di compatibilità che si possono verificare.