VB 2005/2008: connessione a database con ADO.NET 2.0

Questo articolo è stato integrato con un secondo articolo: vedi link alla fine dell’articolo! 

Premessa
Questo articolo tratta un argomento fondamentale per la gestione dei dati: la connessione ai database.
Dapprima si proverà, in modo molto empirico e molto poco teorico, a creare, aprire e chiudere una connessione a un database. Saranno utilizzati un database Access e un database SQL Server per fornire delle linee guida adatte a entrambi i casi.
In seguito, verrà esposto un modo migliore per memorizzare la stringa di connessione. Verrà fatto qualche nuovo suggerimento e si considererà l’esigenza di svincolare il codice dalla stringa di connessione.
In questo articolo non si farà alcun uso effettivo delle connessioni: l’obiettivo è solamente quello di svelare un modo semplice per creare una connessione ai due DBMS Microsoft in commercio (Access e SQL Server).

ConnectionString
Prima di tutto è necessario avere a disposizione due database di prova per creare la stringa di connessione (ConnectionString) corretta.
Cos’è la “stringa di connessione”? E’ una stringa che raccoglie tutti i parametri necessari alla impostazione di una connessione, definiti dalla coppia “nome parametro”=”valore parametro”.
Nel seguito del presente articolo si potrà vedere un esempio concreto.
La procedura per creare una stringa di connessione a un database Access è la seguente:

  1. si crei un database Access vuoto di nome “DBprova.mdb” nella cartella C:\VB2005\ (una cartella di prova). All’interno di tale database potranno essere create una o più tabelle, ma in questo momento non è molto importante;
  2. in un’area vuota del desktop o in una cartella, fare clic con il tasto destro del mouse, scegliere “Nuovo” e poi “Documento di testo“. Verrà creato un file di nome “Nuovo documento di testo.txt“;
  3. rinominare il file assegnandogli il nome, per esempio, “DBprova.udl“. Non è necessario comunque utilizzare lo stesso nome del database: anche il nome “pippo.udl” va benissimo;
  4. con un doppio clic su tale file, verrà aperta una finestra di dialogo per l’impostazione della connessione. La finestra mostrerà automaticamente la scheda “Connessione“;
  5. spostarsi prima di tutto nella scheda “Provider” e scegliere la voce “Microsoft Jet 4.0 OLE DB Provider“;
  6. fare click sul pulsante “Avanti“; questo attiverà la scheda “Connessione“, nella quale bisognerà scegliere il database DBprova.mdb creato in precedenza;
  7. inserire il nome utente “Admin“, disattivare la casella di spunta “Nessuna password” e poi fare click sul pulsante “Verifica connessione“, per testare la connessione appena creata. Se tutto si è svolto correttamente, comparirà un messaggio “Verifica connessione effettuata“, altrimenti comparirà un messaggio di errore “Verifica connessione non riuscita” e altri elementi utili, come il percorso e il nome del file;
  8. confermare facendo click sul pulsante “OK“.

Ora che si dispone di un file .UDL, che a dispetto della sua estensione è un normale file di testo, si può procedere alternativamente come segue:

  • rinominare il file “DBprova.udl” in “DBprova.txt” e fare doppio click sull’icona del file;
  • fare click con il tasto destro del mouse sul nome “DBprova.udl” e scegliere “Apri con…“, selezionando poi il programma Notepad per aprire il file.

Il contenuto del file sarà pressappoco il seguente (potrà variare in qualche dettaglio, a seconda del nome e della posizione del database Access):

[oledb] ; Everything after this line is an OLE DB initstring 
Provider=Microsoft.Jet.OLEDB.4.0; 
Data Source=C:\VB2005\DBprova.mdb; 
Persist Security Info=False

I parametri, indicati secondo lo schema “chiave=valore”, sono i seguenti:

Provider=Microsoft.Jet.OLEDB.4.0 
Data Source=C:\VB2005\DBprova.mdb 
Persist Security Info=False

A questo punto il file DBprova.udl non è più necessario e può essere archiviato o cancellato. Ovviamente sarà necessario tenere nota di quanto indicato sopra per continuare l’esercizio.

