MSDE Istruzioni per l'uso (parte 4) - Generare una Stored Procedure su database MSDE
a cura di Sabrina Cosolo (requisiti: conoscenza minima di Access e linguaggio SQL)
<Precedente Che cos'è una Stored Procedure?
La traduzione del nome in italiano ci dà un indizio, infatti significa Procedura Memorizzata, ovvero un programma scritto in linguaggio SQL e memorizzato sul Database per poter essere utilizzato a posteriori.
A cosa serve una stored procedure? a rendere le cose molto più veloci, infatti SQL Server ha tra le sue caratteristiche di progettazione quella di "Essere ottimizzato per l'esecuzione di stored procedure"; questo significa che ci sono cose che è meglio fare eseguire a lui per rendere il lavoro ai nostri utenti più veloce.
Vi faccio un piccolo esempio: io ho realizzato per un cliente un programmino collegato al database SQL Gestionale per stampare etichette usando una stampante termica. Queste etichette vengono stampate in base ai dati degli ordini ancora inevasi, ma devono poter essere modificate al volo dall'operatore che le stampa. Perciò io ho generato una tabella etichette sul server e ho preparato 2 stored procedure per riempirla: la prima fa un "DELETE FROM" e la seconda fa un "INSERT INTO", il mio programmino usa ADO per lanciare con un adodb.Command le due procedure e l'elaborazione di 10000 righe di documento, anche se lanciata da un Pentium Ciofeca (nuovo marchio Intel), impiega qualche secondo ad essere eseguita perché il lavoro lo fa il Server non il Client, come succederebbe se facessi eseguire i corrispondenti comandi 'al volo'.E' chiaro altresì che, se il programma che io costruisco deve usare molte stored procedure che effettuano operazioni così pesanti, per di più contemporaneamente richieste da più utenti, il Server Dati deve essere dimensionato di conseguenza per avere delle prestazioni passabili.
Ed ora passiamo alla stesura di una Stored Procedure, selezioniamo la finestra Stored procedure dal menu Database e premiamo il tasto "Crea Stored Procedure..."
Otterremo qualcosa di molto triste, come vedete qui a fianco, il resto della finestra è vuoto e vedere una cosa simile sono certa potrebbe deprimere anche il programmatore più volenteroso.
Infatti non c'è alcun tool grafico per generare le stored procedure e il Template fornito da Access 2000 è molto misero.
Ma come diceva quella vecchia canzone
"Quando il gioco si fa duro, i duri iniziano a giocare..."Le stored procedure vanno scritte in SQL perciò se volete iniziare a scriverle è necessario imparare ad usare il linguaggio, io ho iniziato con un libro piuttosto ben fatto, anche perché è un testo universitario e perciò scritto in modo didattico
"Guida a SQL" di "Daniela Dorbolò e Andrea Guidi" edito da "Mc Graw Hill", che è interessante perché insegna il linguaggio SQL di base senza usare le estensioni di uno dei server più noti anche se fornisce come allegato un CD con la versione Desktop di Sybase (il papà di SQL Server).
Questo libro spiega non solo il linguaggio ma anche la teoria di base dei Database relazionali in modo abbastanza semplice e immediato anche per chi come me non ha mai amato la matematica o l'algebra degli insiemi.
Ma bando alle ciance e vediamo un po' quale potrebbe essere una Stored procedure utile nel nostro piccolo Database. Ad esempio Selezionato un CD riportarne l'interprete su tutti i brani del CD stesso se nei suddetti brani l'interprete è vuoto.
Riporto il codice dato che l'immagine non è proprio perfetta:Create Procedure "SPRiportaInterprete" ( @IDInterprete int = null , @IDCd int = null ) As begin tran UPDATE tbBrani SET [idInterprete]=@idInterprete WHERE [idCd]=@idCd and ([idInterprete] is null ) commit tran return
Per provare la Stored Procedure, ho creato una maschera sul Progetto Access con una Combo box e 2 tasti ed ho scritto dietro al Click del tasto OK il codice per chiamare la nostra Procedura. Qui a fianco la maschera, qui sotto riporto il codice VB Private Sub cmdOk_Click() Dim cn As ADODB.Connection Dim cm As ADODB.Command Dim pm As ADODB.Parameter On Error GoTo ErrTran Set cn = New ADODB.Connection Set cm = New ADODB.Command Set cn = CurrentProject.Connection cn.BeginTrans With cm Set .ActiveConnection = cn .CommandType = adCmdStoredProc Set pm = .CreateParameter("IdInterprete", adInteger, adParamInput, , cboCD.Column(1)) .Parameters.Append pm Set pm = .CreateParameter("IdCd", adInteger, adParamInput, , cboCD.Column(0)) .Parameters.Append pm .CommandText = "SPRiportaInterprete" .Execute End With cn.CommitTrans MsgBox "Interprete OK", vbInformation, "OK" cmdOk_Click_Exit: Set pm = Nothing Set cm = Nothing Set cn = Nothing Exit Sub ErrTran: cn.RollbackTrans MsgBox "Errore: " & Err.Number & vbCrLf & Err.Description & vbCrLf & _ "Si è verificato un'errore nella transazione" Resume cmdOk_Click_Exit End SubCiò che potreste obiettare è che potreste eseguire lo stesso tipo di procedura chiamando SQL al volo. Vero, ma la velocità di una SP (acronimo gergale per Stored Procedure) è davvero enormemente maggiore di quella del codice al volo e, naturalmente conoscendo un po' di più SQL, si possono realizzare procedure molto più significative.
Un'ultima cosa, prima di terminare: se provate ad andare a modificare una Stored procedure dopo averla Creata, il codice della stessa apparirà un po' diverso, infatti la nostra procedurina diviene:
Alter Procedure SPRiportaInterprete ( @IDInterprete int = null , @IDCd int = null ) As begin tran UPDATE tbBrani SET [idInterprete]=@idInterprete WHERE [idCd]=@idCd and ([idInterprete] is null ) commit tran returnQuesto ovviamente perché, una volta creata la procedura, il comando SQL per la modifica è diverso.
Con questa pagina concludo la prima parte, dedicata all'uso di Access.
La seconda parte invece sarà dedicata al solo ed esclusivo Codice SQL da utilizzare inviandolo direttamente da VB con l'uso degli oggetti ADO.Se avete obiezioni, se provate a fare ciò che è scritto in questo articolo e non ottenete gli stessi risultati, oppure se avete necessità di approfondimenti o chiarimenti sul contenuto di questo articolo, potete mettervi in contatto con l'autrice, Sabrina Cosolo (vi si chiede solo un po' di pazienza per le risposte, che possono eventualmente tardare per le intuibili ragioni di lavoro), della cui azienda potete visitare il sito.