Il Modello ad Oggetti di ADO - Command


Home Page | Commenti | Articoli | Faq | Documenti | Ricerca | Archivio | Storie dalla Sala Macchine | Contribuire | Imposta lingua:en it | Login/Register


L'oggetto Command consente l'invio di comandi al database, i comandi possono essere query, ma non sono limitati a questo. Possono essere preparazione di query ed associazioni di parametri con stringhe di query. Il linguaggio attuale di comando che e' supportato e' strettamente dipendente dal driver in uso, la maggioranza dei database relazionali che sono supportati utilizzano una qualche variante dello standard SQL92.

L'oggetto Command puo' sia accedere ad una nuova connessione o utilizzare una connessione esistente per eseguire le proprie operazioni, dipende da cosa viene specificato nella proprieta' ActiveConnection. Se tale proprieta' e' impostata su una connesione esistente, tale connessione verra' utilizzata, se tale proprieta' viene impostata su una stringa di connessione, verra' usata tale stringa per attivare una nuova connessione.

L'esecuzione di stringhe di query puo' generare uno o piu' RecordSet come risposta, oppure puo' non ritornare nessun RecordSet.

Una query puo' essere specificata impostando la proprieta' CommandText. Una query in genere puo' essere una istruzione SQL standard di manipolazione del database o il richiamo di una Stored Procedure.

Il tipo di query viene specificato impostando la proprieta' CommandType con una delle apposite costanti.

Quando il comando e' un comando SQL, deve essere utilizzata adCmdText.

Se viene usata adCmdStoredProc, l'oggetto Command esegue la query mediante la sequenza ODBC {call procedure=name}.

Se si specifica adCmdTable, la query si suppone che sia il nome di una tabella, in questo caso la query viene convertita in SELECT * FROM per reperire tutte le righe della tabella.

Specificando adCmdUnknown, l'oggetto Command cerchera' di stabilire il tipo di query inviato, questo potrebbe portare ad un degrado delle prestazioni.

E' possibile utilizzare la proprieta' Prepared, per effettuare la "preparazione" delle query prima della vera e propria esecuzione. In questo modo prima della esecuzione viene preparato il Piano di Query, questo migliora sensibilmente le prestazini della query se la stessa deve essere eseguita piu' volte.

La proprieta' Prepared diviene utile anche quando si deve eseguire ripetutamente una query con parametri, modificando i valori dei parametri ogni volta. L'oggetto Parameter puo' essere creato attraverso il metodo CreateParameter.

Questo esempio esegue una semplice SELECT che ritorna un recordset:


Dim Cmd As New ADODB.Command
Dim rs As New ADODB.Recordset

' Use a connection string or a Connection object.
Cmd.ActiveConnection = "DSN=pubs;UID=sa"
Cmd.CommandText = "select * from titles"
Cmd.CommandTimeout = 15
Cmd.CommandType = adCmdText

Set rs = Cmd.Execute()
rs.Close

Questo esempio esegue una stored procedure che non ritorna un RecordSet.


Dim Cmd As New ADODB.Command

' Use a connection string or a Connection object.
Cmd.ActiveConnection = "DSN=pubs;UID=sa"
Cmd.CommandText = "myADOProc"
Cmd.CommandTimeout = 15
Cmd.CommandType = adCmdStoredProc

Cmd.Execute

Il nome della Stored Procedure e' "myAdoProc" ed e' inserito nella proprieta' CommandText.

Torna alla mappa

ActiveConnection

Indica l'oggetto Connection a cui appartiene attualmente l'oggetto Command.

Impostazioni e valori restituiti

Imposta o restituisce un valore String contenente la definizione per una connessione o un oggetto Connection. L'impostazione predefinita e' un riferimento all'oggetto Null.

Osservazioni

Utilizzare la proprieta' ActiveConnection per determinare l'oggetto Connection tramite il quale l'oggetto Command specificato verra' eseguito.

Se si cerca di richiamare il metodo Execute in un oggetto Command prima di aver impostato questa proprieta' a un oggetto Connection aperto o una stringa di connessione valida, verra' restituito un errore.