Per ottenere una stringa di connessione per un database SQL Server si dovrà invece procedere come segue:

  1. creare un database SQL Server, indicando il nome “SQLprova” e una posizione per i file rispettivamente per i dati e per il log;
  2. procedere come ai punti 2, 3 e 4 dell’esempio precedente, creando (ad es.) il file “SQLprova.udl”;
  3. spostarsi nella scheda “Provider” e scegliere la voce “Microsoft OLE DB Provider for SQL Server”;
  4. fare click sul pulsante “Avanti”; questo attiverà la scheda “Connessione”, nella quale bisognerà indicare il server o il nome del PC sul quale è installato SQL Server;
  5. attivare la voce “utilizza password e nome utente specifici” e inserire le credenziali per l’accesso (utente/password), attivare la casella di spunta “consenti salvataggio password” (fortemente sconsigliato: qui viene fatto solo per verificare cosa viene inserito nel file .UDL) e selezionare il database al quale si desidera effettuare la connessione;
  6. fare click sul pulsante “Verifica connessione”, per testare la connessione appena creata. Come nell’esempio precedente, tutto si sarà svolto correttamente se comparirà un messaggio “Verifica connessione effettuata”;
  7. confermare facendo click sul pulsante “OK”.

Aprendo il file SQLprova.udl si troverà la seguente stringa di connessione:

[oledb]; Everything after this line is an OLE DB initstring 
Provider=SQLOLEDB.1; 
Password=miapassword; 
Persist Security Info=True; 
User ID=sa; 
Initial Catalog=SQLprova; 
Data Source=PC01

In questo caso i parametri sono i seguenti:

Provider=SQLOLEDB.1Password=miapassword 
Persist Security Info=True 
User ID=sa 
Initial Catalog=SQLprova 
Data Source=PC01

Ecco quindi il motivo per cui il salvataggio della password è fortemente sconsigliato: il file di testo contiene la password in chiaro e quindi perfettamente leggibile anche per chi non dovrebbe conoscerla.
Premesso che, per motivi di sicurezza, la password deve essere sempre richiesta all’utente tramite una form, si procederà in questo esempio senza applicare questa cautela solo per comodità espositiva.

Il progetto di esempio
A questo punto è possibile creare un progetto di esempio in Visual Basic 2005.
Sarà mostrato un programma molto semplice che mostrerà una form contenente tre pulsanti: uno per attivare una connessione al database Access, uno per la connessione al database SQL Server e uno per chiudere entrambe le connessioni.
Creare un nuovo progetto e inserire sulla form (dal nome di default Form1) tre pulsanti da ridenominare rispettivamente ApriDBAccess, ApriDBSQL e ChiudiDB.

Per procedere con questo esempio c’è la necessità di inserire due oggetti: OLEDBConnection e SQLConnection. Tali oggetti non sono presenti per default nella casella degli strumenti ed è quindi necessario aggiungerli con la seguente procedura:

  1. fare click con il tasto destro del mouse sulla casella degli strumenti (non importa se lo si fa su un componente o sul nome di un gruppo di componenti) e scegliere la voce “Scegli elementi…”;
  2. dopo qualche istante comparirà una finestra con l’elenco di tutti i componenti di .NET Framework, con le caselle di spunta attivate o disattivate per ciascun componente;
  3. cercare i componenti OLEDBConnection e SQLConnection e attivare per entrambi la casella: questa azione aggiungerà tali componenti alla casella degli strumenti;
  4. chiudere la finestra di selezione e fare doppio click una volta su OLEDBConnection e una volta su SQLConnection: i due componenti saranno inseriti nell’area dei componenti “non visuali” che si trova al di sotto del Form Designer.

A questo punto, fare doppio click su uno dei pulsanti e, all’interno della classe Form1, inserire il seguente codice:

 Public Class Form1 
    Private Sub ApriDBAccess_Click(ByVal sender As System.Object, _ 
            ByVal e As System.EventArgs) Handles ApriDBAccess.Click 
      Me.OleDbConnection1.ConnectionString = _ 
            "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
            "Data Source=C:\VB2005\DBprova.mdb;" & _ 
            "Persist Security Info=False" 
      Me.OleDbConnection1.Open() 
      MessageBox.Show("Database Access aperto!") 
    End Sub 
    Private Sub ApriDBSQL_Click(ByVal sender As System.Object, _ 
            ByVal e As System.EventArgs) Handles ApriDBSQL.Click 
      Me.SqlConnection1.ConnectionString = _ 
            "Password=miapassword;" & _ 
            "Persist Security Info=False;User ID=sa;" & _ 
            "Initial Catalog=SQLprova;Data Source=PC01" 
      Me.SqlConnection1.Open() 
      MessageBox.Show("Database SQL Server aperto!") 
    End Sub 
    Private Sub ChiudiDB_Click(ByVal sender As System.Object, _ 
            ByVal e As System.EventArgs) Handles ChiudiDB.Click       
       Dim messaggio As String = ""       
       Dim flag As Integer = 0 
       If Me.SqlConnection1.State = 0 _ 
             And Me.OleDbConnection1.State = 0 Then 
          ' Me.SqlConnection1.Close()   --> istruzione ignorata 
          ' Me.OleDbConnection1.Close() --> istruzione ignorata 
          messaggio = "Nessun database da chiudere!" 
       Else 
          messaggio = "Eseguita chiusura di " 
          If Me.SqlConnection1.State = 1 Then 
             Me.SqlConnection1.Close() 
             messaggio &= "Database SQL Server" 
             flag = 1     ' --> per composizione messaggio 
          End If 
          If Me.OleDbConnection1.State = 1 Then 
             Me.OleDbConnection1.Close() 
             If flag = 1 Then 
                messaggio &= ", " 
             End If 
             messaggio &= "Database Access" 
          End If 
       End If 
       MessageBox.Show(messaggio) 
    End Sub 
 End Class

