adszone.org
venerdì 20 settembre 2024
"Il modo corretto di pensare il software"
home
consulenza  vb.net  contatti 
  Visual Basic .NET
  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