Microsoft Visual Basic

L'impostazione della proprieta' ActiveConnection su Nothing implica l'eliminazione dell'associazione tra l'oggetto Command e l'oggetto Connection corrente e il conseguente rilascio da parte del provider di eventuali risorse associate della fonte dati. Sara' quindi possibile associare l'oggetto Command allo stesso oggetto Connection o a un altro oggetto. Alcuni provider consentono di modificare l'impostazione della proprieta' da un oggetto Connection a un altro senza impostare dapprima la proprieta' su Nothing.

Se l'insieme Parameters dell'oggetto Command contiene parametri forniti dal provider e se si imposta ActiveConnection su Nothing o su un altro oggetto Connection, l'insieme verra' cancellato. Se si inseriscono oggetti Parameter creati manualmente nell'insieme Parameters dell'oggetto Command e si imposta la proprieta' ActiveConnection su Nothing o su un altro oggetto Connection, l'insieme Parameters non verra' modificato.

La chiusura di un oggetto Connection a cui e' associato un oggetto Command consente di impostare la proprieta' ActiveConnection su Nothing. Impostando questa proprieta' su un oggetto Connection chiuso, verra' restituito un errore.

CommandTimeout

Indica il tempo da attendere prima di ritornare un errore di "tempo scaduto per l'operazione". Il valore deve essere indicato in secondi. Il default e' di 30 secondi.

CommandText

Imposta o restituisce un valore String contenente un comando di provider, quale un'istruzione SQL, un nome di tabella o una chiamata a una stored procedure. Il valore predefinito e' "", ovvero una stringa di lunghezza zero.

Se la proprieta' Prepared e' impostata su True e l'oggetto Command e' legato a una connessione aperta durante l'impostazione della proprieta' CommandText, quando verra' chiamato il metodo Execute o Open ADO preparera' la query, vale a dire una forma compilata della query memorizzata dal provider.

A seconda dell'impostazione della proprieta' CommandType, ADO puo' modificare la proprieta' CommandText. È possibile leggere la proprieta' CommandText in qualsiasi momento per visualizzare il testo del comando che verra' utilizzato da ADO durante l'esecuzione.

CommandType

Indica il tipo di oggetto command, e' possibile utilizzare uno o una combinazione di piu' dei valori seguenti:

  • adCmdText
    Definisce CommandText come la definizione testuale di un comando o una chiamata di stored procedure.
  • adCmdTable
    Definisce CommandText come un nome di tabella le cui colonne vengono tutte restituite tramite una query SQL generata internamente.
  • adCmdTableDirect
    Definisce CommandText come un nome di tabella le cui colonne vengono tutte restituite.
  • adCmdStoredProc
    Definisce CommandText come un nome di stored procedure.
  • adCmdUnknown
    Predefinita. Il tipo di comando della proprieta' CommandText non e' conosciuto.
  • adCommandFile
    Definisce CommandText come il nome di file di un Recordset che deve rimanere fisso.
  • adExecuteNoRecords
    Definisce CommandText come un comando o una stored procedure che non restituisce alcuna riga, quale un comando che inserisce solamente dati. Le righe trovate vengono scartate e non restituite. Sempre associata a adCmdText o adCmdStoredProc.

Se il valore della proprieta' CommandType corrisponde a adCmdUnknown (valore predefinito), e' possibile che si verifichi una riduzione delle prestazioni in quanto ADO dovra' eseguire delle chiamate al provider per determinare se la proprieta' CommandText e' un'istruzione SQL, una stored procedure o un nome di tabella. Se si conosce il tipo di comando in uso, l'impostazione della proprieta' CommandType indichera' il codice appropriato.

Se la proprieta' CommandType non corrisponde al tipo di comando indicato nella proprieta' CommandText, si verifichera' un errore quando si chiama il metodo Execute.

La costante adExecuteNoRecords ottimizza le prestazioni riducendo il carico di elaborazione interna. Questa costante non e' mai isolata ma e' sempre associata a adCmdText o adCmdStoredProc (ad esempio, adCmdText+adExecuteNoRecords). Con il metodo Recordset.Open non e' possibile utilizzare la costante adExecuteNoRecords ne' un oggetto Command. Qualora ciò si verificasse, verrebbe segnalato un errore.

