Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
La Creazione guidata consumer OLE DB ATL non è disponibile in Visual Studio 2019 e versioni successive. È comunque possibile aggiungere la funzionalità manualmente.
La Creazione guidata consumer OLE DB ATL e la Creazione guidata applicazione MFC generano alcune funzioni di cui è consigliabile tenere conto. Alcuni metodi vengono implementati in modo diverso nei progetti con attributi e di conseguenza esistono alcune limitazioni. Ogni caso viene descritto di seguito. Per informazioni sulla visualizzazione di codice inserito, vedere Debug del codice inserito.
OpenAllapre l'origine dati o i set di righe e attiva segnalibri se disponibili.CloseAllchiude tutti i set di righe aperti e rilascia tutte le esecuzioni di comandi.Il metodo
OpenRowsetviene chiamato daOpenAllper aprire il o i set di righe del consumer.GetRowsetPropertiesrecupera un puntatore alla proprietà del set di righe impostata con le proprietà che possono essere impostate.OpenDataSourceapre l'origine dati usando la stringa di inizializzazione specificata nella finestra di dialogo Proprietà di Data Link.CloseDataSourcechiude l'origine dati in modo appropriato.
OpenAll e CloseAll
HRESULT OpenAll();
void CloseAll();
L'esempio seguente mostra come chiamare OpenAll e CloseAll quando si esegue più volte lo stesso comando. Confrontare l'esempio di codice in CCommand::Close, che mostra una variazione che chiama Close e ReleaseCommand invece di CloseAll.
int main(int argc, char* argv[])
{
HRESULT hr;
hr = CoInitialize(NULL);
CCustOrdersDetail rs; // Your CCommand-derived class
rs.m_OrderID = 10248; // Open order 10248
hr = rs.OpenAll(); // (Open also executes the command)
hr = rs.MoveFirst(); // Move to the first row and print it
printf( "Name: %s, Unit Price: %d, Quantity: %d, Discount %d, Extended Price %d\n", rs.m_ProductName, rs.m_UnitPrice.int64, rs.m_Quantity, rs.m_Discount, rs.m_ExtendedPrice.int64 );
// Close the first command execution
rs.Close();
rs.m_OrderID = 10249; // Open order 10249 (a new order)
hr = rs.Open(); // (Open also executes the command)
hr = rs.MoveFirst(); // Move to the first row and print it
printf( "Name: %s, Unit Price: %d, Quantity: %d, Discount %d, Extended Price %d\n", rs.m_ProductName, rs.m_UnitPrice.int64, rs.m_Quantity, rs.m_Discount, rs.m_ExtendedPrice.int64 );
// Close the second command execution;
// Instead of rs.CloseAll() you could call
// rs.Close() and rs.ReleaseCommand():
rs.CloseAll();
CoUninitialize();
return 0;
}
Osservazioni:
Se si definisce un metodo HasBookmark, il codice OpenAll imposta la proprietà DBPROP_IRowsetLocate. Assicurarsi di eseguire questa operazione solo se il provider supporta la proprietà.
OpenRowset
// OLE DB Template version:
HRESULT OpenRowset(DBPROPSET* pPropSet = NULL)
// Attribute-injected version:
HRESULT OpenRowset(const CSession& session, LPCWSTR szCommand = NULL);
OpenAll chiama questo metodo per aprire il o i set di righe nel consumer. In genere, non è necessario chiamare OpenRowset, a meno che non si voglia usare più origini dati/sessioni/set di righe. Il metodo OpenRowset viene dichiarato nel file di intestazione di classe del comando o della tabella:
// OLE DB Template version:
HRESULT OpenRowset(DBPROPSET *pPropSet = NULL)
{
HRESULT hr = Open(m_session, NULL, pPropSet);
#ifdef _DEBUG
if(FAILED(hr))
AtlTraceErrorRecords(hr);
#endif
return hr;
}
Gli attributi implementano questo metodo in modo diverso. Questa versione accetta un oggetto sessione e una stringa di comando che per impostazione predefinita è la stringa di comando specificata in db_command, ma è possibile passarne una diversa. Se si definisce un metodo HasBookmark, il codice OpenRowset imposta la proprietà DBPROP_IRowsetLocate. Assicurarsi di eseguire questa operazione solo se il provider supporta la proprietà.
// Attribute-injected version:
HRESULT OpenRowset(const CSession& session, LPCWSTR szCommand=NULL)
{
DBPROPSET *pPropSet = NULL;
CDBPropSet propset(DBPROPSET_ROWSET);
__if_exists(HasBookmark)
{
propset.AddProperty(DBPROP_IRowsetLocate, true);
pPropSet= &propset;
}
...
}
GetRowsetProperties
void GetRowsetProperties(CDBPropSet* pPropSet);
Questo metodo recupera un puntatore al set di proprietà del set di righe. È possibile usare questo puntatore per impostare proprietà come DBPROP_IRowsetChange. Il metodo GetRowsetProperties viene usato nella classe di record utente nel modo seguente. È possibile modificare questo codice per impostare altre proprietà del set di righe:
void GetRowsetProperties(CDBPropSet* pPropSet)
{
pPropSet->AddProperty(DBPROP_CANFETCHBACKWARDS, true, DBPROPOPTIONS_OPTIONAL);
pPropSet->AddProperty(DBPROP_CANSCROLLBACKWARDS, true, DBPROPOPTIONS_OPTIONAL);
pPropSet->AddProperty(DBPROP_IRowsetChange, true, DBPROPOPTIONS_OPTIONAL);
pPropSet->AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_INSERT | DBPROPVAL_UP_DELETE);
}
Osservazioni:
Non è consigliabile definire un metodo GetRowsetProperties globale, perché potrebbe entrare in conflitto con quello definito dalla procedura guidata. Questo è un metodo generato dalla procedura guidata che si ottiene con progetti con modelli e con attributi. Gli attributi non inseriscono questo codice.
OpenDataSource e CloseDataSource
HRESULT OpenDataSource();
void CloseDataSource();
Osservazioni:
La procedura guidata definisce i metodi OpenDataSource e CloseDataSource. OpenDataSource chiama CDataSource::OpenFromInitializationString.
Vedi anche
Creazione di un consumer OLE DB tramite la procedura guidata