vblogo

Programmare con Microsoft Visual Basic 6

Google
nel sito web
Introduzione
Form
Control
Oggetti
Input
Menu
Array
Visualizzazione stampa
Report
File
Errori
Clipboard
DDE
OLE
Database
Sql
Download
Bibliografia

 

 

DATABASE

I database sono dei file organizzati in formato tabellare dove una riga rappresenta il dato riferito ad un prodotto o ad un cliente e le colonne le informazioni presenti in una riga. In una riga anagrafica potrò avere colonne come nome, cognome, indirizzo e altri dati relativi ad un nominativo. L'insieme di righe e colonne di dati omogenei viene detto tabella; avrò pertanto la tabella dei prodotti, dei clienti e così via.

database

Nel disegno ci sono 3 tabelle chiamate Prodotti, Ordini e Clienti. Ogni tabella contiene le informazioni relative rispettivamente ai prodotti, agli ordini ed ai clienti. I dati che vengono memorizzati in ogni riga della tabella sono scritti nel rettangolo che rappresenta la tabella; così, guardando il disegno, per ogni riga prodotto le informazioni sono codice, descrizione, quantità e prezzo. Si potrebbe anche dire che un cliente, ad esempio, é quel dato definito da codice, nome e cognome, il dato cioé si identifica con le qualità, le colonne assegnate. Le definizioni date si riferiscono a database di tipo relazionale che sono i più usati. Nel disegno sopra le tabelle sono rappresentate come definizione di dati; nel disegno sottostante viene data una rappresentazione della tabella di come appare completa con i suoi dati, dando l'idea cosa vuole dire forma tabellare dei dati.

tabella PRODOTTI

schemarighe

Per rendere l'accesso alle tabelle più veloce, vengono create delle altre tabelle chiamate indici, composte con parte delle colonne della tabella dati; quando avviene la creazione di un indice, esso riordina i dati secondo i campi presenti. L'indice viene aggiornato automaticamente quando si variano i dati nella tabella dati, ma non serve codice aggiuntivo per gestirlo. Una tabella può avere uno o più indici o anche nessuno. Di solito si usa mettere nell'indice quelle colonne della tabella che identificano in maniera univoca una riga: nel caso della tabella Clienti e di Prodotti, é il codice. Ciò significa che se ricerco un dato in queste tabelle per codice, sono sicuro di trovare una sola riga o record cui appartiene. Questa particolare colonna o insieme di colonne viene detta chiave univoca o Unique Key ed é la candidata migliore per entrare a far parte di un indice. E' una buona regola avere sempre per ogni tabella una chiaveunivoca.

SQL

Esiste un linguaggio riconosciuto ormai come standard che permette di gestire un database con facilità ,sollevando lo sviluppatore dai problemi di gestione dei dati. SQL é la sigla che sta per Structure Query Language ed è un linguaggio creato parecchi anni or sono, che usa una sintassi English-like per compiere ricerche, inserimenti, variazioni e cancellazioni nei database. Ogni casa produttrice di database ha un suo Sql che però ha sempre come base, delle istruzioni in comune con altri database; pertanto é possibile che una ricerca in una tabella funzioni anche in database diversi da quello per cui era stata creata. Visual Basic usa Sql per accedere ai database ma dispone anche di altri strumenti che semplificano un po' le cose; occorre però conoscere qualcosa di sql se si vogliono usare i database con Visual Basic.

COME VISUAL BASIC ACCEDE AI DATABASE

E' in grado di usare svariati metodi, non solo uno come succede per altri linguaggi: anzi nel caso di ODBC é stato VB a creare uno standard per accedere ai database. Visual Basic usa 3 metodi di accesso:

  • diretto
  • usando Isam Driver
  • Odbc

Il metodo diretto é applicabile solo con Microsoft Access usando delle istruzioni appropriate; in pratica Visual Basic ha nel suo set di istruzioni anche quelle per accedere direttamente ad Access, senza usare degli intermediari come negli altri 2 metodi. Non é necessario avere il pacchetto Access.

 

Ecco uno schema semplificato di come VB accede ai database.

data control

 

I driver Isam sono delle funzioni che permettono a Visual Basic di accedere a database creati per funzionare in ambienti pc, quindi semplici da usare e di facile manutenzione come ad esempio Btrieve, dBase, Paradox, ecc.Ogni database ha bisogno del suo driver per dialogare con VB e per accedere ai dati bisogna utilizzare i comandi tipici del database scelto, che non sempre utilizzano SQL.