E’ importante osservare che:

  • la stringa di connessione per il database SQL Server ha perso la prima parte (parametro Provider) in quanto, ovviamente, SqlConnection è già il provider predefinito per il collegamento ad una fonte dati SQL Server e quindi il parametro Provider della ConnectionString è implicito;
  • per il collegamento al database Access, invece, il parametro Provider è necessario per definire esattamente quale provider OLEDB è necessario utilizzare per connettersi correttamente al database;
  • le variabili messaggio e flag sono semplicemente un espediente per visualizzare un messaggio di conferma comprendente anche il database o i database che sono stati chiusi. Se non è necessario un messaggio dettagliato è possibile utilizzare direttamente le due istruzioni che nell’esempio sono state “commentate” [Me.SqlConnection1.Close() e Me.OleDbConnection1.Close()] perché anche nel caso in cui non vi fosse una connessione aperta non verrebbe comunque generata alcuna eccezione.

ConnectionString 2, la vendetta
Nella prima parte dell’articolo è stato esposto il modo più semplice per generare una stringa di connessione precisa, utilizzando un file .UDL. Sebbene questo sia il modo più semplice ed efficiente, non è l’unico metodo.

Gli sviluppatori più “arditi” possono anche scrivere direttamente la stringa di connessione, anche se non avranno a disposizione la comoda interfaccia grafica, né la possibilità di testare immediatamente la connessione.

Per ottenere un elenco di “template” di stringhe di connessione per i più diffusi DBMS, è possibile visitare il sito http://www.connectionstrings.com/. L’elenco di stringhe di connessione che vi si possono trovare è veramente impressionante. Tutti i template forniti devono poi essere opportunamente adattati in base alla specificità della connessione da attivare: nome del server, del database, utente e password ecc. sono tutti parametri indispensabili che devono essere indicati correttamente, pena un mancato funzionamento della connessione.

Dove salvare la stringa di connessione?
Ad un occhio attento, il programma di esempio presentato nella prima parte ha un difetto o perlomeno una limitazione: la stringa di connessione è memorizzata direttamente nel codice. Ne consegue che è sufficiente installare il nostro programma (e relativo database, Access per esempio) in una posizione diversa da quella prevista, per far sì che non funzioni più alcunché. Basti pensare all’installazione del database sul disco D: oppure una modifica al nome del server sul quale è installato SQL Server.

Un metodo migliore è sicuramente quello di memorizzare la stringa di connessione esternamente al codice, in un “contenitore” più facilmente modificabile anche dall’esterno. Ecco quindi che in passato sono state utilizzate varie alternative: file .INI, voci nel registro di sistema o file di testo.

