Utilizzare SQLite con VisualBasic.Net

SQLite 3 è una libreria nella quale è implementato un database engine e può essere integrata facilmente nelle nostre applicazioni. Tra gli utilizzi più comuni per un database di questo tipo, ci sono:

  • database dell’applicazione: parliamo comunque di una piccola applicazione, preferibilmente mono-utente;
  • cache persistente
  • database di parametri di configurazione o impostazioni

La libreria SQLite è utilizzata da grandi compagnie e, tra l’altro, è usata come libreria per la persistenza nelle applicazioni Android. Trai suoi vantaggi principali ci sono:

  • è open-source
  • non richiede installazione
  • supporta le transazioni
  • è una libreria di funzioni, non un processo server

D’altro canto però quando siamo di fronte ad applicazioni distribuite o per le quali è necessario un accesso da parte di più utenti in contemporanea, un DBMS come MySQL fa sicuramente più al caso nostro. Dopo questa breve introduzione, passiamo al come cominciare velocemente ad utilizzare questa libreria nelle nostre applicazioni scritte in VisualBasic .Net.

1) Per prima cosa, scarichiamo la libreria. Possiamo farlo attraverso il sito ufficiale, oppure prendiamo le librerie fatte appositamente per .NET: ADO.NET 2.0 Provider for SQLite from sourceforge.

2) Copiamo la DLL System.Data.SQLite.DLL nel progetto e aggiungiamo un riferimento alla libreria

3) Scarichiamo un client GUI per SQLite che ci permetterà di gestire il database in modo semplice e veloce. Io ho utilizzato “SQLite Administrator”

4) Attraverso la GUI creiamo il database Dopo averlo creato, avremo un file che possiamo utilizzare nel nostro progetto. Non ci resta che utilizzarlo e per farlo, ad esempio, possiamo utilizzare questo modulo, scritto da me:


Imports System.Data.SQLite

Module Database
    Public DATASOURCE_LOCATION As String = "Data Source=./dati/database.s3db"

#Region "Lettura dal database"

    Public Function GetDataTable(ByVal comando As SQLiteCommand) As DataTable
        Dim ret As New DataTable()
        Dim connessione As SQLiteConnection = Nothing
        Dim reader As SQLiteDataReader = Nothing

        Try
            connessione = New SQLiteConnection(DATASOURCE_LOCATION)
            connessione.Open()

            comando.Connection = connessione

            reader = comando.ExecuteReader()
            ret.Load(reader)

            reader.Close()
            connessione.Close()
        Catch ex As Exception
            DEBUG.LogSystemException(ex, comando.CommandText)
        Finally
            Try
                If Not reader Is Nothing Then reader.Close()
            Catch
            End Try

            Try
                If Not connessione Is Nothing Then connessione.Close()
            Catch
            End Try
        End Try

        Return ret
    End Function

    Public Function GetDataTable(ByVal sql As String) As DataTable
        Return Database.GetDataTable(New SQLiteCommand(sql))
    End Function

    Public Function ExecuteScalar(ByVal comando As SQLiteCommand) As Object
        Dim ret As Object = Nothing
        Dim connessione As SQLiteConnection = Nothing

        Try
            connessione = New SQLiteConnection(DATASOURCE_LOCATION)
            connessione.Open()

            comando.Connection = connessione

            ret = comando.ExecuteScalar()
            connessione.Close()

        Catch ex As Exception
            DEBUG.LogSystemException(ex, comando.CommandText)
        Finally
            Try
                If Not connessione Is Nothing Then connessione.Close()
            Catch
            End Try
        End Try

        Return ret
    End Function

    Public Function ExecuteScalar(ByVal sql As String) As String
        Return Database.ExecuteScalar(New SQLiteCommand(sql))
    End Function
#End Region

#Region "inserimento nel database"
    Public Function ExecuteInsertQuery(ByVal comando As SQLiteCommand) As Object
        Dim ret As Object = Nothing
        Dim connessione As SQLiteConnection = Nothing
        Dim transazione As SQLite.SQLiteTransaction = Nothing

        Try
            connessione = New SQLiteConnection(DATASOURCE_LOCATION)
            connessione.Open()

            transazione = connessione.BeginTransaction()

            comando.Connection = connessione
            comando.Transaction = transazione

            Dim rowsUpdated As Integer = comando.ExecuteNonQuery()

            If rowsUpdated <= 0 Then
                transazione.Rollback()
                connessione.Close()
            Else
                ' se questa riga dà un eccezione, viene fatto il rollback e chiusa la connessione nel catch
                ret = (New SQLite.SQLiteCommand("SELECT last_insert_rowid() AS id", connessione, transazione)).ExecuteScalar()

                transazione.Commit()
                transazione.Rollback()
            End If

        Catch ex As Exception
            DEBUG.LogSystemException(ex, comando.CommandText)
        Finally
            Try
                If Not transazione Is Nothing Then transazione.Rollback()
            Catch
            End Try
            Try
                If Not connessione Is Nothing Then connessione.Close()
            Catch
            End Try
        End Try

        Return ret

    End Function

    Public Function ExecuteInsertQuery(ByVal sql As String) As Object
        Return Database.ExecuteInsertQuery(New SQLiteCommand(sql))
    End Function

#End Region

#Region "Query di aggiornamento"
    Public Function ExecuteNonQuery(ByVal comando As SQLiteCommand) As Integer
        Dim rowsUpdated As Integer = 0
        Dim connessione As SQLiteConnection = Nothing

        Try
            connessione = New SQLiteConnection(DATASOURCE_LOCATION)
            connessione.Open()

            comando.Connection = connessione

            rowsUpdated = comando.ExecuteNonQuery()
            connessione.Close()
        Catch ex As Exception
            Try
                If Not connessione Is Nothing Then connessione.Close()
            Catch
            End Try
        End Try

        Return rowsUpdated
    End Function

    Public Function ExecuteNonQuery(ByVal sql As String) As Integer
        Return Database.ExecuteNonQuery(New SQLiteCommand(sql))
    End Function
#End Region

End Module

Download Sorgente

L’ articolo e il codice sono ispirati a quelli reperibili all’indirizzo: http://www.mikeduncan.com/sqlite-on-dotnet-in-3-mins/, a cui consiglio di dare un’occhiata per ulteriori approfondimenti.

2 Comments

  1. Principio Tudisco scrive:

    Ciao Nicola, volevo porgerLe una domanda riguardante la connessione a SqLite, è possibile effettuare una connessione SqLite in VB.Net protetta da password o criptata ?? oppure se esiste un sistema per non far leggere il contenuto del file in modalità txt ? Grazie per l’attenzione, le porgo siccome siamo sotto Natale, Buon Natale passato e un felice anno nuovo.

  2. Ciao Nicola, ti scrivo per chiederVi aiuto,
    Io uso molto sqlite in vb.net, ma non riesco a creare una connessione su un db sqlite protetto da password , per caso potresti darmi una mano, di come devo connettermi a un db sqlite protetto, con apertura e chiusura connessione ?
    Grazie per la disponobilità, in attesa di un vostro immediato riscontro , colgo l’occasione per porgerVi distinti saluti.

Lascia un commento