Prepared

Indica se salvare o meno una versione compilata di un comando prima dell'esecuzione.

Valori possibili: TRUE o FALSE.

Osservazioni

Utilizzare la proprieta' Prepared se si desidera che il provider salvi una versione preparata o compilata della query specificata nella proprieta' CommandText prima di eseguire per la prima volta un oggetto Command. Questa operazione rallenta la prima esecuzione del comando, ma una volta compilato il comando, il provider ne utilizzera' la versione compilata per le esecuzioni successive, consentendo in tal modo di ottenere un miglioramento generale delle prestazioni.

Se la proprieta' e' impostata su False, il provider eseguira' direttamente l'oggetto Command senza crearne una versione compilata.

Se il provider non supporta la preparazione dei comandi, e' possibile che venga restituito un errore quando la proprieta' viene impostata su True. Se non viene restituito alcun errore, la richiesta di compilazione del comando verra' ignorata e la proprieta' Prepared verra' impostata su False.

State

La proprieta' State puo' essere utilizzata per determinare lo stato corrente di un determinato oggetto in qualsiasi momento. Si tratta di una proprieta' di sola lettura.

  • adStateClosed
    Predefinita. L'oggetto e' chiuso.
  • adStateOpen
    L'oggetto e' aperto.

Execute

Esegue la query, l'istruzione SQL, la stored procedure o il testo specifico del provider.

Sintassi
Per una stringa di comando che non restituisce valori:


Command.Execute Record, Parametri, Opzioni 

Per una stringa di comando che restituisce righe:


Set recordset = Command.Execute (Record,
Parametri,
Opzioni)
In questo caso la Execute costruisce e ritorna un oggetto di tipo Recordset.

Parametri

  • Record
    Variabile Long a cui il provider restituisce il numero di record interessati dall'operazione (opzionale).
  • Parametri
    Array di valori dei parametri passati con un'istruzione SQL (opzionale). I parametri di output non restituiranno valori corretti quando vengono passati in questo argomento.
  • Opzioni
    Valore Long che indica come il provider deve valutare l'argomento Comando (opzionale). Può essere una delle seguenti costanti:
    • adCmdText
      Indica che il provider deve valutare Comando come una definizione in formato testo di un comando.
    • adCmdTable
      Indica che ADO deve generare una query SQL per restituire tutte le righe della tabella indicata in Comando.
    • adCmdTableDirect
      Indica che il provider deve restituire tutte le righe della tabella indicata in Comando.
    • adCmdTable
      Indica che il provider deve valutare Comando come un nome di tabella.
    • adCmdStoredProc
      Indica che il provider deve valutare Comando come una stored procedure.
    • adCmdUnknown
      Indica che il tipo di comando nell'argomento Comando non e' conosciuto.
    • adExecuteAsync
      Indica che il comando deve essere eseguito in modalita' asincrona.
    • adFetchAsync
      Indica che sulle righe rimanenti dopo la quantita' iniziale specificata nella proprieta' CacheSize deve essere eseguito il fetch in modalita' asincrona.

Utilizzando il metodo Execute su un oggetto Command si esegue la query specificata nella proprieta' CommandText dell'oggetto. Se la proprieta' CommandText specifica una query che restituisce righe, qualsiasi risultato generato dall'esecuzione verra' memorizzato in un nuovo oggetto Recordset. Se il comando non e' una query che restituisce righe, il provider restituira' un oggetto Recordset chiuso. In alcuni linguaggi applicativi e' possibile ignorare tale valore restituito se non si desidera alcun Recordset.

Se la query ha dei parametri, verranno utilizzati i valori correnti dei parametri dell'oggetto Command, a meno che questi non vengano sostituiti dai valori dei parametri passati con la chiamata del metodo Execute. È possibile ignorare un sottoinsieme di parametri omettendo i nuovi valori per alcuni dei parametri quando si chiama il metodo Execute. L'ordine in cui i parametri vengono specificati e' lo stesso ordine in cui vengono passati dal metodo. Se ad esempio vi sono quattro o piu' parametri e si desidera passare nuovi valori solo per il primo e il quarto parametro, sara' necessario passare Array(var1,,,var4) come argomento Parametri.

