Ejemplo AdvancedPV: muestra técnicas avanzadas de proveedor

Actualización: noviembre 2007

El ejemplo AdvancedPV es muy similar a UpdatePV, pero muestra algunas técnicas avanzadas.

Normalmente, los proveedores escritos mediante plantillas OLE DB utilizan CAtlArray para el almacenamiento de datos. Las plantillas de proveedor OLE DB llaman a un método Execute suministrado por el usuario para rellenar la matriz (por ejemplo, para cargar todas las filas del archivo de datos en la matriz). Otro método suministrado por el usuario, FlushData, se utiliza para guardar el contenido de la matriz (por ejemplo, para escribir el contenido de la matriz en el archivo de datos). El problema de este enfoque es que en Execute se deben cargar todas las filas del conjunto de filas, mientras que en FlushData se deben guardar todas las filas al mismo tiempo. Si existen muchas filas en el conjunto de filas, todos los datos se deberán guardar en memoria (en el objeto CAtlArray).

AdvancedPV muestra cómo utilizar una clase de matriz especial en lugar de la matriz predeterminada CAtlArray para hacer que el proveedor cargue y guarde las filas según sea necesario. Las filas se cargarán desde el archivo de datos sólo cuando realmente se soliciten (por medio de un operator[] especialmente implementado), mientras que los cambios se volverán a escribir en el archivo tan pronto como el contenido de la matriz cambie.

Nota de seguridad:

Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que quizás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para obtener ejemplos e instrucciones para su instalación:

  • En el menú Ayuda de Visual Studio, haga clic en Ejemplos.

    Para obtener más información, vea Localizar archivos de ejemplo.

  • La lista de ejemplos completa con la versión más reciente está disponible en línea en la página Visual Studio 2008 Samples.

  • También encontrará ejemplos en el disco duro de su equipo. De manera predeterminada, los ejemplos y el archivo Léame se copian en una carpeta bajo \Archivos de programa\Visual Studio 9.0\Samples\. Para las versiones Express de Visual Studio, todos los ejemplos están en línea.

Generar y ejecutar el ejemplo

Para generar y ejecutar este ejemplo

  1. Abra el archivo de solución AdvancedPV.sln.

  2. En el menú Generar, haga clic en Generar.

  3. Cree una aplicación de consola Win32 con el Asistente para proyectos Win32. Dótela de compatibilidad con ATL.

  4. Agregue un consumidor OLE DB al proyecto (en Agregar clase, seleccione Consumidor OLE DB ATL).

  5. En el Asistente para consumidores OLE DB ATL, haga clic en el botón Origen de datos y, en Propiedades de vínculo de datos, seleccione Proveedor AdvancedProv. El proveedor AdvancedProv debería registrarse automáticamente cuando genere AdvancedPV, pero si no aparece en la lista, ejecute regsvr32.exe sobre AdvancedPV.dll.

  6. Haga clic en Next para ir a la ficha Conexión y, a continuación, en Escriba el catálogo inicial para usar, especifique el catálogo inicial que se utilizará (la ruta de acceso a DataFile.dat).

  7. En Seleccionar objeto de base de datos, abra Tablas; sólo existe un elemento (la ruta de acceso al archivo DataFile.dat). Selecciónelo y haga clic en Aceptar. Cuando vuelva al Asistente para consumidores OLE DB ATL, seleccione Tabla, escriba un nombre más corto para la clase (si es necesario), como CMyCons, y haga clic en Finalizar. Genere el proyecto de consumidor.

  8. Agregue lo siguiente al código principal del proyecto:

    #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;
    }
    
  9. Coloque un punto de interrupción en la función CoUninitialize; esto hará que la consola permanezca abierta de modo que pueda ver los resultados. Ejecute la aplicación haciendo clic en el botón Iniciar (o haga clic en Iniciar sin depurar, en el menú Depurar). Debería ver cinco columnas de texto impresas (un índice y cuatro columnas de texto).

Palabras clave

Este ejemplo utiliza las siguientes interfaces:

IRowsetLocateImpl, IRowsetScroll, IRowsetScrollImpl, IRowsetUpdateImpl, IConnectionPointContainerImpl, IRowsetNotifyCP, IDBCreateSessionImpl, IDBInitializeImpl, IDBPropertiesImpl, IPersistImpl, IInternalConnectionImpl, IGetDataSourceImpl, IOpenRowsetImpl, ISessionPropertiesImpl, IObjectWithSiteSessionImpl, IDBSchemaRowsetImpl, IDBCreateCommandImpl, IAccessorImpl, ICommandTextImpl, ICommandPropertiesImpl, IObjectWithSiteImpl, IConvertTypeImpl, IColumnsInfoImpl, IInternalCommandConnectionImpl

En este ejemplo se muestra el uso de las clases siguientes:

CSchemaRowsetImpl, CComObjectRootEx, CComObjectRootEx, CRowsetImpl, CFileArray, CSimpleRow

También se usan las siguientes macros:

COM_INTERFACE_ENTRY, PROPERTY_INFO_ENTRY

Vea también

Otros recursos

Ejemplos de ATL