ODBC é la sigla che sta per Open Database Connectivity ed é una libreria di funzioni che fa da tramite tra Visual Basic ed un qualsiasi database che abbia i suoi driver ODBC. Con questo metodo si possono accedere ai database più potenti esistenti sul mercato ed in grado di funzionare su macchine differenti. ODBC viene usato generalmente per connettersi a database che risiedono in macchine collegate in rete locale, i cosiddetti server database ed in grado di gestire centinaia di utenti contemporaneamente: con questo metodo si é in grado di creare applicazioni in grado di funzionare in ambienti client-server.Non é necessario scegliere solo uno di questi metodi ma posso usarli tutti e 3 ad anche più di una volta, posso cioé collegarmi contemporaneamente con uno qualsiasi dei database e scambiare dati tra loro.

IL DATA CONTROL

Finora abbiamo visto i metodi usati da Visual Basic per accedere ai database. Per accedere però da programma ai dati, dobbiamo entrare più in dettaglio per vedere quali strumenti VB adopera. Il primo fra tutti é il Data Control: ecco sotto un'immagine di come si presenta

form controlVa inserito nel form come un normale control e come tale ha proprietà e metodi, alcune delle quali ad hoc per i database; vediamo quali sono quelle che sono maggiormente coinvolte per l'accesso dei dati. Useremo negli esempi Access. Vediamo allora come connetterci con Access: prima di tutto bisogna indicare al data control, che chiameremo Data1, quale database utilizzare, usando la proprietà DatabaseName. Esempio: collegamento con PROVA.MDB

data1.DatabaseName = "c:\db\prova.mdb"

Nella proprietà Recordsource inserirò o il nome della tabella a cui voglio accdere o un'istruzione Sql. Esempio: accesso alla tabella clienti.

data1.recordSource = "clienti"

Usando Sql dovrò scrivere:

data1.recordSource = "Select * From clienti"

oppure

data1.recordSource = "Select codice, nome From clienti"

Il primo esempio é un modo diverso per accedere alla tabella Clienti, il secondo mi restituisce codice e nome di tutti i clienti.Per visualizzare i dati della tabella posso utilizzare un form come questo.

current row

Ci sono 3 textbox con i relativi nomi: ad ogni textbox devo associare la colonna corrispondente della tabella clienti, a txtCodice cioé devo associare la colonna codice di clienti e così per le altre colonne della tabella. Per farlo uso 2 proprietà di textbox, presenti anche in altri control che sono datasource e datafield.In Datasource devo inserire il nome del data control che uso per accedere ad Access e quindi scriverò:

textCodice.datasource = Data1
textNome.datasource = Data1
textCognome.datasource = Data1

In dataField scriverò il nome della colonna corrispondente.

textCodice.datafield = 'codice'
textNome.datafield = 'nome'
textCognome.datafield = 'cognome'

Ora tutto é pronto per eseguire l'applicazione. Notare che le istruzioni inserite sono valori per le proprietà e quindi possono essere fatte in design time, significa cioé che senza scrivere un'istruzione con Visual Basic si é in grado di creare un'applicazione in grado di interagire con un database. Naturalmente le assegnazioni possono essere fatte anche a run-time. Con i cursori di data1 posso scorrere tutte le righe della tabella mentre nelle 3 textbox, i dati cambieranno automaticamente come ci si sposta: ogni variazione fatta, per esempio modificando il nome in textNome, verrà aggiornata nella tabella; questo però vale solamente se data1.recordSource = "clienti" ovvero se accedo alla tabella senza Sql.

Vediamo ora come é possibile implementare questa applicazione aggiungendo delle funzionalià come l'inserimento di una nuova riga, la cancellazione, l'aggiornamento e la ricerca. Ma prima di procedere bisogna introdurre 2 nuovi concetti che sono:

current row o riga corrente

dynaset

DYNASET E RECORDSET

Dal momento che data control rende disponibili le informazioni un record alla volta, deve usare un puntatore ai dati che indica quale riga é disponibile e quindi visibile nel form: current Row é questo puntatore. Il Dynaset é invece l'insieme di tutte le righe che data control ha trovato nella tabella, consultabile come se fosse un array tramite il recordset, un altra proprietà del data control. Con recordset é possibile scorrere in avanti ed indietro il dynaset, i dati cioé che ho estratto; posso andare nel primo o nell'ultimo record come posso inserire, cancellare, fare ricerche o variare i dati. Tutto quello che serve per implementare la gestione clienti.

Current Row e Dynaset

Implementazione della gestione cliente. La ricerca di un cliente avviene usando le proprietà:

data1.recordset.findFirst
data1.recordset.findLast
data1.recordset.findNext
data1.recordset.findPrevious

tipo 1

che rispettivamente ricercano il primo, l'ultimo, il successivo ed il precedente record che soddisfano la ricerca. Il codice per la ricerca é:

