CRecordset::Open
Apre il recordset recuperando la tabella o eseguendo la query rappresentata dal recordset.
virtual BOOL Open(
UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE,
LPCTSTR lpszSQL = NULL,
DWORD dwOptions = none
);
Parametri
nOpenType
Accetta il valore predefinito, AFX_DB_USE_DEFAULT_TYPE, oppure utilizza uno dei seguenti valori da enum OpenType:CRecordset::dynaset Un recordset con scorrimento bidirezionale. L'appartenenza e l'ordine dei record vengono determinati quando si apre il recordset, ma le modifiche apportate da altri utenti ai valori dei dati diventano visibili a seguito di un'operazione di recupero. I Dynaset sono noti anche come recordset basati su keyset.
CRecordset::snapshot Un recordset statico con scorrimento bidirezionale. L'appartenenza e l'ordine dei record vengono determinati quando si apre il recordset; i valori dei dati vengono determinati quando vengono recuperati i record. Le modifiche apportate da altri utenti non sono visibili fino alla chiusura e riapertura del recordset.
CRecordset::dynamic Un recordset con scorrimento bidirezionale. Le modifiche apportate da altri utenti all'appartenenza, all'ordine e ai valori dei dati diventano visibili in seguito a un'operazione di recupero. Si noti che molti driver ODBC non supportano questo tipo di recordset.
CRecordset::forwardOnly Un recordset di sola lettura con il solo scorrimento in avanti.
Per CRecordset, il valore predefinito è CRecordset::snapshot. Il meccanismo di valore predefinito consente alle procedure guidate di Visual C++ di interagire sia con CRecordset di ODBC e CDaoRecordset di DAO, che dispongono di valori predefiniti diversi.
Per ulteriori informazioni su questi tipi di recordset, consultare l'articolo Recordset (ODBC). Per informazioni correlate, consultare l'articolo "Utilizzare il blocco e Cursori Scorrevoli" in Windows SDK.
Avviso
Se il tipo richiesto non è supportato, il framework genera un'eccezione.
lpszSQL
Una stringa puntatore contenente uno dei seguenti:Un puntatore NULL.
Nome di una tabella.
Un'istruzione SQL SELECT (eventualmente con una clausola SQL WHERE o ORDER BY).
Un'istruzione CALL che specifica il nome di una query predefinita (stored procedure). Prestare attenzione a non inserire uno spazio vuoto tra la parentesi graffa e la parola chiave CALL.
Per ulteriori informazioni su questa stringa, consultare la tabella e la discussione del ruolo di ClassWizard sotto la sezione Osservazioni.
Nota
L'ordine delle colonne nel set di risultati deve corrispondere all'ordine di RFX o alle chiamate alla funzione RFX di massa nell'override della funzione DoBulkFieldExchange o DoFieldExchange.
dwOptions
Una maschera di bit può specificare una combinazione dei valori elencati di seguito. Alcuni di questi sono di mutua esclusione. Il valore predefinito è none.CRecordset::none Nessuna opzione impostata. Il valore di questo parametro è di mutua esclusione con tutti gli altri valori. Per impostazione predefinita, il recordset può essere aggiornato con Edit o Delete e consente di aggiungere nuovi record con AddNew. L'aggiornabilità dipende dall'origine dati nonché dall'opzione nOpenType che si specifica. L'ottimizzazione per l'aggiunta di massa non è disponibile. Il recupero di massa di righe non verrà implementato. I record eliminati non verranno ignorati durante la navigazione del recordset. I segnalibri non sono disponibili. Il controllo automatico dei campi modificati automatico è implementato.
CRecordset::appendOnly Non consente Edit o Delete sul recordset. Consente solo AddNew. Questa opzione è di mutua esclusione con CRecordset::readOnly.
CRecordset::readOnly Apre il recordset in sola lettura. Questa opzione è di mutua esclusione con CRecordset::appendOnly.
CRecordset::optimizeBulkAdd Usa un'istruzione SQL scritta per ottimizzare l'aggiunta di molti record contemporaneamente. Si applica solo se non si utilizza la funzione API ODBC SQLSetPos per aggiornare il recordset. Il primo aggiornamento determina quali campi vengono marcati come modificati. Questa opzione è di mutua esclusione con CRecordset::useMultiRowFetch.
CRecordset::useMultiRowFetch Implementa il recupero di massa di righe per consentire di recuperare più righe in una singola operazione di recupero. Questa è una funzionalità avanzata progettata per migliorare le prestazioni; tuttavia, il trasferimento di massa di campi di Record non è supportato da ClassWizard. Questa opzione è di mutua esclusione con CRecordset::optimizeBulkAdd. Si noti che se si specifica CRecordset::useMultiRowFetch, poi verrà abilitata automaticamente l'opzione CRecordset::noDirtyFieldCheck (il doppio buffer non sarà disponibile); nei recordset forward-only, verrà abilitata automaticamente l'opzione CRecordset::useExtendedFetch. Per ulteriori informazioni sul recupero di massa di righe, consultare l'articolo Recordset: Recupero di massa di Record (ODBC).
CRecordset::skipDeletedRecords Ignora tutti i record eliminati quando si naviga all'interno del recordset. Ciò rallenterà le prestazioni in alcuni recuperi relativi. Questa opzione non è valida per i recordset di tipo forward-only. Se si chiama Move con il parametro nRows impostato su 0 ed il set di opzioni CRecordset::skipDeletedRecords, Move si affermerà. Si noti che CRecordset::skipDeletedRecords è simile a compressione del driver, ciò significa che le righe eliminate vengono rimosse dal recordset. Tuttavia, se il driver comprime i record, poi ignorerà solo i record eliminati da noi; non ignorerà i record eliminati da altri utenti mentre il recordset è aperto. CRecordset::skipDeletedRecords ignorerà le righe eliminate da altri utenti.
CRecordset::useBookmarks Potrebbe utilizzare segnalibri sul recordset, se supportato. I segnalibri rallentano il recupero dei dati ma migliorano le prestazioni per la navigazione tra i dati. Non valido per i recordset di tipo forward-only. Per ulteriori informazioni, consultare l'articolo Recordset: Segnalibri e absolute position (ODBC).
CRecordset::noDirtyFieldCheck Disabilita il controllo automatico dei campi modificati (doppio buffer). Ciò consente di migliorare le prestazioni; comunque, è necessario contrassegnare manualmente i campi come modificati invocando le funzioni membro SetFieldNull e SetFieldDirty. Si noti che il doppio buffer nella classe CRecordset è simile al doppio buffering nella classe CDaoRecordset. Comunque, in CRecordset, non è possibile attivare il doppio buffer sui singoli campi; o lo si abilita per tutti i campi o disabilitarla per tutti. Si noti che se si specifica l'opzione CRecordset::useMultiRowFetch, in seguito CRecordset::noDirtyFieldCheck verrà attivato automaticamente; tuttavia, SetFieldDirty e SetFieldNull non possono essere utilizzati sui recordset che implementano il recupero di massa di righe.
CRecordset::executeDirect Non utilizza un'istruzione SQL scritta in precedenza. Per ottenere prestazioni migliori, specificare tale opzione se non verrà mai invocata la funzione membro Requery.
CRecordset::useExtendedFetch Implementa SQLExtendedFetch anziché SQLFetch. Ciò è progettato per implementare il recupero di massa di righe nei recordset forward-only. Se in un recordset forward-only si specifica l'opzione CRecordset::useMultiRowFetch, allora verrà attivato automaticamente CRecordset::useExtendedFetch.
CRecordset::userAllocMultiRowBuffers L'utente allocherà i buffer di archiviazione per i dati. Utilizzare questa opzione assieme a CRecordset::useMultiRowFetch se si desidera allocare manualmente la memoria; in caso contrario, il framework allocherà automaticamente la memoria necessaria. Per ulteriori informazioni, consultare l'articolo Recordset: Recupero di massa di Record (ODBC). Si noti che specificare CRecordset::userAllocMultiRowBuffers senza specificare CRecordset::useMultiRowFetch determinerà in un fallimento dell'asserzione.
Valore restituito
Un valore diverso da zero se l'oggetto CRecordset è stato aperto correttamente; 0 in caso contrario se CDatabase::Open restituisce 0 (se invocato).
Note
È necessario invocare tale funzione membro per eseguire la query definita dal recordset. Prima di invocare Open, è necessario creare l'oggetto recordset.
La connessione del recordset all'origine dei dati dipende da come si crea il recordset prima di invocare Open. Se si passa un oggetto CDatabase che non è stato connesso all'origine dati al costruttore del recordset, questa funzione membro utilizza GetDefaultConnect per tentare di aprire l'oggetto del database. Se si passa NULL al costruttore del recordset, il costruttore crea un oggetto CDatabase e Open tenta di connettere l'oggetto del database. Per informazioni dettagliate sulla chiusura del recordset e la connessione in queste diverse circostanze, consultare Chiudi.
Nota
L'accesso a un'origine dei dati tramite un oggetto CRecordset è sempre condiviso.A differenza della classe CDaoRecordset, non è possibile utilizzare un oggetto CRecordset per aprire un'origine dati con accesso esclusivo.
Quando si invoca Open, una query, in genere un'istruzione SQL SELECT, seleziona i record in base ai criteri indicati nella tabella seguente.
Valore del parametro lpszSQL |
I record selezionati sono determinati da |
Esempio |
---|---|---|
NULL |
La stringa restituita da GetDefaultSQL. |
|
Nome tabella SQL |
Tutte le colonne dell'elenco tabelle in DoFieldExchange o DoBulkFieldExchange. |
"Customer" |
Nome predefinito della query (stored procedure) |
Le colonne che la query è definita per restituire. |
"{call OverDueAccts}" |
SELECT elenco-colonne FROM elenco-tabelle |
Le colonne specificate dalle tabella (/e) specificata (/e). |
"SELECT CustId, CustName FROM Customer" |
Avviso
Prestare attenzione a non inserire uno spazio vuoto aggiuntivo nella stringa SQL.Ad esempio, se si inserisce uno spazio vuoto tra la parentesi graffa e la parola chiave CALL, MFC interpreterà erroneamente la stringa SQL come un nome di tabella lo incorporerà in un'istruzione SELECT, che risulterà nel lancio di un'eccezione.Analogamente, se la query predefinita utilizza un parametro di output, non inserire uno spazio vuoto tra la parentesi graffa ed il simbolo '?'.Infine, non è necessario inserire uno spazio vuoto prima della parentesi graffa in un'istruzione CALL o prima della parola chiave SELECT in un'istruzione SELECT.
La routine consiste nel passare NULL a Open; in questo caso, Open invoca GetDefaultSQL. Se si utilizza una classe derivata CRecordset, GetDefaultSQL fornisce i nomi di tabella (/e) specificato (/i) in ClassWizard. È invece possibile specificare altre informazioni nel parametro lpszSQL.
Qualsiasi cosa si passi, Open costruisce una stringa SQL finale per la query (la stringa può contenere clausole SQL WHERE e ORDER BY accodate alla stringa lpszSQL passata) e quindi esegue la query. È possibile esaminare la stringa costruita invocando GetSQL dopo avere chiamato Open. Per informazioni dettagliate su come il recordset crea un'istruzione SQL e seleziona i record, consultare l'articolo Recordset: Come i recordset selezionano i Record (ODBC).
I membri dei dati di campo della classe recordset sono associati alle colonne dei dati selezionati. Se vengono restituiti alcuni record, il primo di essi diventa il record corrente.
Se si desidera impostare delle opzioni per il recordset, come ad esempio un filtro o un ordinamento, specificare queste dopo la costruzione dell'oggetto recordset ma prima di invocare Open. Se si desidera aggiornare i record del recordset dopo che il recordset è già stato aperto, invocare Requery.
Per ulteriori informazioni, inclusi esempi aggiuntivi, consultare gli articoli Recordset (ODBC), Recordset: Come i Recordset selezionano i Record (ODBC) e Recordset: Creazione e chiusura di Recordset (ODBC).
Eccezioni
Questo metodo può generare eccezioni di tipo CDBException* e CMemoryException*.
Esempio
I seguenti esempi di codice mostrano differenti forme dell'invocazione a Open.
// rsSnap, rsLName, and rsDefault are CRecordset or CRecordset-derived
// objects
// Open rs using the default SQL statement, implement bookmarks, and turn
// off automatic dirty field checking
rsSnap.Open(CRecordset::snapshot, NULL, CRecordset::useBookmarks |
CRecordset::noDirtyFieldCheck);
// Pass a complete SELECT statement and open as a dynaset
rsLName.Open(CRecordset::dynaset, _T("Select L_Name from Customer"));
// Accept all defaults
rsDefault.Open();
Requisiti
Intestazione: afxdb.h