Recuperar datos
Después de abrir los objetos de origen de datos, sesión y conjunto de filas, puede capturar datos. En función del tipo de descriptor de acceso que use, es posible que tenga que enlazar columnas.
Para capturar datos
Abra el conjunto de filas con el comando Open correspondiente.
Si usa
CManualAccessor
, enlace las columnas de salida si aún no lo ha hecho. El siguiente código de ejemplo está tomado del ejemplo DBViewer. Para enlazar las columnas, llame aGetColumnInfo
y cree un descriptor de acceso con los enlaces, como se muestra en el ejemplo siguiente:// From the DBViewer Sample CDBTreeView::OnQueryEdit // Get the column information ULONG ulColumns = 0; DBCOLUMNINFO* pColumnInfo = NULL; LPOLESTR pStrings = NULL; if (rs.GetColumnInfo(&ulColumns, &pColumnInfo, &pStrings) != S_OK) ThrowMyOLEDBException(rs.m_pRowset, IID_IColumnsInfo); struct MYBIND* pBind = new MYBIND[ulColumns]; rs.CreateAccessor(ulColumns, &pBind[0], sizeof(MYBIND)*ulColumns); for (ULONG l=0; l<ulColumns; l++) rs.AddBindEntry(l+1, DBTYPE_STR, sizeof(TCHAR)*40, &pBind[l].szValue, NULL, &pBind[l].dwStatus); rs.Bind();
Escriba un bucle
while
para recuperar los datos. En el bucle, llame aMoveNext
para avanzar el cursor y probar el valor devuelto con S_OK, como se muestra en el ejemplo siguiente:while (rs.MoveNext() == S_OK) { // Add code to fetch data here // If you are not using an auto accessor, call rs.GetData() }
Dentro del bucle
while
, puede capturar los datos según el tipo de descriptor de acceso.Si usa la clase CAccessor, debe tener un registro de usuario que contenga miembros de datos. Puede acceder a los datos usando esos miembros de datos, como se muestra en el ejemplo siguiente:
while (rs.MoveNext() == S_OK) { // Use the data members directly. In this case, m_nFooID // is declared in a user record that derives from // CAccessor wsprintf_s("%d", rs.m_nFooID); }
Si usa la clase
CDynamicAccessor
oCDynamicParameterAccessor
, puede capturar datos usando las funciones de accesoGetValue
yGetColumn
, como se muestra en el ejemplo siguiente. Si desea determinar el tipo de datos que está usando, utiliceGetType
.while (rs.MoveNext() == S_OK) { // Use the dynamic accessor functions to retrieve your data. ULONG ulColumns = rs.GetColumnCount(); for (ULONG i=0; i<ulColumns; i++) { rs.GetValue(i); } }
Si usa
CManualAccessor
, debe especificar sus propios miembros de datos, enlazarlos usted mismo y acceder a ellos directamente, como se muestra en el ejemplo siguiente:while (rs.MoveNext() == S_OK) { // Use the data members you specified in the calls to // AddBindEntry. wsprintf_s("%s", szFoo); }