Esempio AdvancedPV: dimostrazione di tecniche avanzate dei provider
Aggiornamento: novembre 2007
L'esempio AdvancedPV è molto simile a UpdatePV, tranne per il fatto che illustra alcune tecniche avanzate.
I provider scritti mediante modelli OLE DB utilizzano in genere CAtlArray per l'archiviazione dei dati. I modelli del provider OLE DB chiamano un metodo Execute fornito dall'utente per compilare la matrice, ad esempio per caricare nella matrice tutte le righe del file di dati. Per salvare il contenuto della matrice, ad esempio per riportare il contenuto della matrice nel file di dati, viene utilizzato un altro metodo fornito dall'utente, FlushData. Il problema rappresentato da questo approccio è costituito dal fatto che in Execute devono essere caricate tutte le righe incluse nel rowset e che in FlushData devono essere salvate tutte le righe contemporaneamente. Se il rowset comprende un numero elevato di righe, tutti i dati devono quindi essere copiati in memoria, nell'oggetto CAtlArray.
Nell'esempio AdvancedPV viene illustrato come utilizzare una speciale classe di matrici, anziché la matrice CAtlArray predefinita, affinché il provider effettui il caricamento e il salvataggio delle righe in base alle specifiche esigenze. Le righe verranno caricate dal file di dati soltanto quando effettivamente richieste, mediante un operator[] appositamente implementato, e le modifiche verranno riportate nel file non appena viene modificato il contenuto della matrice.
Nota sulla sicurezza: |
---|
Questo esempio di codice viene fornito solo a scopo dimostrativo e non deve essere utilizzato in applicazioni o siti Web, poiché potrebbe non implementare le tecniche migliori a livello di sicurezza. Microsoft esclude ogni responsabilità per danni diretti o indiretti derivanti dall'utilizzo dell'esempio di codice per scopi diversi da quelli previsti. |
Per ottenere gli esempi e le istruzioni per l'installazione:
In Visual Studio scegliere Esempi dal menu Guida.
Per ulteriori informazioni, vedere Individuazione dei file di esempio.
La versione più recente e l'elenco completo degli esempi sono disponibili in linea alla pagina Visual Studio 2008 Samples.
È anche possibile trovare gli esempi sul disco rigido del computer. Per impostazione predefinita, gli esempi e il file Leggimi vengono copiati in una cartella nel percorso \Programmi\Visual Studio 9.0\Samples\. Per le versioni Express di Visual Studio, tutti gli esempi sono disponibili in linea.
Generazione ed esecuzione dell'esempio
Per generare ed eseguire l'esempio
Aprire il file di soluzione AdvancedPV.sln.
Scegliere Genera dal menu Genera.
Creare un'applicazione console Win32 con la Creazione guidata progetto Win32. Dotare l'applicazione del supporto ATL.
Aggiungere un consumer OLE DB al progetto selezionando Consumer OLE DB ATL da Aggiungi classe.
Nella Creazione guidata consumer OLE DB ATL scegliere Origine dati, quindi selezionare AdvancedProv Provider nella finestra delle proprietà Data Link. Il provider AdvancedProv dovrebbe essere registrato automaticamente al momento della generazione di AdvancedPV. Se non è elencato tra le opzioni, eseguire regsvr32.exe su AdvancedPV.dll.
Scegliere Next per passare alla scheda Connessione, quindi specificare il catalogo iniziale da utilizzare (ovvero il percorso di DataFile.dat) in Enter the initial catalog to use.
Aprire Tabelle in Seleziona oggetto di database. Verrà visualizzata un'unica voce, costituita dal percorso di DataFile.dat. Selezionare tale voce e scegliere OK. Una volta tornati alla Creazione guidata consumer OLE DB ATL, selezionare Tabella, rinominare la classe assegnando eventualmente un nome più breve, ad esempio CMyCons, quindi scegliere Fine. Generare il progetto consumer.
Aggiungere quanto riportato di seguito al codice principale del progetto:
#include "MyCons.h" int main( int argc, char* argv[] ) { // Add this code HRESULT hr = CoInitialize(NULL); CMyCons rs; hr = rs.OpenAll(); ATLASSERT( SUCCEEDED(hr)); hr = rs.MoveFirst(); while( SUCCEEDED(hr) && hr != DB_S_ENDOFROWSET ) { printf( "%d %s %s %s %s\n", rs.m_Fixed, rs.m_Command, rs.m_Text, rs.m_Command2, rs.m_Text2 ); hr = rs.MoveNext(); } rs.CloseAll(); CoUninitialize(); return 0; }
Impostare un punto di interruzione sulla funzione CoUninitialize. La console resterà aperta consentendo la visualizzazione dei risultati. Eseguire l'applicazione scegliendo Avvia oppure scegliendo Avvia senza eseguire debug dal menu Debug. Verranno stampate cinque colonne di testo, ovvero una colonna di indice e quattro colonne di testo.
Parole chiave
Nell'esempio vengono utilizzate le seguenti interfacce:
IRowsetLocateImpl, IRowsetScroll, IRowsetScrollImpl, IRowsetUpdateImpl, IConnectionPointContainerImpl, IRowsetNotifyCP, IDBCreateSessionImpl, IDBInitializeImpl, IDBPropertiesImpl, IPersistImpl, IInternalConnectionImpl, IGetDataSourceImpl, IOpenRowsetImpl, ISessionPropertiesImpl, IObjectWithSiteSessionImpl, IDBSchemaRowsetImpl, IDBCreateCommandImpl, IAccessorImpl, ICommandTextImpl, ICommandPropertiesImpl, IObjectWithSiteImpl, IConvertTypeImpl, IColumnsInfoImpl, IInternalCommandConnectionImpl
Nell'esempio vengono illustrate le seguenti classi:
CSchemaRowsetImpl, CComObjectRootEx, CComObjectRootEx, CRowsetImpl, CFileArray, CSimpleRow
Nell'esempio vengono illustrate le seguenti macro:
COM_INTERFACE_ENTRY, PROPERTY_INFO_ENTRY