Connessione di un database con ADO.NET (in modalità connessa) parte I
di Aniello De Simone
L'ultimo programma nato in casa Microsoft che si occupa di interfacciarsi con fonti dati, ADO.NET, permette di lavorare con database sia in modalità connessa che in modalità disconnessa. La prima modalità consente l'interrogazione la trasformazione di dati sfruttando un accesso diretto al db. La seconda, invece, riesce a trasportare sul client la copia di una parte di uno o più db, siano essi Access, Sql Server o Oracle, contemporaneamente. L'operatore può così effettuare trasformazioni sui dati utilizzando anche proprie relazioni, quindi rispedire al mittente i dati aggiornati che andranno a posizionarsi nel db che, nel frattempo, ha continuato a risiedere sul server senza sprecare risorse.
In questo esercizio vedremo come creare una connessione ad un database Access utilizzando ADO.NET in modalità connessa e come eseguire una visualizzazione utilizzando una query parametrica. La connessione verrà creata utilizzando esclusivamente righe di codice.
Il risultato finale sarà un form come in figura 1.
Figura 1
Partiamo dall'inizio.
Dopo aver aperto il programma Visual Basic .Net e aver fatto la scelta dal menù File => Nuovo => Progetto, selezioniamo "Applicazione Windows".
Se necessario indichiamo il percorso nella parte bassa della finestra appena aperta,
Figura 2
altrimenti diamo ok e vediamo cosa accade:
Figura 3
Troviamo già inserite delle righe di codice che servono a lanciare un programma contenente una form vuota. Si può provare digitando F5.
In cima al listato inseriamo le due righe seguenti che agevoleranno la scrittura relativamente ai componenti appartenenti alle due classi. Richiamando infatti un componente interno alle classi stesse, non sarà necessario scrivere tutto il percorso ma solo la parte finale.
Fatto ciò, lavorando su un database Access 2000 di nome Biblio.mdb nella directory "C:\Documents and Settings\De Simone\Documenti\Progetti di Visual Studio\ado.net\ado\", dichiariamo la variabile "ConnString" utilizzata per definire alcuni parametri utilizzati da ADO.NET. Tale stringa è stata ridotta al minimo indispensabile per poter far funzionare la connessione. Il database utilizzato è lo stesso che viene copiato sul disco in fase d'istallazione di Visual Studio .NET o di Vb.NET
'Percorso del DataBase (Biblio.mdb)
Dim PercorsoDB As String = "...."
'Stringa di Connessione
Dim ConnString As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & PercorsoDB
Successivamente dichiariamo, istanziamo e passiamo un argomanto ad una nuova connessione indicando come argomento la relativa stringa di connessione appena formata.
Dim Cn As New OleDbConnection(ConnString)
All'apertura della sub denominato Form1_Load, il programma provvede a controllare se per qualche motivo la connessione è già attiva, nel qual caso viene subito chiusa.
If Cn.State = ConnectionState.Open Then Cn.Close()
In risposta all'evento click del button ApriChiudi possiamo aprire o chiudere la connessione denominata cn e, con il codiceseguente controlliamo e riceviamo un messaggio dell'avvenuta operazione. Una peculiarità di ADO.NET è la possibilità di chiamare il metodo open su di una connessione già aperta senza che si verifichi nessun errore, consentendo maggiore flessibilità.
If ApriChiudi.Text = "&Connetti" Then
Cn.Open()
ApriChiudi.Text = "&Disconnetti"
Else
ApriChiudi.Text = "&Connetti"
Cn.Close()
End If
If (cn.State) = ConnectionState.Open Then
MessageBox.Show("Il db adesso è connesso", _
"Attenzione", MessageBoxButtons.OK, _
MessageBoxIcon.Information)
Else
MessageBox.Show("Il db adesso è disconnesso", _
"Attenzione", MessageBoxButtons.OK, _
MessageBoxIcon.Information)
End If
Il Button Esci, se premuto, si preoccupa di chiudere la connessione e uscire dal programma. Esso è stato anche inserito nella proprietà CancelButton del Form1, così da risultare il tasto predefinito del form alla pressione del tasto ESC della tastiera.
Cn.Close()
End
Il tasto trova ha la fuzione di recepire il numero digitato dall'utente nella textbox "Trova", e utilizzarlo come valore da inserire nella query parametrica che si occuperà di effettuare la select nella tabella Authors.
Il primo passaggio dichiara la variabile testotxt e la riempie con il contenuto della casella di testo, poi pulisce l'altra casella txtOut, dove verrà visualizzto in seguito il risultato della query, pulisce la casella txtTrova e vi posiziona il cursore dopo aver effettuato una ricerca.
Dim testoTxt As String = txtTrova.Text
txtOut.Text = ""
txtTrova.Text = ""
txtTrova.Focus()
Entriamo ora nella parte finale del programma effettuando le operazioni seguenti: dapprima controlliamo che la connessione sia aperta,
If Cn.State = ConnectionState.Open Then
nel qual caso dichiariamo una variabile stringa e gli assegniamo un valore che è la nostra query parametrica.
Dim sql As String = "select * from authors where au_id=?"
Poi dichiariamo e istanziamo una variabile cmd e gli passiamo due argomenti: il valore della stringa e la connessione sulla quale dovrà essere effettuato il comando.
Dim cmd As New OleDbCommand(sql, cn)
In seguito scriviamo il codice per popolare la collection Parameters con due valori che sono il nome della colonna da controllare nella tabella del db e il contenuto del valore da ricercare
cmd.Parameters.Add("au_id", testoTxt)
Infine viene dichiarata una variabile istanziando un oggetto Data Reader e gli viene assegnato un metodo che permette di effettuare l'operazione di lettura del recordset
Dim dr As OleDbDataReader = cmd.ExecuteReader
Le operazioni eseguite dal programma fin'ora hanno permesso di ricavare un record (ma sarebbe potuto essereod un gruppo di record) dalla query, quindi il successivo passaggio sarà quello di andare a ricercare i valori in tale risultato, e scriverli nella textbox denominata txtOut.
Per fare ciò si utilizza il metodo Read che, partendo dalla posizione precedente il primo record trovato, esegue un movimento al record successivo ogni volta che viene invocato. Iterando questo metodo con un comando do while…loop e contemporaneamente scrivendo il risultato della proprietà item del Datareader, riusciamo a visualizzare l'Author che corrisponde al numero di ID che volevamo trovare ed il relativo ID.
Do While dr.Read()
txtOut.AppendText(dr.Item("au_id") & " - " & dr.Item("author"))
Loop
Non rispondiamo quasi mai in privato, ma cerchiamo sempre di portare qualsiasi problematica
sul ns. forum, e quindi all'attenzione di tutti, per 2 motivi principalmente :
1) Un problema messo su Internet può essere risolto da chiunque, e ognuno potrà dare un suo
anche piccolo contributo, alla fine arrivando ad una o + soluzioni, che un singolo non potrebbe dare.
2) Un Soluzione ad un problema torna utile a più persone.
Quindi per ogni tipo di dubbio potete rivolgere le vostre domande sul forum al seguente indirizzo :
http://www.simply4you.it/forum/topic.asp?TOPIC_ID=123