Con Visual Studio 2005 la posizione più naturale per salvare questo tipo di informazioni è il file di configurazione dell’applicazione, normalmente denominato app.config.
E’ possibile accedere al file di configurazione in due modi:

  • in modalità design: selezionare il menu Progetto > Proprietà di > scheda Impostazioni;
  • in esecuzione: utilizzando My.Setting (oppure la classe Settings in C#).

In questo esempio proveremo a memorizzare la proprietà ConnectionString direttamente nel file di configurazione dell’applicazione, utilizzando la finestra Proprietà.

Riprendiamo quindi l’esempio, semplificando un po’ il progetto per evidenziare meglio le peculiarità delle modifiche che saranno fatte in seguito: nella figura si può vedere il form con i soli pulsanti di apertura e chiusura del database Access e, nel seguito, anche il codice sottostante, dal quale partiremo per effettuare le modifiche previste.

  Public Class Form1 
    Private Sub ApriDBAccess_Click(ByVal sender As System.Object, _ 
            ByVal e As System.EventArgs) Handles ApriDBAccess.Click 
      Me.OleDbConnection1.ConnectionString = _ 
            "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
            "Data Source=C:\VB2005\DBprova.mdb;" & _ 
            "Persist Security Info=False" 
      Me.OleDbConnection1.Open() 
      MessageBox.Show("Database Access aperto!") 
    End Sub 
    Private Sub ChiudiDB_Click(ByVal sender As System.Object, _ 
            ByVal e As System.EventArgs) Handles ChiudiDB.Click 
      If Me.OleDbConnection1.State = 0 Then 
        MessageBox.Show("Nessun database da chiudere!") 
      Else 
        Me.OleDbConnection1.Close() 
        MessageBox.Show("Eseguita chiusura di Database Access") 
      End If 
    End Sub 
  End Class

La procedura per memorizzare la ConnectionString nel file di configurazione dell’applicazione è la seguente:

  1. selezionare il controllo OleDbConnection1 presente nella barra dei componenti del Form Designer;
  2. selezionare tutta la stringa di connessione presente nel codice di cui sopra (cioè tutto quanto è contenuto tra i doppi apici, alla riga che contiene l’istruzione Me.OleDbConnection1.ConnectionString = “Provider=…”) e copiarla negli appunti con la combinazione CTRL+C;
  3. eliminare o commentare (inserendo un singolo apice all’inizio della riga) l’intera istruzione che assegna la stringa di connessione alla proprietà ConnectionString;
  4. sempre nella finestra delle proprietà, espandere la sezione ApplicationSettings, cliccare su PropertyBinding e ancora sul pulsante coi tre puntini;
  5. visualizzare l’elenco ConnectionString e cliccare su Nuova…;
  6. quando apparirà la finestra “Nuova impostazione applicazione“, inserire nella cella DevaultValue la stringa di connessione (con la combinazione CTRL+V);
  7. inserire nella cella Name il nome OleDbConnectionString e confermare con OK sia la finestra “Nuova impostazione applicazione” che la finestra “Impostazioni applicazione“;
  8. avviando l’applicazione con F5 si potrà constatare che funziona correttamente.

Il particolare più interessante di questa procedura è che il file app.config è un semplice file di testo (scritto in XML) che è possibile aprire e modificare con Notepad o altri editor similari.
Dove si trova questo file? Il file si chiama “Settings.settings” e si trova nella sottocartella “My project” della cartella principale del progetto. L’estensione “settings” non è riconosciuta da Windows e, pertanto, sarà necessario scegliere dall’elenco delle applicazioni disponibili (“Apri con...”) un editor di testo a propria scelta.
Il contenuto di Settings.settings, nel caso specifico, è il seguente (per esigenze espositive, alcune righe troppo lunghe sono mandate a capo):

<?xml version='1.0' encoding='utf-8'?> 
<SettingsFile xmlns=http://schemas.microsoft.com/VisualStudio/2004/01/settings 
   CurrentProfile="(Default)" 
   GeneratedClassNamespace="My" 
   GeneratedClassName="MySettings" 
   UseMySettingsClassName="true"> 
   <Profiles /> 
   <Settings> 
      <Setting Name="OleDbConnectionString" Type="System.String" Scope="User"> 
         <Value Profile="(Default)" 
            Provider=Microsoft.Jet.OLEDB.4.0; 
            Data Source=C:\VB2005\DBprova.mdb; 
            Persist Security Info=False 
         </Value> 
      </Setting> 
   </Settings> 
</SettingsFile>

A questo punto, se si dovesse rendere necessario modificare la stringa di connessione, lo si potrebbe fare direttamente su questo file, senza modificare il progetto e ricompilarlo.

Conclusioni
In questo articolo abbiamo illustrato un modo semplice per ottenere una stringa di connessione e una soluzione professionale per svincolare questo dato dal codice.

AGGIORNAMENTO: Articolo integrativo QUI!

Nell’articolo integrativo ho precisato meglio dove trovare il file delle impostazioni dell’applicazione (che nel progetto si chiama Settings.settings, mentre compilato si chiama “qualcosa di diverso”  :-) ). Inoltre, con tale articolo integrativo ho fornito anche un file compresso con il progetto di esempio scaricabile, valido anche per questo articolo.

About these ads

Pubblicato il 13 gennaio 2008, in ADO.NET con tag , , , , . Aggiungi il permalink ai segnalibri. 8 commenti.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Iscriviti

Ricevi al tuo indirizzo email tutti i nuovi post del sito.

Unisciti agli altri 844 follower

%d blogger cliccano Mi Piace per questo: