Recordset: recupero di massa di record (ODBC)
Le informazioni contenute in questo argomento sono valide per le classi ODBC MFC.
La classe CRecordset
fornisce il supporto per il recupero di righe bulk, il che significa che è possibile recuperare più record contemporaneamente durante un singolo recupero, anziché recuperare un record alla volta dall'origine dati. È possibile implementare il recupero delle righe bulk solo in una classe derivata CRecordset
. Il processo di trasferimento dei dati dall'origine dati all'oggetto recordset è denominato scambio di campi di record bulk (RFX bulk). Si noti che se non si utilizza il recupero di righe bulk in una CRecordset
classe derivata da , i dati vengono trasferiti tramite lo scambio di campi di record (RFX). Per altre informazioni, vedere Record Field Exchange (RFX).
In questo argomento:
Modalità di recupero delle righe bulk in CRecordset.
Alcune considerazioni speciali quando si usa il recupero delle righe bulk.
Come implementare lo scambio di campi dei record in blocco.
Modalità di recupero delle righe bulk in CRecordset
Prima di aprire l'oggetto recordset, è possibile definire una dimensione del set di righe con la SetRowsetSize
funzione membro. La dimensione del set di righe specifica il numero di record da recuperare durante un singolo recupero. Quando viene implementato il recupero delle righe bulk, la dimensione predefinita del set di righe è 25. Se il recupero delle righe bulk non viene implementato, la dimensione del set di righe rimane fissa a 1.
Dopo aver inizializzato le dimensioni del set di righe, chiamare la funzione membro Open . In questo caso è necessario specificare l'opzione CRecordset::useMultiRowFetch
del parametro dwOptions per implementare il recupero delle righe bulk. È anche possibile impostare l'opzione CRecordset::userAllocMultiRowBuffers
. Il meccanismo di scambio di campi di record bulk usa matrici per archiviare più righe di dati recuperate durante un recupero. Questi buffer di archiviazione possono essere allocati automaticamente dal framework oppure è possibile allocarli manualmente. Se si specifica l'opzione CRecordset::userAllocMultiRowBuffers
, si eseguirà l'allocazione.
Nella tabella seguente sono elencate le funzioni membro fornite da CRecordset
per supportare il recupero delle righe bulk.
Funzione membro | Descrizione |
---|---|
CheckRowsetError | Funzione virtuale che gestisce eventuali errori che si verificano durante il recupero. |
DoBulkFieldExchange | Implementa lo scambio di campi dei record in blocco. Chiamato automaticamente per trasferire più righe di dati dall'origine dati all'oggetto recordset. |
GetRowsetSize | Recupera l'impostazione corrente per le dimensioni del set di righe. |
GetRowsFetched | Indica il numero di righe effettivamente recuperate dopo un determinato recupero. Nella maggior parte dei casi, si tratta delle dimensioni del set di righe, a meno che non sia stato recuperato un set di righe incompleto. |
GetRowStatus | Restituisce uno stato di recupero per una determinata riga all'interno di un set di righe. |
RefreshRowset | Aggiorna i dati e lo stato di una determinata riga all'interno di un set di righe. |
SetRowsetCursorPosition | Sposta il cursore su una determinata riga all'interno di un set di righe. |
SetRowsetSize | Funzione virtuale che modifica l'impostazione per le dimensioni del set di righe sul valore specificato. |
Considerazioni speciali
Anche se il recupero delle righe in blocco è un miglioramento delle prestazioni, alcune funzionalità funzionano in modo diverso. Prima di decidere di implementare il recupero delle righe bulk, tenere presente quanto segue:
Il framework chiama automaticamente la
DoBulkFieldExchange
funzione membro per trasferire i dati dall'origine dati all'oggetto recordset. Tuttavia, i dati non vengono trasferiti dal recordset all'origine dati. La chiamata alleAddNew
funzioni membro ,Edit
Delete
, oUpdate
comporta un'asserzione non riuscita. SebbeneCRecordset
attualmente non fornisca un meccanismo per l'aggiornamento di righe bulk di dati, è possibile scrivere funzioni personalizzate usando la funzioneSQLSetPos
API ODBC . Per altre informazioni suSQLSetPos
, vedere le informazioni di riferimento sul programmatore ODBC.Le funzioni
IsDeleted
membro ,IsFieldDirty
,IsFieldNull
IsFieldNullable
, ,SetFieldDirty
eSetFieldNull
non possono essere usate nei recordset che implementano il recupero delle righe bulk. Tuttavia, è possibile chiamareGetRowStatus
al posto diIsDeleted
eGetODBCFieldInfo
al posto diIsFieldNullable
.Le
Move
operazioni riposiziona il recordset in base al set di righe. Si supponga, ad esempio, di aprire un recordset con 100 record con una dimensione iniziale del set di righe pari a 10.Open
recupera le righe da 1 a 10, con il record corrente posizionato nella riga 1. Una chiamata aMoveNext
recupera il set di righe successivo, non la riga successiva. Questo set di righe è costituito da righe da 11 a 20, con il record corrente posizionato nella riga 11. Si noti cheMoveNext
eMove( 1 )
non sono equivalenti quando viene implementato il recupero delle righe bulk.Move( 1 )
recupera il set di righe che inizia 1 riga dal record corrente. In questo esempio, la chiamata dopo la chiamataMove( 1 )
Open
recupera il set di righe costituito da righe da 2 a 11, con il record corrente posizionato sulla riga 2. Per altre informazioni, vedere la funzione membro Move .A differenza dello scambio di campi di record, le procedure guidate non supportano lo scambio di campi dei record in blocco. Ciò significa che è necessario dichiarare manualmente i membri dati del campo ed eseguire manualmente l'override
DoBulkFieldExchange
scrivendo chiamate alle funzioni RFX bulk. Per altre informazioni, vedere Record Field Exchange Functions in the Class Library Reference .For more information, see Record Field Exchange Functions in the Class Library Reference.
Come implementare Lo scambio di campi dei record bulk
Lo scambio di campi record bulk trasferisce un set di righe di dati dall'origine dati all'oggetto recordset. Le funzioni RFX bulk usano matrici per archiviare questi dati, nonché matrici per archiviare la lunghezza di ogni elemento di dati nel set di righe. Nella definizione della classe è necessario definire i membri dei dati del campo come puntatori per accedere alle matrici di dati. Inoltre, è necessario definire un set di puntatori per accedere alle matrici di lunghezze. I membri dati dei parametri non devono essere dichiarati come puntatori; dichiarare i membri dei dati dei parametri quando si utilizza lo scambio di campi di record bulk equivale a dichiararli quando si utilizza lo scambio di campi record. Il codice seguente illustra un semplice esempio:
class MultiRowSet : public CRecordset
{
public:
// Field/Param Data
// field data members
long* m_rgID;
LPSTR m_rgName;
// pointers for the lengths
// of the field data
long* m_rgIDLengths;
long* m_rgNameLengths;
// input parameter data member
CString m_strNameParam;
.
.
.
}
È possibile allocare manualmente questi buffer di archiviazione o disporre del framework per eseguire l'allocazione. Per allocare manualmente i buffer, è necessario specificare l'opzione CRecordset::userAllocMultiRowBuffers
del parametro dwOptions nella Open
funzione membro. Assicurarsi di impostare le dimensioni delle matrici almeno uguali alle dimensioni del set di righe. Se si vuole fare in modo che il framework esemetta l'allocazione, è necessario inizializzare i puntatori a NULL. Questa operazione viene in genere eseguita nel costruttore dell'oggetto recordset:
MultiRowSet::MultiRowSet( CDatabase* pDB )
: CRecordset( pDB )
{
m_rgID = NULL;
m_rgName = NULL;
m_rgIDLengths = NULL;
m_rgNameLengths = NULL;
m_strNameParam = "";
m_nFields = 2;
m_nParams = 1;
.
.
.
}
Infine, è necessario eseguire l'override della DoBulkFieldExchange
funzione membro. Per i membri dati sul campo, chiamare le funzioni RFX bulk; per tutti i membri dati dei parametri, chiamare le funzioni RFX. Se è stato aperto il recordset passando un'istruzione SQL o una stored procedure a Open
, l'ordine in cui si effettuano le chiamate RFX bulk deve corrispondere all'ordine delle colonne nel recordset. Analogamente, l'ordine delle chiamate RFX per i parametri deve corrispondere all'ordine dei parametri nell'istruzione SQL o nella stored procedure.
void MultiRowSet::DoBulkFieldExchange( CFieldExchange* pFX )
{
// call the Bulk RFX functions
// for field data members
pFX->SetFieldType( CFieldExchange::outputColumn );
RFX_Long_Bulk( pFX, _T( "[colRecID]" ),
&m_rgID, &m_rgIDLengths );
RFX_Text_Bulk( pFX, _T( "[colName]" ),
&m_rgName, &m_rgNameLengths, 30 );
// call the RFX functions for
// for parameter data members
pFX->SetFieldType( CFieldExchange::inputParam );
RFX_Text( pFX, "NameParam", m_strNameParam );
}
Nota
È necessario chiamare la Close
funzione membro prima che la classe derivata CRecordset
esula dall'ambito. In questo modo si garantisce che qualsiasi memoria allocata dal framework venga liberata. È buona norma di programmazione chiamare Close
sempre in modo esplicito , indipendentemente dal fatto che sia stato implementato il recupero delle righe bulk.
Per altre informazioni sullo scambio di campi di record (RFX), vedere Scambio di campi record: Funzionamento di RFX. Per altre informazioni sull'uso dei parametri, vedere CFieldExchange::SetFieldType e Recordset: Parametrizzazione di un oggetto Recordset (ODBC).For more information about using parameters, see CFieldExchange::SetFieldType and Recordset: Parameterizing a Recordset (ODBC).
Vedi anche
Recordset (ODBC)
CRecordset::m_nFields
CRecordset::m_nParams