sub cmdCerca_click()
dim ricerca as string
ricerca = " cognome = 'Rossi' "
data1.recordset.findFirst ricerca
if data1.recordset.noMatch then
msgbox "Non ho trovato nessun cliente!"
end if
end sub

Se cmdCerca é il command per la ricerca, al suo click ricerca tutti i clienti con cognome uguale a Rossi. L'istruzione di ricerca é memorizzata nella stringa ricerca ed é praticamente una parte di Sql. L'istruzione data1.recordset.findFirst ricerca inizia la ricerca nella tabella; se non trova nulla, if data1.recordset.noMatch then, emette un messaggio con msgbox "Non ho trovato nessun cliente!"; altrimenti i dati compariranno nelle textbox. Le caso in cui non si trovi nessun cliente, succede però che si perdono i riferimenti con il record precedente; in pratica current row non punta a nessun record. Per evitare questo piccolo incoveniente, é opportuno memorizzare il record attuale in una variabile e rivisualizzarlo nel caso che nessun cliente sia stato trovato. L'istruzione che memorizza il current row é:

data1.recordSet.Bookmark

Modifichiamo pertanto il listato precedente.

sub cmdCerca_click()
dim ricerca as string
dim saveRecord as string
saveRecord = data1.recordset.Bookmark
ricerca = " cognome = 'Rossi' "
data1.recordset.findFirst ricerca
if data1.recordset.noMatch then
msgbox "Non ho trovato nessun cliente!"
data1.recordSet.bookmark = saveRecord
end if
end sub

La prima istruzione di bookmark copia il current row, i dati cioé che compaiono nel form, nella variabile saveRecord; se la ricerca é andata male, saveRecord ricopia i dati nel Bookmark.L'aggiornamento avviene usando la l'istruzione data1.recordset.Update. Il codice associato al click di cmdAggiorna é pertanto:

sub cmdAggiorna_click()
data1.recordset.Update
end sub

La differenza con l'aggiornamento presentato all'inizio consiste che in precedenza per aggiornare il record bisognava spostare avanti o indietro col cursore del data control, mentre qui basta premere il bottone Aggiorna.

La cancellazione avviene con data1.recordset.delete:

sub cmdCancella_click()
data1.recordset.delete
end sub

Il record cancellato però é quello del current row che dopo la cancellazione non punta a nessun record: allora bisogna fare in modo che punti ad un record esistente, come ad esempio, al record successivo. Ecco come modificare il codice.

sub cmdCancella_click()
on error resume next
data1.recordset.delete
data1.recordSet.MoveNext
if data1.recordset.EOF then
data1.recordset.MoveLast
end if
end sub

Per prima cosa con On error resume next, in caso di errore la procedure prosegue. Dopo la cancellazione cerchiamo il record successivo; se siamo alla fine della tabella, data1.recordset.EOF andiamo all'ultimo record della tabella data1.recordset.MoveLast. L'istruzione data1.recordset.EOF restituisce True se siamo a fine tabella mentre al contrario data1.recordset.BOF restituisce True quando si é all'inizio della tabella.L'inserimento di un nuovo record avviene in 2 tempi: creazione di un record vuoto ed aggiornamento dei dati, dopo averli inseriti con le textbox. L'inserimento avviene con:

data1.recordset.addnew

mentre l'aggiornamento avviene con update.

sub cmdAggiungi_click()
data1.recordset.AddNew
end sub
 
sub cmdConferma_click()
data1.recordset.Update
end sub

Per completare l' inserimento bisognerebbe gestire i command facendoli apparire o scomparire a seconda delle situazioni. Ad esempio premendo aggiungi dovrebbero sparire tutti gli altri bottoni eccetto Conferma. Quando viene aggiunto un nuovo record nel dynaset, viene collocato in fondo: questo può essere un problema se avevamo chiesto i dati in certo ordine. L'istruzione

data1.recordset.refresh

riaggiorna il dynaset e dovrebbe essere eseguito dopo ogni aggiornamento di dati.

ALTRE PROPRIETA' E METODI DI DATA CONTROL

Nell'aprire un database diverso da Access, dobbiamo dire al data control di che tipo é, come dBase, Paradox, usando la proprietà connect, che può avere i seguenti valori:

tipo 2

Esempio: assegna del database paradox:

data1.connect = "paradox;"

Le proprietà Exclusive e ReadOnly servono ad indicare, quando valgono True, che il database é in uso esclusivo, cioé un solo utente può usarlo e di sola lettura.

data1.exclusive = true
data1.readOnly = false permessa sia lettura sia la scrittura nel database

 

DataRegion

Copyright @ 2007 Vince