Nota I parametri di output non restituiscono valori corretti quando vengono passati nell'argomento Parametri.

L'oggetto Recordset restituito e' sempre un cursore a scorrimento in avanti di sola lettura. Se e' necessario un oggetto Recordset con piu' funzionalita', creare innanzitutto un oggetto Recordset con le impostazioni delle proprieta' desiderate, quindi utilizzare il metodo Open dell'oggetto Recordset per eseguire la query e restituire il tipo di cursore desiderato.

CreateParameter

Crea un nuovo oggetto Parameter con le proprieta' specificate.

Sintassi


Set parametro=comando.CreateParameter( Nome,
Tipo,
Direzione, 
Dimensione,
Valore )

Parametri

  • Nome
    Elemento String che rappresenta il nome dell'oggetto Parameter (opzionale).
  • Tipo
    Valore Long che specifica il tipo di dati dell'oggetto Parameter (opzionale).
  • Direzione
    Valore Long che specifica il tipo di oggetto Parameter (opzionale).
  • Dimensione
    Valore Long che specifica la lunghezza massima per il valore del parametro in caratteri o byte (opzionale).
  • Valore
    valore da assegnare al parametro (opzionale).

Osservazioni

Utilizzare il metodo CreateParameter per creare un nuovo oggetto Parameter con il nome, il tipo, la direzione, la dimensione e il valore specificati. Qualsiasi valore passato negli argomenti viene scritto nelle proprieta' Parameter corrispondenti.

Questo metodo non accoda automaticamente l'oggetto Parameter all'insieme Parameters di un oggetto Command. In questo modo, e' possibile impostare ulteriori proprieta' i cui valori verranno convalidati da ADO quando si accoda l'oggetto Parameter all'insieme.

Se si specifica un tipo di dati a lunghezza variabile nell'argomento Tipo, sara' necessario passare un argomento Dimensione o impostare la proprieta' Size dell'oggetto Parameter prima di accodarlo all'insieme Parameters, altrimenti si verifichera' un errore.

Cancel

Annulla l'esecuzione di una chiamata asincrona del metodo Execute in attesa.

Sintassi


connection.Cancel

Utilizzare il metodo Cancel per terminare l'esecuzione di una chiamata asincrona del metodo Execute, ovvero il metodo chiamato con l'opzione adConnectAsync, adExecuteAsync o adFetchAsync. Se l'opzione adRunAsync non e' stata utilizzata nel metodo che si sta tentando di terminare, Cancel restituira' un errore in fase di esecuzione.


I commenti sono aggiunti quando e soprattutto se ho il tempo di guardarli e dopo aver eliminato le cagate, spam, tentativi di phishing et similia. Quindi non trattenete il respiro.

Nessun messaggio this document does not accept new posts

Precedente Successivo


Davide Bianchi, lavora come Unix/Linux System Administrator presso una societa' di Hosting in Olanda.

Volete contribuire? Leggete come!.
 
 

Il presente sito e' frutto del sudore della mia fronte (e delle mie dita), se siete interessati a ripubblicare uno degli articoli, documenti o qualunque altra cosa presente in questo sito per cortesia datemene comunicazione (o all'autore dell'articolo se non sono io), cosi' il giorno che faccio delle aggiunte potro' avvisarvi e magari mandarvi il testo aggiornato.


Questo sito era composto con VIM, ora e' composto con VIM ed il famosissimo CMS FdT.

Questo sito non e' ottimizzato per la visione con nessun browser particolare, ne' richiede l'uso di font particolari o risoluzioni speciali. Siete liberi di vederlo come vi pare e piace, o come disse qualcuno: "Finalmente uno dei POCHI siti che ancora funzionano con IE5 dentro Windows 3.1".

Web Interoperability Pleadge Support This Project
Powered By Gojira