Métodos generados por el Asistente para consumidores
El Asistente para consumidores OLE DB ATL no está disponible en Visual Studio 2019 ni en versiones posteriores. Puede seguir agregando la funcionalidad manualmente.
El Asistente para consumidores OLE DB ATL y el Asistente para aplicaciones MFC generar ciertas funciones que debe tener en cuenta. Algunos métodos se implementan de forma diferente en los proyectos con atributos, por lo que hay algunas advertencias; cada caso se trata más adelante. Para obtener información acerca de cómo ver código insertado, vea Depurar código insertado.
OpenAll
abre el origen de datos, conjuntos de filas y activa los marcadores si están disponibles.CloseAll
cierra todos los conjuntos de filas abiertos y libera todas las ejecuciones de comandos.OpenAll
llama aOpenRowset
para abrir el conjunto de filas o los conjuntos de filas del consumidor.GetRowsetProperties
recupera un puntero a la propiedad del conjunto de filas con las propiedades que se pueden establecer.OpenDataSource
abre el origen de datos mediante la cadena de inicialización especificada en el cuadro de diálogo Propiedades de vínculo de datos.CloseDataSource
cierra el origen de datos de una manera adecuada.
OpenAll y CloseAll
HRESULT OpenAll();
void CloseAll();
El ejemplo siguiente muestra cómo se puede llamar a OpenAll
y CloseAll
cuando se ejecuta el mismo comando varias veces. Compara el código de ejemplo CCommand::Close, que muestra una variación que llama a Close
y ReleaseCommand
en lugar de 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;
}
Comentarios
Si define un método HasBookmark
, el código OpenAll
establece la propiedad DBPROP_IRowsetLocate
; asegúrese de que solo lo hace si su proveedor admite esa propiedad.
OpenRowset
// OLE DB Template version:
HRESULT OpenRowset(DBPROPSET* pPropSet = NULL)
// Attribute-injected version:
HRESULT OpenRowset(const CSession& session, LPCWSTR szCommand = NULL);
OpenAll
llama a este método para abrir el conjunto de filas en el consumidor. Normalmente, no es necesario llamar a OpenRowset
, a menos que desee trabajar con varios orígenes de datos/sesiones/conjuntos de filas. OpenRowset
se declara en el archivo de encabezado de clase de comando o tabla:
// 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;
}
Los atributos implementan este método de manera diferente. Esta versión toma un objeto de sesión y una cadena de comando cuyo valor predeterminado es la cadena de comando especificada en db_command, aunque puede pasar otro diferente. Si define un método HasBookmark
, el código OpenRowset
establece la propiedad DBPROP_IRowsetLocate
; asegúrese de que solo lo hace si su proveedor admite esa propiedad.
// 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);
Este método recupera un puntero al conjunto de propiedades del conjunto de filas; puede usar este puntero para establecer propiedades tales como DBPROP_IRowsetChange
. GetRowsetProperties
se usa en la clase de registro de usuario como se indica a continuación. Puede modificar este código para establecer las propiedades del conjunto de filas adicionales:
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);
}
Comentarios
No debe definir un método global GetRowsetProperties
porque podría entrar en conflicto con el definido por el asistente. Se trata de un método generado por el asistente que se obtiene con proyectos de plantillas y atributos. Los atributos no insertan este código.
OpenDataSource y CloseDataSource
HRESULT OpenDataSource();
void CloseDataSource();
Comentarios
El asistente define los métodos OpenDataSource
y CloseDataSource
; OpenDataSource
llama a CDataSource::OpenFromInitializationString.