Connection, Command e DataReader
|
Domande
|
Connection, Command e DataReader
Questo articolo si propone di illustrare l'utilizzo di alcuni dei principali
oggetti ADO.NET che operano sul database, essi sono: OleDbConnection,
OleDbCommand ed OleDbDataReader. Le versioni per SQLServer hanno
un impiego analogo.
Il codice che presentiamo ha il compito di gestire un menu, su console, che
permette di eseguire operazioni base sul database Access articoli.mdb che
ora vi illustro:
Struttura tabella articoli |
Campo |
Tipo di dato |
id |
Contatore |
articoli |
Testo |
quantita |
Numerico |
La tabella "articoli" memorizzera' degli articoli da vendere e la loro quantita'.
Le operazioni disponibili nel nostro menu sono: Lista, Inserimento, Modifica e
Cancellazione.
La sezione di codice che segue, gestisce l'interfaccia utente. Non spieghero' la
gestione del menu, peraltro banale, voglio soltanto farvi notare che ho
intenzionalmente disaccoppiato la parte relativa al database da quella relativa
all'interfaccia utente. Ho ottenuto questo, incapsulando i dettagli relativi al
database, in una classe chiamata appunto Database In rosso, sono
evidenziate quelle righe di codice che coinvolgono ADO.NET.
La cosa piu' importante, qui, e' la stringa di connessione che la mia classe
ottiene con il campo pubblico sConnection. In questo caso la stringa
fornisce il nome del provider da utilizzare (Access) ed il percorso dove
reperire il database. Non credo sia buona pratica scrivere tale stringa "a
mano". Il Visual Studio .Net mette a disposizione, tramite il menu Tools
-> Connect To Database, una creazione guidata della connessione al
database, dalla quale noi potremo copiare la stringa di connessione
direttamente dalla finestra delle proprieta'.
Imports System.Data
Imports System.Data.OleDb
Module Module1
Private Sub StampaMenu()
System.Console.WriteLine()
System.Console.WriteLine("1 - Lista articoli")
System.Console.WriteLine("2 - Inserisci articolo")
System.Console.WriteLine("3 - Modifica quantita'")
System.Console.WriteLine("4 - Elimina articolo")
System.Console.WriteLine("5 - Esci")
System.Console.Write("Scegli: ")
End Sub
Sub Main()
Dim bEnd As Boolean = False
Dim op As String
Dim db As New Database()
db.sConnection = "Provider=Microsoft.Jet.OLEDB.4.0;"
db.sConnection = db.sConnection & "Data Source=..\articoli.mdb;"
While Not bEnd
StampaMenu()
op = System.Console.ReadLine()
Select Case op
Case "1"
db.ListaArticoli()
Case "2"
Dim art As String, qty As String
System.Console.Write("Articolo: ")
art = System.Console.ReadLine()
System.Console.Write("Quantita': ")
qty = System.Console.ReadLine()
db.Inserimento(art, qty)
Case "3"
Dim id As String, qty As String
System.Console.Write("indice: ")
id = System.Console.ReadLine()
System.Console.Write("Quantita': ")
qty = System.Console.ReadLine()
db.Modifica(id, qty)
Case "4"
Dim id As String
System.Console.Write("indice: ")
id = System.Console.ReadLine()
db.Eliminazione(id)
Case "5"
bEnd = True
End Select
End While
End Sub
La classe Database esporta le quattro operazioni che possiamo compiere
sul nostro Database: ListaArticoli, Inserimento, Modifica, Eliminazione.
Per comodita' abbiamo implementato i due metodi privati Open, Close per
automatizzare delle operazioni comuni.
L'oggetto OleDbConnection si occupa della connessione al database. Esso
riceve la stringa di connessione di cui abbiamo parlato e con il suo metodo Open
apre la connessione. Il suo metodo Close chiude la connessione, mentre Dispose
ne libera le risorse dalla memoria.
Class Database
Public sConnection As String
Private objConn As OleDb.OleDbConnection
Sub New()
sConnection = ""
objConn = Nothing
End Sub
Private Sub Open()
Try
objConn = New OleDbConnection(sConnection)
objConn.Open()
Catch e As Exception
System.Console.WriteLine(e.Message)
End Try
End Sub
Private Sub Close()
objConn.Close()
objConn.Dispose()
objConn = Nothing
End Sub
Quando vogliamio reperire dei dati tramite ADO.NET, dobbiamo creare un oggetto OleDbCommand
per impostare la Query da eseguire, e creare un riferimento ad un
oggetto OleDbDataReader per sfogliare i dati ottenuti. Dico
sfogliare perche' il DataReader puo' fare soltanto cio', e' veloce, ma ha
capacita' limitate.
All' OleDbCommand passiamo la query da eseguire e l'oggetto connection
con il quale fare riferimento al database. Per eseguire effettivamente la
query, utilizziamo il metodo ExecuteReader che restituisce un oggetto
DataReader.
Per scandire l'OleDbDataReader impieghiamo il metodo Read che
restituisce False quando siamo arrivati alla fine dei record
disponibili. Inoltre reperiamo i campi del record attuale, sul quale la Read si
e' posizionata, con i vari metodi GetXXX, dove XXX sta per "String",
"Int32" etc, a seconda del tipo di dato contenuto nel campo d'interesse. La
posizione del campo e' specificata dal parametro, che ne rappresenta la
posizione.
Public Sub ListaArticoli()
Try
Open()
Dim objCmd As OleDbCommand
Dim objReader As OleDbDataReader
Dim sQuery As String
sQuery = "Select id, articoli, quantita from articoli"
objCmd = New OleDbCommand(sQuery, objConn)
objReader = objCmd.ExecuteReader()
System.Console.WriteLine()
While objReader.Read()
System.Console.WriteLine(" {0, 3} {1, -10} {2, 4}", _
objReader.GetInt32(0), _
objReader.GetString(1), _
objReader.GetInt32(2))
End While
objReader.Close()
objReader = Nothing
objCmd.Dispose()
objCmd = Nothing
Catch e As Exception
System.Console.WriteLine(e.Message)
End Try
Close()
End Sub
Segue il codice degli altri metodi. Questi metodi compiono delle modifiche
al database e non reperiscono dati, quindi ci limitiamo ad impiegare
esclusivamente l'oggetto Command. I tre metodi sono sostanzialmente simili,
quello che varia e' soltanto la query (evidenziata in blu).
Notate che nella query abbiamo utilizzato dei punti interrogativi come
fermaposto per i valori. Si dice che abbiamo parametrizzato la
query. Con OleDb, i fermaposto possono essere soltanto dei punti
interrogativi e non delle etichette.
L'oggetto OleDbCommand ha una collection per la gestione dei parametri,
essa corrisponde alla proprieta' Parameters. Il suo metodo Add
aggiunge un parametro alla collection. La corrispondenza dei parametri con
la posizione dei punti esclamativi si ha in base all'ordine di aggiunta.
Il valore del parametro si imposta con la proprieta' Value.
Quando tutto e' pronto possiamo eseguire il comando. Essendo un comando che
non restituisce dati, lo eseguiamo con il metodo ExecuteNonQuery.
Public Sub Inserimento(ByVal art As String, ByVal qty As String)
Try
Open()
Dim objCmd As OleDbCommand
Dim sQuery As String
Dim objParam As OleDbParameter
sQuery = "insert into articoli (articoli, quantita) values (?, ?)"
objCmd = New OleDbCommand(sQuery, objConn)
objParam = objCmd.Parameters.Add("@articoli", OleDbType.Char)
objParam.Value = art
objParam = objCmd.Parameters.Add("@quantita", OleDbType.Numeric)
objParam.Value = qty
objCmd.ExecuteNonQuery()
objCmd.Dispose()
objCmd = Nothing
Catch e As Exception
System.Console.WriteLine(e.Message)
End Try
Close()
End Sub
Public Sub Eliminazione(ByVal id As Int32)
Try
Open()
Dim objCmd As OleDbCommand
Dim sQuery As String = "delete from articoli where id = ?"
Dim objParam As OleDbParameter
objCmd = New OleDbCommand(sQuery, objConn)
objParam = objCmd.Parameters.Add("@id", OleDbType.Numeric)
objParam.Value = id
objCmd.ExecuteNonQuery()
objCmd.Dispose()
objCmd = Nothing
Catch e As Exception
System.Console.WriteLine(e.Message)
End Try
Close()
End Sub
Public Sub Modifica(ByVal id As Int32, ByVal qty As String)
Try
Open()
Dim objCmd As OleDbCommand
Dim sQuery As String
Dim objParam As OleDbParameter
sQuery = "update articoli set quantita = ? where id = ?"
objCmd = New OleDbCommand(sQuery, objConn)
objParam = objCmd.Parameters.Add("@quantita", OleDbType.Numeric)
objParam.Value = qty
objParam = objCmd.Parameters.Add("@id", OleDbType.Numeric)
objParam.Value = id
objCmd.ExecuteNonQuery()
objCmd.Dispose()
objCmd = Nothing
Catch e As Exception
System.Console.WriteLine(e.Message)
End Try
Close()
End Sub
End Class
End Module
Ultimo aggiornamento 01/02/2004
|