Clase CRecordset
Representa un conjunto de registros seleccionados de un origen de datos.
Sintaxis
class CRecordset : public CObject
Miembros
Constructores públicos
Nombre | Descripción |
---|---|
CRecordset::CRecordset |
Construye un objeto CRecordset . La clase derivada debe proporcionar un constructor que llame a este. |
Métodos públicos
Nombre | Descripción |
---|---|
CRecordset::AddNew |
Prepara la adición de un nuevo registro. Llame a Update para completar la adición. |
CRecordset::CanAppend |
Devuelve un valor distinto de cero si se pueden agregar nuevos registros al conjunto de registros a través de la función miembro AddNew . |
CRecordset::CanBookmark |
Devuelve un valor distinto de cero si el conjunto de registros admite marcadores. |
CRecordset::Cancel |
Cancela una operación asincrónica o un proceso de un segundo subproceso. |
CRecordset::CancelUpdate |
Cancela las actualizaciones pendientes debido a una operación AddNew o Edit . |
CRecordset::CanRestart |
Devuelve un valor distinto de cero si se puede llamar a Requery para volver a ejecutar la consulta del conjunto de registros. |
CRecordset::CanScroll |
Devuelve un valor distinto de cero si puede desplazarse por los registros. |
CRecordset::CanTransact |
Devuelve un valor distinto de cero si el origen de datos admite transacciones. |
CRecordset::CanUpdate |
Devuelve un valor distinto de cero si se puede actualizar el conjunto de registros (se pueden agregar, actualizar o eliminar registros). |
CRecordset::CheckRowsetError |
Se llama a este método para controlar los errores generados durante la captura de registros. |
CRecordset::Close |
Cierra el conjunto de registros y el objeto HSTMT ODBC asociado a él. |
CRecordset::Delete |
Elimina el registro actual del conjunto de registros. Debe desplazarse explícitamente a otro registro tras la eliminación. |
CRecordset::DoBulkFieldExchange |
Se llama a este método para intercambiar filas masivas de datos desde el origen de datos al conjunto de registros. Implementa el intercambio masivo de campos de registro (RFX masivo). |
CRecordset::DoFieldExchange |
Se llama a este método para intercambiar datos (en ambas direcciones) entre los miembros de datos de campo del conjunto de registros y el registro correspondiente en el origen de datos. Implementa el intercambio de campos de registro (RFX). |
CRecordset::Edit |
Prepara la implementación de cambios en el registro actual. Llame a Update para completar los cambios. |
CRecordset::FlushResultSet |
Devuelve un valor distinto de cero si hay otro conjunto de resultados que se va a recuperar, cuando se usa una consulta predefinida. |
CRecordset::GetBookmark |
Asigna el valor de marcador de un registro al objeto de parámetro. |
CRecordset::GetDefaultConnect |
Se llama a este método para obtener la cadena de conexión predeterminada. |
CRecordset::GetDefaultSQL |
Se llama a este método para obtener la cadena SQL predeterminada que se va a ejecutar. |
CRecordset::GetFieldValue |
Devuelve el valor de un campo de un conjunto de registros. |
CRecordset::GetODBCFieldCount |
Devuelve el número de campos del conjunto de registros. |
CRecordset::GetODBCFieldInfo |
Devuelve tipos específicos de información sobre los campos de un conjunto de registros. |
CRecordset::GetRecordCount |
Devuelve el número de registros del conjunto de registros. |
CRecordset::GetRowsetSize |
Devuelve el número de registros que desea recuperar durante una misma captura. |
CRecordset::GetRowsFetched |
Devuelve el número real de filas recuperadas durante una captura. |
CRecordset::GetRowStatus |
Devuelve el estado de la fila después de una captura. |
CRecordset::GetSQL |
Obtiene la cadena SQL que se usa para seleccionar registros del conjunto de registros. |
CRecordset::GetStatus |
Obtiene el estado del conjunto de registros, el índice del registro actual y si se ha obtenido un recuento final de los registros. |
CRecordset::GetTableName |
Obtiene el nombre de la tabla en la que se basa el conjunto de registros. |
CRecordset::IsBOF |
Devuelve un valor distinto de cero si el conjunto de registros se ha colocado antes del primer registro. No hay registro actual. |
CRecordset::IsDeleted |
Devuelve un valor distinto de cero si el conjunto de registros se coloca en un registro eliminado. |
CRecordset::IsEOF |
Devuelve un valor distinto de cero si el conjunto de registros se ha colocado después del último registro. No hay registro actual. |
CRecordset::IsFieldDirty |
Devuelve un valor distinto de cero si el campo especificado en el registro actual ha cambiado. |
CRecordset::IsFieldNull |
Devuelve un valor distinto de cero si el campo especificado en el registro actual es NULL (no tiene ningún valor). |
CRecordset::IsFieldNullable |
Devuelve un valor distinto de cero si el campo especificado en el registro actual se puede establecer en NULL (no tiene ningún valor). |
CRecordset::IsOpen |
Devuelve un valor distinto de cero si se ha llamado anteriormente a Open . |
CRecordset::Move |
Coloca el conjunto de registros en un número especificado de registros a partir del registro actual, en cualquier dirección. |
CRecordset::MoveFirst |
Coloca el registro actual en el primer registro del conjunto de registros. Pruebe IsBOF primero. |
CRecordset::MoveLast |
Coloca el registro actual en el último registro o en el último conjunto de filas. Pruebe IsEOF primero. |
CRecordset::MoveNext |
Coloca el registro actual en el siguiente registro o en el siguiente conjunto de filas. Pruebe IsEOF primero. |
CRecordset::MovePrev |
Coloca el registro actual en el registro anterior o en el conjunto de filas anterior. Pruebe IsBOF primero. |
CRecordset::OnSetOptions |
Se llama a este método para establecer opciones (usadas al seleccionar) de la instrucción ODBC especificada. |
CRecordset::OnSetUpdateOptions |
Se llama a este método para establecer opciones (usadas al actualizar) de la instrucción ODBC especificada. |
CRecordset::Open |
Abre el conjunto de registros recuperando la tabla o realizando la consulta que el conjunto de registros representa. |
CRecordset::RefreshRowset |
Actualiza los datos y el estado de las filas especificadas. |
CRecordset::Requery |
Ejecuta de nuevo la consulta del conjunto de registros para actualizar los registros seleccionados. |
CRecordset::SetAbsolutePosition |
Coloca el conjunto de registros en el registro correspondiente al número de registro especificado. |
CRecordset::SetBookmark |
Coloca el conjunto de registros en el registro especificado por el marcador. |
CRecordset::SetFieldDirty |
Marca el campo especificado en el registro actual como cambiado. |
CRecordset::SetFieldNull |
Establece el valor del campo especificado en el registro actual en NULL (sin valor). |
CRecordset::SetLockingMode |
Establece el modo de bloqueo en bloqueo "optimista" (valor predeterminado) o "pesimista". Determina cómo se bloquean los registros para las actualizaciones. |
CRecordset::SetParamNull |
Establece el parámetro especificado en NULL (sin valor). |
CRecordset::SetRowsetCursorPosition |
Coloca el cursor en la fila especificada dentro del conjunto de filas. |
CRecordset::SetRowsetSize |
Especifica el número de registros que desea recuperar durante una captura. |
CRecordset::Update |
Completa una operación AddNew o Edit guardando los datos nuevos o editados en el origen de datos. |
Miembros de datos públicos
Nombre | Descripción |
---|---|
CRecordset::m_hstmt |
Contiene el identificador de instrucción ODBC del conjunto de registros. Escriba HSTMT . |
CRecordset::m_nFields |
Contiene el número de miembros de datos de campo en el conjunto de registros. Escriba UINT . |
CRecordset::m_nParams |
Contiene el número de miembros de datos de parámetro en el conjunto de registros. Escriba UINT . |
CRecordset::m_pDatabase |
Contiene un puntero al objeto CDatabase a través del cual el conjunto de registros está conectado a un origen de datos. |
CRecordset::m_strFilter |
Contiene un objeto CString que especifica una cláusula WHERE de Lenguaje de consulta estructurado (SQL). Se usa como filtro para seleccionar solo los registros que cumplan determinados criterios. |
CRecordset::m_strSort |
Contiene un objeto CString que especifica una cláusula ORDER BY de SQL. Se usa para controlar cómo se ordenan los registros. |
Comentarios
Los objetos CRecordset
, que se conocen como "conjuntos de registros", se suelen usar en dos formatos: conjuntos de registros dinámicos e instantáneas. Un conjunto de registros dinámicos permanece sincronizado con las actualizaciones de datos realizadas por otros usuarios. Una instantánea es una vista estática de los datos. Cada forma representa un conjunto de registros fijo en el momento en que se abre el conjunto de registros. Cuando se desplaza a un registro de un conjunto de registros dinámicos, se reflejan los cambios realizados en el registro, ya sea por otros usuarios o por otros conjuntos de registros de la aplicación.
Nota:
Si trabaja con clases de objetos de acceso a datos (DAO) en vez de con clases de conectividad abierta de bases de datos (ODBC), use la clase CDaoRecordset
en su lugar. Para obtener más información, vea Información general: programación de bases de datos.
Para trabajar con cualquier tipo de conjunto de registros, normalmente se deriva una clase de conjunto de registros específica de la aplicación de CRecordset
. Los conjuntos de registros seleccionan registros de un origen de datos, tras lo cual se puede hacer lo siguiente:
Desplazarse por los registros.
Actualizar los registros y especificar un modo de bloqueo
Filtrar el conjunto de registros para restringir qué registros se seleccionan de los que hay disponibles en el origen de datos
Ordenar el conjunto de registros.
Parametrizar el conjunto de registros para personalizar su selección con información no conocida hasta el tiempo de ejecución
Para usar su clase, abra una base de datos y construya un objeto de conjunto de registros, pasando el constructor un puntero al objeto CDatabase
. Luego, llame a la función miembro Open
del conjunto de registros, donde puede especificar si el objeto es un conjunto de registros dinámicos o una instantánea. La llamada a Open
selecciona datos del origen de datos. Una vez abierto el objeto de conjunto de registros, use sus funciones miembro y miembros de datos para desplazarse por los registros y operar en ellos. Las operaciones disponibles dependen de si el objeto es un conjunto de registros dinámicos o una instantánea, de si se puede actualizar o es de solo lectura (esto depende de la funcionalidad del origen de datos de conectividad abierta de bases de datos) y de si ha implementado la captura masiva de filas. Para actualizar los registros que puedan haber cambiado o que se hayan agregado desde la llamada a Open
, llame a la función miembro del objeto Requery
. Llame a la función miembro del objeto Close
y destruya el objeto cuando termine con ella.
En una clase CRecordset
derivada, el intercambio de campos de registro (RFX) o el intercambio masivo de campos de registro (RFX masivo) se usa para admitir la lectura y actualización de los campos de registro.
Para obtener más información sobre los conjuntos de registros y el intercambio de campos de registro, vea los artículos Información general: programación de bases de datos, Conjunto de registros (ODBC), Conjunto de registros: obtener registros de forma masiva bloque (ODBC) e Intercambio de campos de registro (RFX). Para centrarse en los conjuntos de registros dinámicos y en las instantáneas, vea los artículos Conjunto de registros dinámicos e Instantánea.
Jerarquía de herencia
CRecordset
Requisitos
Encabezado: afxdb.h
CRecordset::AddNew
Prepara la adición de un nuevo registro a la tabla.
virtual void AddNew();
Comentarios
Debe llamar a la función miembro Requery
para ver el registro recién agregado. Los campos del registro son NULL inicialmente. (en la terminología de bases de datos, NULL significa "sin valor"; no es lo mismo que NULL en C++). Para completar la operación, debe llamar a la función miembro Update
. Update
guarda los cambios en el origen de datos.
Nota:
Si ha implementado la captura masiva de filas, no puede llamar a AddNew
. Si lo hace, dará lugar a una aserción con errores. Aunque la clase CRecordset
no proporciona un mecanismo para actualizar filas masivas de datos, puede escribir sus propias funciones mediante la función SQLSetPos
de la API ODBC. Para más información sobre la obtención masiva de filas, vea Conjunto de registros: obtener registros de forma masiva (ODBC).
AddNew
prepara un registro nuevo y vacío usando los miembros de datos de campo del conjunto de registros. Después de llamar a AddNew
, establezca los valores que desee en los miembros de datos de campo del conjunto de registros (para ello, no hay que llamar a la función miembro Edit; use Edit
solo con los registros existentes). Cuando se llama a Update
, los valores modificados en los miembros de datos del campo se guardan en el origen de datos.
Precaución
Si se desplaza a un nuevo registro antes de llamar a Update
, el nuevo registro se pierde y no se muestra ninguna advertencia.
Si el origen de datos admite transacciones, puede incluir la llamada a AddNew
como parte de una transacción. Para obtener más información sobre las transacciones, vea la clase CDatabase
. Llame a CDatabase::BeginTrans
antes de llamar a AddNew
.
Nota:
En los conjuntos de registros dinámicos, los nuevos registros se agregan al conjunto de registros como último registro. Los registros agregados no se agregan a instantáneas; deberá llamar a Requery
para actualizar el conjunto de registros.
No se puede llamar a AddNew
en relación con un conjunto de registros a cuya función miembro Open
no se ha llamado. Si se llama a AddNew
en relación con un conjunto de registros al que no se puede anexar, se produce una excepción CDBException
. Para determinar si el conjunto de registros se puede actualizar, llame a CanAppend
.
Para obtener más información, vea los siguientes artículos: Conjunto de registros: cómo actualizan registros los conjuntos de registros (ODBC), Conjunto de registros: agregar, actualizar y eliminar registros (ODBC) y Transacción (ODBC).
Ejemplo
Vea Transacción: realizar una transacción en un conjunto de registros (ODBC).
CRecordset::CanAppend
Determina si el conjunto de registros abierto anteriormente permite agregar nuevos registros.
BOOL CanAppend() const;
Valor devuelto
Distinto de cero si el conjunto de registros permite agregar nuevos registros; de lo contrario, 0. CanAppend
devolverá 0 si abrió el conjunto de registros como de solo lectura.
CRecordset::CanBookmark
Determina si el conjunto de registros permite marcar registros mediante marcadores.
BOOL CanBookmark() const;
Valor devuelto
Distinto de cero si el conjunto de registros admite marcadores; de lo contrario, 0.
Comentarios
Esta función es independiente de la opción CRecordset::useBookmarks
del parámetro dwOptions
de la función miembro Open
. CanBookmark
indica si el controlador ODBC y el tipo de cursor especificados admiten marcadores. CRecordset::useBookmarks
indica si va a haber marcadores disponibles, siempre que se admitan.
Nota:
Los marcadores no se admiten en conjuntos de registros de solo avance.
Para obtener más información sobre los marcadores y la navegación por el conjunto de registros, vea los artículos Conjunto de registros: marcadores y posiciones absolutas (ODBC) y Conjunto de registros: desplazamiento (ODBC).
CRecordset::Cancel
Solicita que el origen de datos cancele una operación asincrónica en curso o un proceso de un segundo subproceso.
void Cancel();
Comentarios
Las clases ODBC de MFC ya no usan procesamiento asincrónico; para realizar una operación asincrónica, debe llamar directamente a la función SQLSetConnectOption
de API odbc . Para obtener más información, vea la sección sobre cómo ejecutar funciones de forma asincrónica de la guía del programador del SDK de ODBC.
CRecordset::CancelUpdate
Cancela las actualizaciones pendientes, debido a una operación Edit
o AddNew
, antes de llamar a Update
.
void CancelUpdate();
Comentarios
Nota:
Esta función miembro no es aplicable a los conjuntos de registros que usan la captura masiva de filas, ya que estos conjuntos de registros no pueden llamar a Edit
, AddNew
o Update
. Para más información sobre la obtención masiva de filas, vea Conjunto de registros: obtener registros de forma masiva (ODBC).
Si la comprobación automática de campos con modificaciones está habilitada, CancelUpdate
restaurará las variables miembro a los valores que tenían antes de que se llamara a Edit
o a AddNew
; de lo contrario, los cambios de valor permanecerán. De forma predeterminada, la comprobación automática de campos se habilita cuando se abre el conjunto de registros. Para deshabilitarla, debe especificar un valor CRecordset::noDirtyFieldCheck
en el parámetro dwOptions
de la función miembro Open.
Para obtener más información sobre cómo actualizar datos, vea Conjunto de registros: agregar, actualizar y eliminar registros (ODBC).
CRecordset::CanRestart
Determina si el conjunto de registros permite reiniciar la consulta (para actualizar sus registros) mediante una llamada a la función miembro Requery
.
BOOL CanRestart() const;
Valor devuelto
Un valor distinto de cero si se puede volver a realizar la consulta; de lo contrario, 0.
CRecordset::CanScroll
Determina si el conjunto de registros permite el desplazamiento.
BOOL CanScroll() const;
Valor devuelto
Un valor distinto de cero si el conjunto de registros permite el desplazamiento; de lo contrario, 0.
Comentarios
Para obtener más información sobre cómo desplazarse, vea Conjunto de registros: desplazamiento (ODBC).
CRecordset::CanTransact
Determina si el conjunto de registros permite las transacciones.
BOOL CanTransact() const;
Valor devuelto
Un valor distinto de cero si el conjunto de registros permite las transacciones; de lo contrario, 0.
Comentarios
Para obtener más información, vea Transacción (ODBC).
CRecordset::CanUpdate
Determina si se puede actualizar el conjunto de registros.
BOOL CanUpdate() const;
Valor devuelto
Un valor distinto de cero si el conjunto de registros se puede actualizar; de lo contrario, 0.
Comentarios
Un conjunto de registros puede ser de solo lectura si el origen de datos subyacente es de solo lectura o si especificó CRecordset::readOnly
en el parámetro dwOptions
al abrir el conjunto de registros.
CRecordset::CheckRowsetError
Se llama a este método para controlar los errores generados durante la captura de registros.
virtual void CheckRowsetError(RETCODE nRetCode);
Parámetros
nRetCode
Código de retorno de una función de API ODBC. Para conocer más detalles, vea la sección Comentarios.
Comentarios
Esta función miembro virtual controla los errores que se producen cuando se capturan registros, y resulta útil durante la captura masiva de filas. Puede que le convenga considerar la posibilidad de invalidar CheckRowsetError
para implementar su propio control de errores.
En una operación de navegación de cursor, como Open
, Requery
o cualquier operación Move
, se llama a CheckRowsetError
automáticamente. Se pasa el valor devuelto de la función de API ODBC SQLExtendedFetch
. En la siguiente tabla se muestran los posibles valores del parámetro nRetCode
.
nRetCode | Descripción |
---|---|
SQL_SUCCESS |
La función se completó correctamente. No hay más información disponible. |
SQL_SUCCESS_WITH_INFO |
La función se completó correctamente, posiblemente con un error no irrecuperable. Se puede obtener más información llamando a SQLError . |
SQL_NO_DATA_FOUND |
Se han capturado todas las filas del conjunto de resultados. |
SQL_ERROR |
Se ha producido un error en la función. Se puede obtener más información llamando a SQLError . |
SQL_INVALID_HANDLE |
Se ha producido un error en la función debido a un identificador de entorno, de conexión o de instrucción no válido. Esto indica un error de programación. No hay más información disponible de SQLError . |
SQL_STILL_EXECUTING |
Una función que se inició de forma asincrónica sigue ejecutándose. De forma predeterminada, MFC nunca pasará este valor a CheckRowsetError ; MFC seguirá llamando a SQLExtendedFetch hasta que deje de devolver SQL_STILL_EXECUTING . |
Consulte Windows SDK para obtener más información sobre SQLError
. Para más información sobre la obtención masiva de filas, vea Conjunto de registros: obtener registros de forma masiva (ODBC).
CRecordset::Close
Cierra el conjunto de registros.
virtual void Close();
Comentarios
El código HSTMT
ODBC y toda la memoria asignada al conjunto de registros se desasignan. Normalmente, después de llamar a Close
se elimina el objeto de conjunto de registros de C++, si se asignó con new
.
Puede volver a llamar a Open
después de llamar a Close
. Esto le permitirá usar el objeto de conjunto de registros. La alternativa es llamar a Requery
.
Ejemplo
// Construct a snapshot object
CCustomer rsCustSet(NULL);
if (!rsCustSet.Open())
return;
// Use the snapshot ...
// Close the snapshot
rsCustSet.Close();
// Destructor is called when the function exits
CRecordset::CRecordset
Construye un objeto CRecordset
.
CRecordset(CDatabase* pDatabase = NULL);
Parámetros
pDatabase
Contiene un puntero a un objeto CDatabase
o el valor NULL
. Si no es NULL
y no se ha llamado a la función miembro Open
del objeto CDatabase
para conectarlo al origen de datos, el conjunto de registros intenta abrirlo automáticamente durante la llamada a Open
en sí. Si se pasa NULL
, se crea un objeto CDatabase
y se conecta automáticamente usando la información del origen de datos que se especificó al derivar la clase del conjunto de registros con ClassWizard.
Comentarios
Se puede usar CRecordset
directamente o derivar una clase específica de la aplicación de CRecordset
. Se puede usar ClassWizard para derivar las clases del conjunto de registros.
Nota:
Una clase derivada debe proporcionar su propio constructor. En el constructor de la clase derivada, llame al constructor CRecordset::CRecordset
, pasándole los parámetros adecuados.
Pase NULL
al constructor del conjunto de registros para construir un objeto CDatabase
y conectarlo automáticamente. Se trata de un método rápido bastante útil que no requiere construir y conectar un objeto CDatabase
antes de construir el conjunto de registros.
Ejemplo
Para obtener más información, vea Conjunto de registros: declarar una clase para una tabla (ODBC).
CRecordset::Delete
Elimina el registro actual.
virtual void Delete();
Comentarios
Después de una eliminación correcta, los miembros de datos de campo del conjunto de registros se establecen en un valor NULL y se debe llamar explícitamente a una de las funciones Move
para retirar el registro eliminado. Una vez retirado el registro eliminado, no es posible volver a él. Si el origen de datos admite transacciones, puede incluir la llamada a Delete
como parte de una transacción. Para obtener más información, vea Transacción (ODBC).
Nota:
Si ha implementado la captura masiva de filas, no puede llamar a Delete
. Si lo hace, dará lugar a una aserción con errores. Aunque la clase CRecordset
no proporciona un mecanismo para actualizar filas masivas de datos, puede escribir sus propias funciones mediante la función SQLSetPos
de la API ODBC. Para más información sobre la obtención masiva de filas, vea Conjunto de registros: obtener registros de forma masiva (ODBC).
Precaución
El conjunto de registros debe poder actualizarse y debe haber un registro válido actualmente en el conjunto de registros cuando se llame a Delete
; de lo contrario, se produce un error. Por ejemplo, si elimina un registro pero no se desplaza a uno nuevo antes de volver a llamar a Delete
, Delete
inicia una excepción CDBException.
A diferencia de AddNew
y Edit
, una llamada a Delete
no va seguida de una llamada a Update
. Si se produce un error en una llamada a Delete
, los miembros de datos de campo permanecen inalterados.
Ejemplo
En este ejemplo se muestra un conjunto de registros creado en el marco de una función. En el ejemplo se da por sentada la existencia de m_dbCust
, una variable miembro de tipo CDatabase
que ya está conectada al origen de datos.
// Create a derived CRecordset object
CCustomer rsCustSet(&m_dbCust);
rsCustSet.Open();
if (rsCustSet.IsEOF() || !rsCustSet.CanUpdate() ||
!rsCustSet.CanTransact())
{
return;
}
m_dbCust.BeginTrans();
// Perhaps scroll to a new record...
// Delete the current record
rsCustSet.Delete();
// Finished commands for this transaction
if (IDYES == AfxMessageBox(_T("Commit transaction?"), MB_YESNO))
m_dbCust.CommitTrans();
else // User changed mind
m_dbCust.Rollback();
CRecordset::DoBulkFieldExchange
Se llama a este método para intercambiar filas masivas de datos desde el origen de datos al conjunto de registros. Implementa el intercambio masivo de campos de registro (RFX masivo).
virtual void DoBulkFieldExchange(CFieldExchange* pFX);
Parámetros
pFX
Puntero a un objeto CFieldExchange
. El marco ya habrá configurado este objeto para especificar un contexto para la operación de intercambio de campos.
Comentarios
Cuando se implementa la captura masiva de filas, el marco llama a esta función miembro para transferir automáticamente datos desde el origen de datos al objeto de conjunto de registros. DoBulkFieldExchange
también enlaza los miembros de datos de parámetros (si los hay) a marcadores de posición de parámetro en la cadena de instrucción SQL para la selección del conjunto de registros.
Si no se implementa la captura masiva de filas, el marco llama a DoFieldExchange
. Para implementar la captura masiva de filas, se debe especificar la opción CRecordset::useMultiRowFetch
en el parámetro dwOptions de la función miembro Open
.
Nota:
DoBulkFieldExchange
solo está disponible si se usa una clase derivada de CRecordset
. Si ha creado un objeto de conjunto de registros directamente desde CRecordset
, debe llamar a la función miembro GetFieldValue
para recuperar datos.
El intercambio masivo de campos de registro (RFX masivo) es similar al intercambio de campos de registro (RFX). Los datos se transfieren automáticamente desde el origen de datos al objeto de conjunto de registros. Sin embargo, no se puede llamar a AddNew
, Edit
, Delete
ni Update
para transferir los cambios de vuelta al origen de datos. Actualmente, la clase CRecordset
no proporciona un mecanismo para actualizar filas de datos masivas, pero puede escribir sus propias funciones mediante la función de la API ODBC SQLSetPos
.
ClassWizard no admite el intercambio masivo de campos de registro; por lo tanto, debe invalidar DoBulkFieldExchange
manualmente escribiendo llamadas a las funciones de RFX masivo. Para obtener más información sobre estas funciones, vea Funciones de intercambio de campos de registros.
Para más información sobre la obtención masiva de filas, vea Conjunto de registros: obtener registros de forma masiva (ODBC). Para obtener información relacionada, vea Intercambio de campos de registros (RFX).
CRecordset::DoFieldExchange
Se llama a este método para intercambiar datos (en ambas direcciones) entre los miembros de datos de campo del conjunto de registros y el registro correspondiente en el origen de datos. Implementa el intercambio de campos de registro (RFX).
virtual void DoFieldExchange(CFieldExchange* pFX);
Parámetros
pFX
Puntero a un objeto CFieldExchange
. El marco ya habrá configurado este objeto para especificar un contexto para la operación de intercambio de campos.
Comentarios
Cuando no se implementa la captura masiva de filas, el marco llama a esta función miembro para intercambiar automáticamente datos entre los miembros de datos de campo del objeto de conjunto de registros y las columnas correspondientes del registro actual en el origen de datos. DoFieldExchange
también enlaza los miembros de datos de parámetros (si los hay) a marcadores de posición de parámetro en la cadena de instrucción SQL para la selección del conjunto de registros.
Si se implementa la captura masiva de filas, el marco llama a DoBulkFieldExchange
. Para implementar la captura masiva de filas, se debe especificar la opción CRecordset::useMultiRowFetch
en el parámetro dwOptions
de la función miembro Open
.
Nota:
DoFieldExchange
solo está disponible si se usa una clase derivada de CRecordset
. Si ha creado un objeto de conjunto de registros directamente desde CRecordset
, debe llamar a la función miembro GetFieldValue para recuperar datos.
El intercambio de datos de campo, denominado intercambio de campos de registro (RFX), funciona en ambas direcciones: de los miembros de datos de campo del objeto de conjunto de registros a los campos del registro del origen de datos, y del registro del origen de datos al objeto de conjunto de registros.
Normalmente, la única acción que debe realizar para implementar DoFieldExchange
para la clase de conjunto de registros derivada es crear la clase con ClassWizard y especificar los nombres y los tipos de datos de los miembros de datos de campo. También puede agregar código a lo que ClassWizard escriba para especificar miembros de datos de parámetros o para tratar las columnas enlazadas dinámicamente. Para más información, consulte Conjunto de registros: enlazar dinámicamente columnas de datos (ODBC).
Al declarar la clase de conjunto de registros derivada con ClassWizard, el asistente escribe una invalidación de DoFieldExchange
automáticamente, que se parece al ejemplo siguiente:
void CCustomer::DoFieldExchange(CFieldExchange* pFX)
{
pFX->SetFieldType(CFieldExchange::outputColumn);
// Macros such as RFX_Text() and RFX_Int() are dependent on the
// type of the member variable, not the type of the field in the database.
// ODBC will try to automatically convert the column value to the requested type
RFX_Long(pFX, _T("[CustomerID]"), m_CustomerID);
RFX_Text(pFX, _T("[ContactFirstName]"), m_ContactFirstName);
RFX_Text(pFX, _T("[PostalCode]"), m_PostalCode);
RFX_Text(pFX, _T("[L_Name]"), m_L_Name);
RFX_Long(pFX, _T("[BillingID]"), m_BillingID);
pFX->SetFieldType(CFieldExchange::inputParam);
RFX_Text(pFX, _T("Param"), m_strParam);
}
Para obtener más información sobre las funciones RFX, vea Funciones de intercambio de campos de registros.
Para obtener más ejemplos y detalles sobre DoFieldExchange
, vea Intercambio de campos de registros: funcionamiento de RFX. Para obtener información general sobre RFX, vea Intercambio de campos de registros.
CRecordset::Edit
Permite realizar cambios en el registro actual.
virtual void Edit();
Comentarios
Después de llamar a Edit
, puede cambiar los miembros de datos de campo restableciendo directamente sus valores. La operación se completa cuando se llama a la función miembro Update
para guardar los cambios en el origen de datos.
Nota:
Si ha implementado la captura masiva de filas, no puede llamar a Edit
. Si lo hace, dará lugar a una aserción con errores. Aunque la clase CRecordset
no proporciona un mecanismo para actualizar filas masivas de datos, puede escribir sus propias funciones mediante la función SQLSetPos
de la API ODBC. Para más información sobre la obtención masiva de filas, vea Conjunto de registros: obtener registros de forma masiva (ODBC).
Edit
guarda los valores de los miembros de datos del conjunto de registros. Si llama a Edit
, realice cambios y vuelva a llamar a Edit
. Los valores del registro se restauran a como estaban antes de la primera llamada a Edit
.
En algunos casos, posiblemente sea conveniente actualizar una columna haciendo que sea NULL (esto es, no contiene datos). Para ello, llame a SetFieldNull
con un parámetro TRUE para marcar el campo como NULL; esto también hace que la columna se actualice. Si quiere que un campo se escriba en el origen de datos aunque su valor no haya cambiado, llame a SetFieldDirty
con un parámetro TRUE. Esto funciona incluso cuando el campo tenía el valor NULL.
Si el origen de datos admite transacciones, puede incluir la llamada a Edit
como parte de una transacción. Llame a CDatabase::BeginTrans
antes de llamar a Edit
y después de abrir el conjunto de registros. Además, llamar a CDatabase::CommitTrans
no es un sustituto de llamar a Update
para completar la operación Edit
. Para obtener más información sobre las transacciones, vea la clase CDatabase
.
Dependiendo del modo de bloqueo actual, el registro que se está actualizando puede estar bloqueado por Edit
hasta que se llame a Update
o se desplace a otro registro, o bien puede bloquearse solo durante la llamada a Edit
. El modo de bloqueo se puede cambiar con SetLockingMode
.
El valor anterior del registro actual se restaura si se desplaza a un nuevo registro antes de llamar a Update
. Se produce una excepción CDBException
si se llama a Edit
en un conjunto de registros que no se puede actualizar o si no hay ningún registro actual.
Para obtener más información, vea los artículos Transacción (ODBC) y Conjunto de registros: bloquear registros (ODBC).
Ejemplo
// To edit a record, first set up the edit buffer
rsCustSet.Edit();
// Then edit field data members for the record
rsCustSet.m_BillingID = 2795;
rsCustSet.m_ContactFirstName = _T("Jones Mfg");
// Finally, complete the operation
if (!rsCustSet.Update())
{
// Handle the failure to update
AfxMessageBox(_T("Couldn't update record!"));
}
CRecordset::FlushResultSet
Recupera el siguiente conjunto de resultados de una consulta predefinida (procedimiento almacenado) si hay varios conjuntos de resultados.
BOOL FlushResultSet();
Valor devuelto
Un valor distinto de cero si hay más conjuntos de resultados que se van a recuperar; de lo contrario, 0.
Comentarios
Solo debe llamar a FlushResultSet
cuando haya terminado con el cursor en el conjunto de resultados actual. Cuando se recupera el siguiente conjunto de resultados llamando a FlushResultSet
, el cursor no es válido en ese conjunto de resultados; debe llamar a la función miembro MoveNext
después de llamar a FlushResultSet
.
Si una consulta predefinida usa un parámetro de salida o parámetros de entrada/salida, debe llamar a FlushResultSet
hasta que devuelva FALSE
(un valor 0) para obtener estos valores de parámetro.
FlushResultSet
llama a la función de API ODBC SQLMoreResults
. Si SQLMoreResults
devuelve SQL_ERROR
o SQL_INVALID_HANDLE
, FlushResultSet
producirá una excepción. Consulte Windows SDK para obtener más información sobre SQLMoreResults
.
Si quiere llamar a FlushResultSet
, el procedimiento almacenado debe tener campos enlazados.
Ejemplo
En el código siguiente se da por hecho que COutParamRecordset
es un objeto derivado de CRecordset
basado en una consulta predefinida con un parámetro de entrada y un parámetro de salida, y que tiene varios conjuntos de resultados. Observe la estructura de la invalidación de DoFieldExchange
.
// DoFieldExchange override
//
// Only necessary to handle parameter bindings.
// Don't use CRecordset-derived class with bound
// fields unless all result sets have same schema
// OR there is conditional binding code.
void CCourses::DoFieldExchange(CFieldExchange* pFX)
{
pFX->SetFieldType(CFieldExchange::outputParam);
RFX_Long(pFX, _T("Param1"), m_nCountParam);
// The "Param1" name here is a dummy name
// that is never used
pFX->SetFieldType(CFieldExchange::inputParam);
RFX_Text(pFX, _T("Param2"), m_strNameParam);
// The "Param2" name here is a dummy name
// that is never used
}
// Assume db is an already open CDatabase object
CCourses rs(&m_dbCust);
rs.m_strNameParam = _T("History");
// Get the first result set
// NOTE: SQL Server requires forwardOnly cursor
// type for multiple rowset returning stored
// procedures
rs.Open(CRecordset::forwardOnly,
_T("{? = CALL GetCourses( ? )}"),
CRecordset::readOnly);
// Loop through all the data in the first result set
while (!rs.IsEOF())
{
CString strFieldValue;
for (short nIndex = 0; nIndex < rs.GetODBCFieldCount(); nIndex++)
{
rs.GetFieldValue(nIndex, strFieldValue);
// TO DO: Use field value string.
}
rs.MoveNext();
}
// Retrieve other result sets...
while (rs.FlushResultSet())
{
// must call MoveNext because cursor is invalid
rs.MoveNext();
while (!rs.IsEOF())
{
CString strFieldValue;
for (short nIndex = 0; nIndex < rs.GetODBCFieldCount(); nIndex++)
{
rs.GetFieldValue(nIndex, strFieldValue);
// TO DO: Use field value string.
}
rs.MoveNext();
}
}
// All result sets have been flushed. Cannot
// use the cursor, but the output parameter,
// m_nCountParam, has now been written.
// Note that m_nCountParam is not valid until
// CRecordset::FlushResultSet has returned FALSE,
// indicating no more result sets will be returned.
// TO DO: Use m_nCountParam
// Cleanup
rs.Close();
CRecordset::GetBookmark
Obtiene el valor de marcador del registro actual.
void GetBookmark(CDBVariant& varBookmark);
Parámetros
varBookmark
Referencia a un objeto CDBVariant
que representa el marcador en el registro actual.
Comentarios
Llame a CanBookmark
para determinar si se admiten marcadores en el conjunto de registros. Para que los marcadores estén disponibles (si se admiten), debe establecer la opción CRecordset::useBookmarks
en el parámetro dwOptions
de la función miembro Open
.
Nota:
Si no se admiten marcadores o no están disponibles, la llamada a GetBookmark
producirá una excepción. Los marcadores no se admiten en conjuntos de registros de solo avance.
GetBookmark
asigna el valor del marcador del registro actual a un objeto CDBVariant
. Para volver a ese registro en cualquier momento después de pasar a otro registro, llame a SetBookmark
con el objeto CDBVariant
correspondiente.
Nota:
Después de determinadas operaciones del conjunto de registros, es posible que los marcadores dejen de ser válidos. Por ejemplo, si llama a GetBookmark
seguido de Requery
, es posible que no pueda volver al registro con SetBookmark
. Llame a CDatabase::GetBookmarkPersistence
para comprobar si puede llamar a SetBookmark
de forma segura.
Para obtener más información sobre los marcadores y la navegación por el conjunto de registros, vea los artículos Conjunto de registros: marcadores y posiciones absolutas (ODBC) y Conjunto de registros: desplazamiento (ODBC).
CRecordset::GetDefaultConnect
Se llama a este método para obtener la cadena de conexión predeterminada.
virtual CString GetDefaultConnect();
Valor devuelto
Un valor de tipo CString
que contiene la cadena de conexión predeterminada.
Comentarios
El marco llama a esta función miembro para obtener la cadena de conexión predeterminada del origen de datos en el que se basa el conjunto de registros. ClassWizard
implementa esta función identificando el mismo origen de datos que se usa en ClassWizard
para obtener información sobre las tablas y las columnas. Usar esta conexión predeterminada mientras desarrolla la aplicación probablemente le resulte conveniente, pero seguramente esta conexión predeterminada no sea adecuada para los usuarios de la aplicación. Si es así, debe volver a implementar esta función, descartando la versión de ClassWizard
. Para obtener más información sobre las cadenas de conexión Origen de datos (ODBC).
CRecordset::GetDefaultSQL
Se llama a este método para obtener la cadena SQL predeterminada que se va a ejecutar.
virtual CString GetDefaultSQL();
Valor devuelto
Un valor de tipo CString
que contiene la instrucción SQL predeterminada.
Comentarios
El marco llama a esta función miembro para obtener la instrucción SQL predeterminada en la que se basa el conjunto de registros. Puede ser un nombre de tabla o una instrucción SQL SELECT
.
La instrucción SQL predeterminada se define indirectamente al declarar la clase de conjunto de registros con ClassWizard
, tarea que ClassWizard
realiza automáticamente.
Si necesita la cadena de instrucción SQL para uso propio, llame a GetSQL
, que devuelve la instrucción SQL utilizada para seleccionar los registros del conjunto de registros cuando se abrió. La cadena SQL predeterminada se puede editar en la invalidación de GetDefaultSQL
de la clase. Por ejemplo, se podría especificar una llamada a una consulta predefinida mediante una instrucción CALL
(no obstante, cabe reseñar que si GetDefaultSQL
se edita, también habrá que modificar m_nFields
para que coincida con el número de columnas del origen de datos).
Para obtener más información, vea Conjunto de registros: declarar una clase para una tabla (ODBC).
Precaución
El nombre de la tabla estará vacío si el marco no pudo identificar un nombre de tabla, si se proporcionaron varios nombres de tabla o si una instrucción CALL
no se pudo interpretar. Cuando use una instrucción CALL
, no inserte espacios en blanco entre la llave y la palabra clave CALL
, ni tampoco antes de la llave o de la palabra clave SELECT
en una instrucción SELECT
.
CRecordset::GetFieldValue
Recupera datos de campo en el registro actual.
void GetFieldValue(
LPCTSTR lpszName,
CDBVariant& varValue,
short nFieldType = DEFAULT_FIELD_TYPE);
void GetFieldValue(
LPCTSTR lpszName,
CStringA& strValue
);
void GetFieldValue(
LPCTSTR lpszName,
CStringW& strValue
);
void GetFieldValue(
short nIndex,
CDBVariant& varValue,
short nFieldType = DEFAULT_FIELD_TYPE);
void GetFieldValue(
short nIndex,
CStringA& strValue);
void GetFieldValue(
short nIndex,
CStringW& strValue);
Parámetros
lpszName
El nombre de un campo.
varValue
Referencia a un objeto CDBVariant
que almacenará el valor del campo.
nFieldType
Tipo de datos de C ODBC del campo. Mediante el valor predeterminado, DEFAULT_FIELD_TYPE
, se fuerza a GetFieldValue
a determinar el tipo de datos de C del tipo de datos SQL, según la siguiente tabla. De lo contrario, el tipo de datos se puede especificar directamente o elegir un tipo de datos compatible; por ejemplo, en SQL_C_CHAR
se puede almacenar cualquier tipo de datos.
tipo de datos C | tipo de datos de SQL |
---|---|
SQL_C_BIT |
SQL_BIT |
SQL_C_UTINYINT |
SQL_TINYINT |
SQL_C_SSHORT |
SQL_SMALLINT |
SQL_C_SLONG |
SQL_INTEGER |
SQL_C_FLOAT |
SQL_REAL |
SQL_C_DOUBLE |
SQL_FLOATSQL_DOUBLE |
SQL_C_TIMESTAMP |
SQL_DATESQL_TIMESQL_TIMESTAMP |
SQL_C_CHAR |
SQL_NUMERICSQL_DECIMALSQL_BIGINTSQL_CHARSQL_VARCHARSQL_LONGVARCHAR |
SQL_C_BINARY |
SQL_BINARYSQL_VARBINARYSQL_LONGVARBINARY |
Para obtener más información sobre los tipos de datos ODBC, vea los temas sobre los tipos de datos SQL y los tipos de datos de C en el Apéndice D de Windows SDK.
nIndex
Índice de base cero de un campo.
strValue
Referencia a un objeto CString
que almacenará el valor del campo convertido en texto, independientemente del tipo de datos del campo.
Comentarios
Un campo se puede buscar por nombre o por índice. El valor de campo se puede almacenar en un objeto CDBVariant
o en un objeto CString
.
Si se ha implementado la captura masiva de filas, el registro actual siempre se coloca como primer registro de un conjunto de filas. Para usar GetFieldValue
en un registro dentro de un conjunto de filas determinado, primero debe llamar a la función miembro SetRowsetCursorPosition
para mover el cursor a la fila deseada dentro de ese conjunto de filas. A continuación, llame a GetFieldValue
para esa fila. Para implementar la captura masiva de filas, se debe especificar la opción CRecordset::useMultiRowFetch
en el parámetro dwOptions
de la función miembro Open
.
Puede usar GetFieldValue
para capturar dinámicamente campos en tiempo de ejecución en lugar de enlazarlos estáticamente en tiempo de diseño. Por ejemplo, si ha declarado un objeto de conjunto de registros directamente desde CRecordset
, debe usar GetFieldValue
para recuperar los datos del campo. El intercambio de campos de registros (RFX) o el intercambio masivo de campos de registro (RFX masivo) no se implementa.
Nota:
Si declara un objeto de conjunto de registros sin derivarlo de CRecordset
, no tenga cargada la biblioteca de cursores ODBC. Esta biblioteca de cursores requiere que el conjunto de registros tenga al menos una columna enlazada, pero cuando CRecordset
se usa directamente, ninguna de las columnas está enlazada. Las funciones miembro CDatabase::OpenEx
y CDatabase::Open
controlan si se va a cargar la biblioteca de cursores.
GetFieldValue
llama a la función de API ODBC SQLGetData
. Si el controlador genera el valor SQL_NO_TOTAL como longitud real del valor del campo, GetFieldValue
produce una excepción. Consulte Windows SDK para obtener más información sobre SQLGetData
.
Ejemplo
En el siguiente código de ejemplo se muestran las llamadas a GetFieldValue
de un objeto de conjunto de registros declarado directamente desde CRecordset
.
// Create and open a database object;
// do not load the cursor library
CDatabase db;
db.OpenEx(NULL, CDatabase::forceOdbcDialog);
// Create and open a recordset object
// directly from CRecordset. Note that a
// table must exist in a connected database.
// Use forwardOnly type recordset for best
// performance, since only MoveNext is required
CRecordset rs(&db);
rs.Open(CRecordset::forwardOnly, _T("SELECT * FROM Customer"));
// Create a CDBVariant object to
// store field data
CDBVariant varValue;
// Loop through the recordset,
// using GetFieldValue and
// GetODBCFieldCount to retrieve
// data in all columns
short nFields = rs.GetODBCFieldCount();
while (!rs.IsEOF())
{
for (short index = 0; index < nFields; index++)
{
rs.GetFieldValue(index, varValue);
// do something with varValue
}
rs.MoveNext();
}
rs.Close();
db.Close();
Nota:
A diferencia de la clase de DAO CDaoRecordset
, CRecordset
no tiene una función miembro SetFieldValue
. Si crea un objeto directamente desde CRecordset
, será de solo lectura de facto.
Para más información sobre la obtención masiva de filas, vea Conjunto de registros: obtener registros de forma masiva (ODBC).
CRecordset::GetODBCFieldCount
Recupera el número total de campos del objeto de conjunto de registros.
short GetODBCFieldCount() const;
Valor devuelto
El número de campos del conjunto de registros.
Comentarios
Para obtener más información sobre cómo crear conjuntos de registros, vea Conjunto de registros: crear y cerrar conjuntos de registros (ODBC).
CRecordset::GetODBCFieldInfo
Obtiene información sobre los campos del conjunto de registros.
void GetODBCFieldInfo(
LPCTSTR lpszName,
CODBCFieldInfo& fieldinfo);
void GetODBCFieldInfo(
short nIndex,
CODBCFieldInfo& fieldinfo);
Parámetros
lpszName
El nombre de un campo.
fieldinfo
Referencia a una estructura CODBCFieldInfo
.
nIndex
Índice de base cero de un campo.
Comentarios
Una versión de la función permite buscar un campo por nombre. La otra versión permite buscar un campo por índice.
Para obtener una descripción sobre la información devuelta, vea la estructura CODBCFieldInfo
.
Para obtener más información sobre cómo crear conjuntos de registros, vea Conjunto de registros: crear y cerrar conjuntos de registros (ODBC).
CRecordset::GetRecordCount
Determina el tamaño del conjunto de registros.
long GetRecordCount() const;
Valor devuelto
Número de registros en el conjunto de registros; 0 si el conjunto de registros no contiene ningún registro, o -1 si el número de registros no se puede determinar.
Comentarios
Precaución
El recuento de registros se mantiene como una "marca de agua alta"; el registro numerado más alto se sigue viendo a medida que el usuario va desplazándose por los registros. El número total de registros solo se conoce después de que el usuario haya ido más allá del último registro. Por motivos de rendimiento, el recuento no se actualiza cuando se llama a MoveLast
. Para contar los registros por sí mismo, llame a MoveNext
repetidamente hasta que IsEOF
devuelva un valor distinto de cero. Agregar un registro a través de CRecordset:AddNew
y Update
aumenta el recuento, mientras que eliminar un registro a través de CRecordset::Delete
lo reduce.
CRecordset::GetRowsetSize
Obtiene la configuración actual del número de filas que desea recuperar durante una captura determinada.
DWORD GetRowsetSize() const;
Valor devuelto
Número de filas que se van a recuperar durante una captura determinada.
Comentarios
Si usa la captura masiva de filas, el tamaño predeterminado del conjunto de filas cuando se abre el conjunto de registros es 25; de lo contrario, es 1.
Para implementar la captura masiva de filas, se debe especificar la opción CRecordset::useMultiRowFetch
en el parámetro dwOptions
de la función miembro Open
. Para cambiar el valor del tamaño del conjunto de filas, llame a SetRowsetSize
.
Para más información sobre la obtención masiva de filas, vea Conjunto de registros: obtener registros de forma masiva (ODBC).
CRecordset::GetRowsFetched
Determina cuántos registros se han recuperado después de una captura.
DWORD GetRowsFetched() const;
Valor devuelto
Número de filas recuperadas del origen de datos tras una captura determinada.
Comentarios
Esto es útil cuando se ha implementado la captura masiva de filas. El tamaño del conjunto de filas suele indicar cuántas filas se van a recuperar en una captura. Sin embargo, el número total de filas del conjunto de registros también afecta al número de filas que se van a recuperar en un conjunto de filas. Por ejemplo, si el conjunto de registros tiene 10 registros con un valor de tamaño de conjunto de filas de 4, el recorrido en bucle por el conjunto de registros llamando a MoveNext
tendrá como consecuencia que el conjunto de filas final va a tener solo dos registros.
Para implementar la captura masiva de filas, se debe especificar la opción CRecordset::useMultiRowFetch
en el parámetro dwOptions de la función miembro Open
. Para especificar el tamaño del conjunto de filas, llame a SetRowsetSize.
Para más información sobre la obtención masiva de filas, vea Conjunto de registros: obtener registros de forma masiva (ODBC).
Ejemplo
CMultiCustomer rs(&m_dbCust);
// Set the rowset size
rs.SetRowsetSize(5);
// Open the recordset
rs.Open(CRecordset::dynaset, NULL, CRecordset::useMultiRowFetch);
// loop through the recordset by rowsets
while (!rs.IsEOF())
{
for (int rowCount = 0; rowCount < (int)rs.GetRowsFetched(); rowCount++)
{
// do something
}
rs.MoveNext();
}
rs.Close();
CRecordset::GetRowStatus
Obtiene el estado de una fila del conjunto de filas actual.
WORD GetRowStatus(WORD wRow) const;
Parámetros
wRow
Posición, según un índice de base 1, de una fila del conjunto de filas actual. Este valor puede oscilar entre 1 y el tamaño del conjunto de filas.
Valor devuelto
Valor de estado de la fila. Para conocer más detalles, vea la sección Comentarios.
Comentarios
GetRowStatus
devuelve un valor que indica bien un cambio de estado en la fila desde que se recuperó por última vez del origen de datos, bien que no se capturó ninguna fila correspondiente a wRow
. La tabla siguiente muestra los valores devueltos posibles.
Valor de estado | Descripción |
---|---|
SQL_ROW_SUCCESS |
La fila no ha cambiado. |
SQL_ROW_UPDATED |
La fila se ha actualizado. |
SQL_ROW_DELETED |
Se ha eliminado la fila. |
SQL_ROW_ADDED |
La fila se ha añadido. |
SQL_ROW_ERROR |
La fila no se puede recuperar debido a un error. |
SQL_ROW_NOROW |
No hay ninguna fila que corresponda a wRow . |
Para obtener más información, vea la función de API ODBC SQLExtendedFetch
en Windows SDK.
CRecordset::GetStatus
Determina el índice del registro actual en el conjunto de registros y si se ha visto el último registro.
void GetStatus(CRecordsetStatus& rStatus) const;
Parámetros
rStatus
Referencia a un objeto CRecordsetStatus
. Para obtener más información, vea Comentarios.
Comentarios
CRecordset
intenta realizar un seguimiento del índice, pero en algunas circunstancias puede que esto no sea posible. Vea GetRecordCount
para obtener una explicación.
La estructura CRecordsetStatus
tiene la siguiente forma:
struct CRecordsetStatus
{
long m_lCurrentRecord;
BOOL m_bRecordCountFinal;
};
Los dos miembros de CRecordsetStatus
tienen los siguientes significados:
m_lCurrentRecord
Contiene el índice de base cero del registro actual en el conjunto de registros, si se conoce. Si no se puede determinar el índice, este miembro contieneAFX_CURRENT_RECORD_UNDEFINED
(-2). SiIsBOF
es TRUE (el conjunto de registros está vacío o ha habido un intento de desplazarse antes del primer registro),m_lCurrentRecord
se establece enAFX_CURRENT_RECORD_BOF
(-1). Si se está en el primer registro, se establece en 0, si se está en el segundo, en 1, y así sucesivamente.m_bRecordCountFinal
Valor distinto de cero si se ha determinado el número total de registros del conjunto de registros. Por lo general, esto debe realizarse empezando por el principio del conjunto de registros y llamando aMoveNext
hasta queIsEOF
devuelve un valor distinto de cero. Si el valor de este miembro es cero, el recuento de registros devuelto porGetRecordCount
, si no es -1, es solo un recuento de "marca de agua alta" de los registros.
CRecordset::GetSQL
Llame a esta función miembro para obtener la instrucción SQL que se usó para seleccionar los registros del conjunto de registros cuando se abrió.
const CString& GetSQL() const;
Valor devuelto
Referencia de const
a un objeto CString
que contiene la instrucción SQL.
Comentarios
Por lo general, se trata de una instrucción SQL SELECT
. La cadena devuelta por GetSQL
es de solo lectura.
La cadena devuelta por GetSQL
suele ser diferente de cualquier cadena que pueda haber pasado al conjunto de registros en el parámetro lpszSQL
a la función miembro Open
. Esto se debe a que el conjunto de registros crea una instrucción SQL completa en función de lo que se ha pasado a Open
, de lo que se ha especificado con ClassWizard
, de lo que se haya podido especificar en los miembros de datos m_strFilter
y m_strSort
y de cualquier parámetro que se haya especificado. Para obtener información detallada sobre cómo el conjunto de registros construye esta instrucción SQL, vea Conjunto de registros: cómo actualizan registros los conjuntos de registros (ODBC).
Nota:
Llame a esta función miembro solo después de llamar a Open
.
CRecordset::GetTableName
Obtiene el nombre de la tabla SQL en la que se basa la consulta del conjunto de registros.
const CString& GetTableName() const;
Valor devuelto
Referencia de const
a un objeto CString
que contiene el nombre de la tabla, si el conjunto de registros se basa en una tabla; de lo contrario, una cadena vacía.
Comentarios
GetTableName
solo es válido si el conjunto de registros se basa en una tabla, y no en una combinación de varias tablas o en una consulta predefinida (procedimiento almacenado). El nombre es de solo lectura.
Nota:
Llame a esta función miembro solo después de llamar a Open
.
CRecordset::IsBOF
Devuelve un valor distinto de cero si el conjunto de registros se ha colocado antes del primer registro. No hay registro actual.
BOOL IsBOF() const;
Valor devuelto
Un valor distinto de cero si el conjunto de registros no contiene registros o si el usuario se ha desplazado de vuelta antes del primer registro; de lo contrario, 0.
Comentarios
Llame a esta función miembro antes de desplazarse de un registro a otro para saber si ha ido antes del primer registro del conjunto de registros. También se puede usar IsBOF
junto con IsEOF
para determinar si el conjunto de registros contiene registros o si está vacío. Inmediatamente después de llamar a Open
, si el conjunto de registros no contiene registros, IsBOF
devuelve un valor distinto de cero. Cuando se abre un conjunto de registros que tiene al menos un registro, el primer registro es el registro actual y IsBOF
devuelve 0.
Si el primer registro es el registro actual y se llama a MovePrev
, IsBOF
devolverá un valor distinto de cero. Si IsBOF
devuelve un valor distinto de cero y se llama a MovePrev
, se produce un error. Si IsBOF
devuelve un valor distinto de cero, el registro actual no está definido, y cualquier acción que requiera un registro actual producirá un error.
Ejemplo
En este ejemplo se usa IsBOF
y IsEOF
para detectar los límites de un conjunto de registros a medida que el código se desplaza por el conjunto de registros en ambas direcciones.
// Open a recordset; first record is current
// Open a recordset; first record is current
CCustomer rsCustSet(&m_dbCust);
rsCustSet.Open();
if(rsCustSet.IsBOF())
return;
// The recordset is empty
// Scroll to the end of the recordset, past
// the last record, so no record is current
while (!rsCustSet.IsEOF())
rsCustSet.MoveNext();
// Move to the last record
rsCustSet.MoveLast();
// Scroll to beginning of the recordset, before
// the first record, so no record is current
while(!rsCustSet.IsBOF())
rsCustSet.MovePrev();
// First record is current again
rsCustSet.MoveFirst();
CRecordset::IsDeleted
Determina si se ha eliminado el registro actual.
BOOL IsDeleted() const;
Valor devuelto
Un valor distinto de cero si el conjunto de registros se coloca en un registro eliminado; de lo contrario, 0.
Comentarios
Si se desplaza a un registro y IsDeleted
devuelve TRUE
(un valor distinto de cero), deberá desplazarse a otro registro para poder realizar cualquier otra operación de conjunto de registros.
El resultado de IsDeleted
depende de muchos factores, como el tipo del conjunto de registros, si el conjunto de registros se puede actualizar, si se ha especificado la opción CRecordset::skipDeletedRecords
al abrir el conjunto de registros, si los paquetes de controladores han eliminado registros y si hay varios usuarios.
Para obtener más información sobre CRecordset::skipDeletedRecords
y los paquetes de controladores, vea la función miembro Open.
Nota:
Si se ha implementado la captura masiva de filas, se desaconseja llamar a IsDeleted
. En su lugar, llame a la función miembro GetRowStatus. Para más información sobre la obtención masiva de filas, vea Conjunto de registros: obtener registros de forma masiva (ODBC).
CRecordset::IsEOF
Devuelve un valor distinto de cero si el conjunto de registros se ha colocado después del último registro. No hay registro actual.
BOOL IsEOF() const;
Valor devuelto
Un valor distinto de cero si el conjunto de registros no contiene registros o si el usuario se ha desplazado más allá del último registro; de lo contrario, 0.
Comentarios
Llame a esta función miembro a medida que se desplaza de un registro a otro para saber si ha ido más allá del último registro del conjunto de registros. También se puede usar IsEOF
para determinar si el conjunto de registros contiene registros o si está vacío. Inmediatamente después de llamar a Open
, si el conjunto de registros no contiene registros, IsEOF
devuelve un valor distinto de cero. Cuando se abre un conjunto de registros que tiene al menos un registro, el primer registro es el registro actual y IsEOF
devuelve 0.
Si el último registro es el registro actual cuando se llama a MoveNext
, IsEOF
devolverá un valor distinto de cero. Si IsEOF
devuelve un valor distinto de cero y se llama a MoveNext
, se produce un error. Si IsEOF
devuelve un valor distinto de cero, el registro actual no está definido, y cualquier acción que requiera un registro actual producirá un error.
Ejemplo
Vea el ejemplo de IsBOF
.
CRecordset::IsFieldDirty
Determina si el miembro de datos de campo especificado ha cambiado desde que se llamó a Edit
o a AddNew
.
BOOL IsFieldDirty(void* pv);
Parámetros
pv
Puntero al miembro de datos de campo cuyo estado desea comprobar, o NULL
para determinar si alguno de los campos tiene modificaciones.
Valor devuelto
Un valor distinto de cero si el miembro de datos de campo especificado ha cambiado desde que se llamó a AddNew
o a Edit
; de lo contrario, 0.
Comentarios
Los datos de todos los miembros de datos de campos con modificaciones se transferirán al registro en el origen de datos cuando el registro actual se actualice mediante una llamada a la función miembro Update
de CRecordset
(después de una llamada a Edit
o a AddNew
).
Nota:
Esta función miembro no se puede usar en conjuntos de registros que usen la captura masiva de filas. Si ha implementado la captura masiva de filas, IsFieldDirty
siempre devolverá FALSE y generará una aserción con errores. Para más información sobre la obtención masiva de filas, vea Conjunto de registros: obtener registros de forma masiva (ODBC).
La llamada a IsFieldDirty
restablecerá los efectos de las llamadas anteriores a SetFieldDirty, ya que se vuelve a evaluar el estado modificado del campo. En el caso de AddNew
, si el valor del campo actual difiere del valor "pseudo-NULL", el estado del campo se establece como con modificaciones. En el caso de Edit
, si el valor del campo difiere del valor almacenado en caché, el estado del campo se establece como con modificaciones.
IsFieldDirty
se implementa a través de DoFieldExchange
.
Para obtener más información sobre el marcador de modificado, vea Conjunto de registros: cómo actualizan registros los conjuntos de registros (ODBC).
CRecordset::IsFieldNull
Devuelve un valor distinto de cero si el campo especificado en el registro actual es NULL (no tiene ningún valor).
BOOL IsFieldNull(void* pv);
Parámetros
pv
Puntero al miembro de datos de campo cuyo estado desea comprobar, o NULL
para determinar si alguno de los campos es NULL.
Valor devuelto
Un valor distinto de cero si el miembro de datos de campo especificado se marca como NULL; de lo contrario, 0.
Comentarios
Llame a esta función miembro para determinar si el miembro de datos de campo especificado de un conjunto de registros se ha marcado como NULL (en la terminología de bases de datos, NULL significa "sin valor"; no es lo mismo que NULL
en C++). Si un miembro de datos de campo se marca como NULL, se interpreta como una columna del registro actual en la que no hay ningún valor.
Nota:
Esta función miembro no se puede usar en conjuntos de registros que usen la captura masiva de filas. Si ha implementado la captura masiva de filas, IsFieldNull
siempre devolverá FALSE
y generará una aserción con errores. Para más información sobre la obtención masiva de filas, vea Conjunto de registros: obtener registros de forma masiva (ODBC).
IsFieldNull
se implementa a través de DoFieldExchange
.
CRecordset::IsFieldNullable
Devuelve un valor distinto de cero si el campo especificado en el registro actual se puede establecer en NULL (no tiene ningún valor).
BOOL IsFieldNullable(void* pv);
Parámetros
pv
Puntero al miembro de datos de campo cuyo estado desea comprobar, o NULL
para determinar si alguno de los campos se puede establecer en un valor NULL.
Comentarios
Llame a esta función miembro para determinar si el miembro de datos de campo especificado "acepta valores NULL" (es decir, se puede establecer en un valor NULL; en C++, NULL
no es lo mismo que NULL en la terminología de bases de datos, que significa "sin valor").
Nota:
Si ha implementado la captura masiva de filas, no puede llamar a IsFieldNullable
. En su lugar, llame a la función miembro GetODBCFieldInfo
para determinar si un campo se puede establecer en un valor NULL. Siempre se puede llamar a GetODBCFieldInfo
, independientemente de si se ha implementado la captura masiva de filas. Para más información sobre la obtención masiva de filas, vea Conjunto de registros: obtener registros de forma masiva (ODBC).
Un campo que no puede ser NULL debe tener un valor. Si intenta establecer un campo de este tipo en NULL al agregar o actualizar un registro, el origen de datos rechaza la adición o actualización y Update
producirá una excepción. La excepción se produce cuando se llama a Update
, no cuando se llama a SetFieldNull
.
Si se usa NULL
como primer argumento de la función, esta solo se aplicará a los campos outputColumn
, no a los campos param
. Por ejemplo, la llamada
SetFieldNull(NULL);
establecerá únicamente los campos outputColumn
en NULL
; los campos param
no se verán afectados.
Para trabajar en los campos param
, debe proporcionar la dirección real del campo param
individual en el que quiera trabajar, como:
SetFieldNull(&m_strParam);
Esto significa que no se pueden establecer todos los campos param
en NULL
, cosa que sí es factible con los campos outputColumn
.
IsFieldNullable
se implementa a través de DoFieldExchange.
CRecordset::IsOpen
Determina si el conjunto de registros ya está abierto.
BOOL IsOpen() const;
Valor devuelto
Un valor distinto de cero si se ha llamado previamente a la función miembro Open
o Requery
del objeto de conjunto de registros y el conjunto de registros no se ha cerrado; de lo contrario, 0.
CRecordset::m_hstmt
Contiene un identificador de la estructura de datos de la instrucción ODBC, de tipo HSTMT
, asociado al conjunto de registros.
Comentarios
Cada consulta a un origen de datos ODBC está asociada a un objeto HSTMT
.
Precaución
No use m_hstmt
antes de llamar a Open
.
Por lo general, acceder a HSTMT
directamente no es necesario, pero es posible que lo necesite para la ejecución directa de instrucciones SQL. La función miembro ExecuteSQL
de la clase CDatabase
proporciona un ejemplo de uso de m_hstmt
.
CRecordset::m_nFields
Contiene el número de miembros de datos de campo de la clase del conjunto de registros; es decir, el número de columnas que el conjunto de registros ha seleccionado en el origen de datos.
Comentarios
El constructor de la clase de conjunto de registros debe inicializar m_nFields
con el número correcto. Si no ha implementado la captura masiva de filas, ClassWizard
escribe esta inicialización automáticamente cuando la usa para declarar la clase de conjunto de registros. También se puede escribir manualmente.
El marco usa este número para administrar la interacción entre los miembros de datos de campo y las columnas correspondientes del registro actual en el origen de datos.
Precaución
Este número debe corresponder al número de "columnas de salida" registradas en DoFieldExchange
o en DoBulkFieldExchange
después de una llamada a SetFieldType
con el parámetro CFieldExchange::outputColumn
.
Las columnas se pueden enlazar dinámicamente, como se explica en el artículo "Conjunto de registros: enlazar dinámicamente columnas de datos". Si lo hace, debe aumentar el número en m_nFields
de forma que refleje el número de llamadas a funciones de RFX o RFX masivo en la función miembro DoFieldExchange
o DoBulkFieldExchange
de las columnas enlazadas dinámicamente.
Para obtener más información, vea los artículos Conjunto de registros: enlazar dinámicamente columnas de datos (ODBC) y Conjunto de registros: obtener registros de forma masiva (ODBC).
Ejemplo
Vea Intercambio de campos de registros: uso de RFX.
CRecordset::m_nParams
Contiene el número de miembros de datos de parámetros en la clase de conjunto de registros; es decir, el número de parámetros pasados con la consulta del conjunto de registros.
Comentarios
Si la clase de conjunto de registros tiene miembros de datos de parámetros, el constructor de la clase debe inicializar m_nParams
con el número correcto. El valor predeterminado de m_nParams
es 0. Si agrega miembros de datos de parámetros (algo que debe hacer manualmente), también debe agregar manualmente una inicialización en el constructor de clase para reflejar el número de parámetros (que debe ser como mínimo igual que el número de marcadores de posición " en la cadena m_strFilter
o m_strSort
).
El marco usa este número cuando parametriza la consulta del conjunto de registros.
Precaución
Este número debe corresponder al número de "parámetros" registrados en DoFieldExchange
o en DoBulkFieldExchange
después de una llamada a SetFieldType
con un valor de parámetro de CFieldExchange::inputParam
, CFieldExchange::param
, CFieldExchange::outputParam
o CFieldExchange::inoutParam
.
Ejemplo
Vea los artículos Conjunto de registros: parametrización de un conjunto de registros (ODBC) e Intercambio de campos de registros: uso de RFX.
CRecordset::m_pDatabase
Contiene un puntero al objeto CDatabase
a través del cual el conjunto de registros está conectado a un origen de datos.
Comentarios
Esta variable se establece de dos formas. Normalmente, se pasa un puntero a un objeto CDatabase
ya conectado al construir el objeto de conjunto de registros. Si se pasa NULL
en su lugar, CRecordset
crea un objeto CDatabase
automáticamente y lo conecta. En cualquier caso, CRecordset
almacena el puntero en esta variable.
Por lo general, no es necesario usar directamente el puntero almacenado en m_pDatabase
. Sin embargo, si escribe sus propias extensiones en CRecordset
, puede que tenga que usarlo. Por ejemplo, es posible que necesite el puntero si inicia sus propias excepciones CDBException
, o si necesita hacer algo con el mismo objeto CDatabase
, como ejecutar transacciones, establecer tiempos de espera o llamar a la función miembro ExecuteSQL
de la clase CDatabase
para ejecutar instrucciones SQL directamente.
CRecordset::m_strFilter
Después de construir el objeto de conjunto de registros, pero antes de llamar a su función miembro Open
, use este miembro de datos para almacenar un objeto CString
que contiene una cláusula SQL WHERE
.
Comentarios
El conjunto de registros usa esta cadena para restringir (o filtrar) los registros que se seleccionan durante la llamada a Open
o a Requery
. Esto resulta útil para seleccionar un subconjunto de registros, como "todos los vendedores de California" ("state = CA"). La sintaxis SQL ODBC de una cláusula WHERE
es:
WHERE search-condition
No incluya la palabra clave WHERE
en la cadena. El marco la suministra.
También puede parametrizar la cadena de filtro colocando marcadores de posición " en ella, declarando un miembro de datos de parámetros en la clase para cada marcador de posición y pasando parámetros al conjunto de registros en tiempo de ejecución. Esto permite crear el filtro en tiempo de ejecución. Para más información, vea Conjunto de registros: Parametrizar un conjunto de registros (ODBC).
Para obtener más información sobre las cláusulas SQL WHERE
, vea SQL. Para obtener más información sobre cómo seleccionar y filtrar registros, vea Conjunto de registros: filtrar registros (ODBC).
Ejemplo
CCustomer rsCustSet(&m_dbCust);
// Set the filter
rsCustSet.m_strFilter = _T("L_Name = 'Flanders'");
// Run the filtered query
rsCustSet.Open(CRecordset::snapshot, _T("Customer"));
CRecordset::m_strSort
Después de construir el objeto de conjunto de registros, pero antes de llamar a su función miembro Open
, use este miembro de datos para almacenar un objeto CString
que contiene una cláusula SQL ORDER BY
.
Comentarios
El conjunto de registros usa esta cadena para ordenar los registros que se seleccionan durante la llamada a Open
o a Requery
. Puede usar esta característica para ordenar un conjunto de registros en una o varias columnas. La sintaxis SQL ODBC de una cláusula ORDER BY
es:
ORDER BY sort-specification [, sort-specification]...
donde "sort-specification" es un entero o un nombre de columna. También puede especificar un orden ascendente o descendente (el orden es ascendente de forma predeterminada), anexando para ello "ASC" o "DESC" a la lista de columnas de la cadena de ordenación. Los registros seleccionados se ordenan primero por la primera columna indicada, después por la segunda, etc. Por ejemplo, puede solicitar un conjunto de registros "Clientes" por apellido y, a continuación, por nombre. El número de columnas que se pueden mostrar depende del origen de datos. Para obtener más información, vea Windows SDK.
No incluya la palabra clave ORDER BY
en la cadena. El marco la suministra.
Para obtener más información sobre las cláusulas SQL, vea SQL. Para obtener más información sobre cómo ordenar registros, vea Conjunto de registros: ordenar registros (ODBC).
Ejemplo
CCustomer rsCustSet(&m_dbCust);
// Set the sort string
rsCustSet.m_strSort = _T("L_Name, ContactFirstName");
// Run the sorted query
rsCustSet.Open(CRecordset::snapshot, _T("Customer"));
CRecordset::Move
Mueve el puntero de registro actual dentro del conjunto de registros, ya sea hacia delante o hacia atrás.
virtual void Move(
long nRows,
WORD wFetchType = SQL_FETCH_RELATIVE);
Parámetros
nRows
Número de filas que se van a mover hacia delante o hacia atrás. Los valores positivos mueven hacia delante, hacia el final del conjunto de registros Los valores negativos se mueven hacia atrás, hacia el principio.
wFetchType
Determina el conjunto de filas que Move
va a capturar. Para conocer más detalles, vea la sección Comentarios.
Comentarios
Si se pasa un valor de 0 en nRows
, Move
actualiza el registro actual; Move
finalizará cualquier modo AddNew
o Edit
actual y restaurará el valor del registro actual antes de llamar a AddNew
o a Edit
.
Nota:
Al desplazarse por un conjunto de registros, no se pueden omitir los registros eliminados. Vea CRecordset::IsDeleted
para obtener más información. Cuando CRecordset
se abre con la opción skipDeletedRecords
establecida, Move
se impone si el parámetro nRows
es 0. Este comportamiento impide que se actualicen las filas que otras aplicaciones cliente que usan los mismos datos eliminan. Vea el parámetro dwOption
en Open
para obtener una descripción de skipDeletedRecords
.
Move
cambia la posición del conjunto de registros por conjuntos de filas. En función de los valores de nRows
y wFetchType
, Move
captura el conjunto de filas adecuado y, a continuación, convierte el primer registro de ese conjunto de filas en el registro actual. Si no se ha implementado la captura masiva de filas, el tamaño del conjunto de filas siempre es 1. Al capturar un conjunto de filas, Move
llama directamente a la función miembro CheckRowsetError
para controlar los errores resultantes de la captura.
Según los valores que se pasen, Move
equivale a otras funciones miembro CRecordset
. En concreto, el valor de wFetchType
puede indicar una función miembro más intuitiva y, a menudo, el método preferido para mover el registro actual.
En la siguiente tabla se enumeran los valores posibles para wFetchType
, el conjunto de filas que Move
capturará en función de wFetchType
y de nRows
, y cualquier función miembro equivalente correspondiente a wFetchType
.
wFetchType | Conjunto de filas capturado | Función miembro equivalente |
---|---|---|
SQL_FETCH_RELATIVE (valor predeterminado) |
Conjunto de filas que comienza nRows filas a partir de la primera fila del conjunto de filas actual. |
|
SQL_FETCH_NEXT |
El siguiente conjunto de filas; nRows se omite. |
MoveNext |
SQL_FETCH_PRIOR |
El conjunto de filas anterior; nRows se omite. |
MovePrev |
SQL_FETCH_FIRST |
Primer conjunto de filas del conjunto de registros; nRows se omite. |
MoveFirst |
SQL_FETCH_LAST |
Último conjunto de filas completo del conjunto de registros; nRows se omite. |
MoveLast |
SQL_FETCH_ABSOLUTE |
Si nRows > es 0, el conjunto de filas que comienza nRows filas a partir del inicio del conjunto de registros. Si nRows < es 0, el conjunto de filas que comienza nRows filas desde el final del conjunto de registros. Si nRows es = 0, se devuelve una condición de principio de archivo (BOF). |
SetAbsolutePosition |
SQL_FETCH_BOOKMARK |
Conjunto de filas que comienza en la fila cuyo valor de marcador corresponde a nRows . |
SetBookmark |
Nota:
En el caso de los conjuntos de registros de solo avance, Move
solo es válido con un valor de SQL_FETCH_NEXT
para wFetchType
.
Precaución
Al llamar a Move
se produce una excepción si el conjunto de registros no tiene registros. Para determinar si el conjunto de registros tiene registros, llame a IsBOF
y a IsEOF
.
Nota:
Si se ha desplazado más allá del principio o final del conjunto de registros (IsBOF
o IsEOF
devuelve un valor distinto de cero), llamar a una función Move
posiblemente producirá una excepción CDBException
. Por ejemplo, si IsEOF
devuelve un valor distinto de cero y IsBOF
no, MoveNext
producirá una excepción, pero MovePrev
no.
Nota:
Si llama a Move
mientras el registro actual se actualiza o se agrega, las actualizaciones se pierden sin previo aviso.
Para obtener más información sobre la navegación por el conjunto de registros, vea los artículos Conjunto de registros: desplazamiento (ODBC) y Conjunto de registros: marcadores y posiciones absolutas (ODBC). Para más información sobre la obtención masiva de filas, vea Conjunto de registros: obtener registros de forma masiva (ODBC). Para obtener información relacionada, vea la función de API ODBC SQLExtendedFetch
en Windows SDK.
Ejemplo
// rs is a CRecordset or a CRecordset-derived object
// Change the rowset size to 5
rs.SetRowsetSize(5);
// Open the recordset
rs.Open(CRecordset::dynaset, NULL, CRecordset::useMultiRowFetch);
// Move to the first record in the recordset
rs.MoveFirst();
// Move to the sixth record
rs.Move(5);
// Other equivalent ways to move to the sixth record:
rs.Move(6, SQL_FETCH_ABSOLUTE);
rs.SetAbsolutePosition(6);
// In this case, the sixth record is the first record in the next rowset,
// so the following are also equivalent:
rs.MoveFirst();
rs.Move(1, SQL_FETCH_NEXT);
rs.MoveFirst();
rs.MoveNext();
CRecordset::MoveFirst
Convierte el primer registro en el primer conjunto de filas del registro actual.
void MoveFirst();
Comentarios
Independientemente de si se ha implementado la captura masiva de filas, siempre será el primer registro del conjunto de registros.
No es necesario llamar a MoveFirst
inmediatamente después de abrir el conjunto de registros. En ese momento, el primer registro (si existe) es automáticamente el registro actual.
Nota:
Esta función miembro no es válida en los conjuntos de registros de solo avance.
Nota:
Al desplazarse por un conjunto de registros, no se pueden omitir los registros eliminados. Consulte la función miembro IsDeleted
para obtener información más detallada.
Precaución
Al llamar a cualquiera de las funciones Move
, se produce una excepción si el conjunto de registros no tiene registros. Para determinar si el conjunto de registros tiene registros, llame a IsBOF
y a IsEOF
.
Nota:
Si llama a cualquiera de las funciones Move
mientras el registro actual se actualiza o se agrega, las actualizaciones se pierden sin previo aviso.
Para obtener más información sobre la navegación por el conjunto de registros, vea los artículos Conjunto de registros: desplazamiento (ODBC) y Conjunto de registros: marcadores y posiciones absolutas (ODBC). Para más información sobre la obtención masiva de filas, vea Conjunto de registros: obtener registros de forma masiva (ODBC).
Ejemplo
Vea el ejemplo de IsBOF
.
CRecordset::MoveLast
Convierte el primer registro en el último conjunto de filas completo del registro actual.
void MoveLast();
Comentarios
Si no se ha implementado la captura masiva de filas, el conjunto de registros tiene un tamaño de conjunto de filas de 1, por lo que MoveLast
pasa al último registro del conjunto de registros.
Nota:
Esta función miembro no es válida en los conjuntos de registros de solo avance.
Nota:
Al desplazarse por un conjunto de registros, no se pueden omitir los registros eliminados. Consulte la función miembro IsDeleted
para obtener información más detallada.
Precaución
Al llamar a cualquiera de las funciones Move
, se produce una excepción si el conjunto de registros no tiene registros. Para determinar si el conjunto de registros tiene registros, llame a IsBOF
y a IsEOF
.
Nota:
Si llama a cualquiera de las funciones Move
mientras el registro actual se actualiza o se agrega, las actualizaciones se pierden sin previo aviso.
Para obtener más información sobre la navegación por el conjunto de registros, vea los artículos Conjunto de registros: desplazamiento (ODBC) y Conjunto de registros: marcadores y posiciones absolutas (ODBC). Para más información sobre la obtención masiva de filas, vea Conjunto de registros: obtener registros de forma masiva (ODBC).
Ejemplo
Vea el ejemplo de IsBOF
.
CRecordset::MoveNext
Convierte el primer registro en el siguiente conjunto de filas del registro actual.
void MoveNext();
Comentarios
Si no se ha implementado la captura masiva de filas, el conjunto de registros tiene un tamaño de conjunto de filas de 1, por lo que MoveNext
avanza al siguiente registro.
Nota:
Al desplazarse por un conjunto de registros, no se pueden omitir los registros eliminados. Consulte la función miembro IsDeleted
para obtener información más detallada.
Precaución
Al llamar a cualquiera de las funciones Move
, se produce una excepción si el conjunto de registros no tiene registros. Para determinar si el conjunto de registros tiene registros, llame a IsBOF
y a IsEOF
.
Nota:
También se recomienda llamar a IsEOF
antes de llamar a MoveNext
. Por ejemplo, si se ha desplazado más allá del final del conjunto de registros, IsEOF
devolverá un valor distinto de cero; una llamada posterior a MoveNext
produciría una excepción.
Nota:
Si llama a cualquiera de las funciones Move
mientras el registro actual se actualiza o se agrega, las actualizaciones se pierden sin previo aviso.
Para obtener más información sobre la navegación por el conjunto de registros, vea los artículos Conjunto de registros: desplazamiento (ODBC) y Conjunto de registros: marcadores y posiciones absolutas (ODBC). Para más información sobre la obtención masiva de filas, vea Conjunto de registros: obtener registros de forma masiva (ODBC).
Ejemplo
Vea el ejemplo de IsBOF
.
CRecordset::MovePrev
Convierte el primer registro en el conjunto de filas anterior del registro actual.
void MovePrev();
Comentarios
Si no se ha implementado la captura masiva de filas, el conjunto de registros tiene un tamaño de conjunto de filas de 1, por lo que MovePrev
avanza al registro anterior.
Nota:
Esta función miembro no es válida en los conjuntos de registros de solo avance.
Nota:
Al desplazarse por un conjunto de registros, no se pueden omitir los registros eliminados. Consulte la función miembro IsDeleted
para obtener información más detallada.
Precaución
Al llamar a cualquiera de las funciones Move
, se produce una excepción si el conjunto de registros no tiene registros. Para determinar si el conjunto de registros tiene registros, llame a IsBOF
y a IsEOF
.
Nota:
También se recomienda llamar a IsBOF
antes de llamar a MovePrev
. Por ejemplo, si se ha desplazado por delante del inicio del conjunto de registros, IsBOF
devolverá un valor distinto de cero; una llamada posterior a MovePrev
produciría una excepción.
Nota:
Si llama a cualquiera de las funciones Move
mientras el registro actual se actualiza o se agrega, las actualizaciones se pierden sin previo aviso.
Para obtener más información sobre la navegación por el conjunto de registros, vea los artículos Conjunto de registros: desplazamiento (ODBC) y Conjunto de registros: marcadores y posiciones absolutas (ODBC). Para más información sobre la obtención masiva de filas, vea Conjunto de registros: obtener registros de forma masiva (ODBC).
Ejemplo
Vea el ejemplo de IsBOF
.
CRecordset::OnSetOptions
Se llama a este método para establecer opciones (usadas al seleccionar) de la instrucción ODBC especificada.
virtual void OnSetOptions(HSTMT hstmt);
Parámetros
hstmt
HSTMT
de la instrucción ODBC cuyas opciones se van a establecer.
Comentarios
Llame a OnSetOptions
para establecer opciones (usadas al seleccionar) de la instrucción ODBC especificada. El marco llama a esta función miembro para establecer las opciones iniciales del conjunto de registros. OnSetOptions
determina si el origen de datos admite cursores desplazables y la simultaneidad de cursores y establece las opciones del conjunto de registros en consecuencia (mientras que OnSetOptions
se usa en las operaciones de selección, OnSetUpdateOptions
se usa en las operaciones de actualización).
Invalide OnSetOptions
para establecer opciones específicas del controlador o del origen de datos. Por ejemplo, si el origen de datos permite abrir elementos con acceso exclusivo, puede invalidar OnSetOptions
para aprovechar esa capacidad.
Para obtener más información sobre los cursores, vea ODBC.
CRecordset::OnSetUpdateOptions
Se llama a este método para establecer opciones (usadas al actualizar) de la instrucción ODBC especificada.
virtual void OnSetUpdateOptions(HSTMT hstmt);
Parámetros
hstmt
HSTMT
de la instrucción ODBC cuyas opciones se van a establecer.
Comentarios
Llame a OnSetUpdateOptions
para establecer opciones (usadas al actualizar) de la instrucción ODBC especificada. El marco llama a esta función miembro después de crear un elemento HSTMT
para actualizar los registros de un conjunto de registros (mientras que OnSetOptions
se usa en las operaciones de selección, OnSetUpdateOptions
se usa en las operaciones de actualización). OnSetUpdateOptions
determina si el origen de datos admite cursores desplazables y la simultaneidad de cursores y establece las opciones del conjunto de registros en consecuencia.
Invalide OnSetUpdateOptions
para establecer opciones de una instrucción ODBC antes de que esa instrucción se use para acceder a una base de datos.
Para obtener más información sobre los cursores, vea ODBC.
CRecordset::Open
Abre el conjunto de registros recuperando la tabla o realizando la consulta que el conjunto de registros representa.
virtual BOOL Open(
UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE,
LPCTSTR lpszSQL = NULL,
DWORD dwOptions = none);
Parámetros
nOpenType
Acepte el valor predeterminado (AFX_DB_USE_DEFAULT_TYPE
) o use uno de los siguientes valores de enum OpenType
:
CRecordset::dynaset
Un conjunto de registros con desplazamiento bidireccional. La pertenencia y el orden de los registros se determinan cuando se abre el conjunto de registros, pero los cambios realizados por otros usuarios en los valores de datos son visibles después de una operación de búsqueda. Los dynasets también se conocen como conjuntos de registros conjunto controlados por conjuntos de claves.CRecordset::snapshot
Un conjunto de registros estático con desplazamiento bidireccional. La pertenencia y el orden de los registros se determinan cuando se abre el conjunto de registros. La captura de un registro determina los valores de datos. Los cambios realizados por otros usuarios no son visibles hasta que no se cierra y se vuelve a abrir el conjunto de registros.CRecordset::dynamic
Un conjunto de registros con desplazamiento bidireccional. Los cambios realizados por otros usuarios en la pertenencia, el orden y los valores de datos son visibles después de una operación de recuperación de cambios. Muchos controladores ODBC no admiten este tipo de conjunto de registros.CRecordset::forwardOnly
Un conjunto de registros de solo lectura con desplazamiento solo de avance.En
CRecordset
, el valor predeterminado esCRecordset::snapshot
. El mecanismo de valor predeterminado permite que los asistentes de Visual C++ interactúen conCRecordset
de ODBC yCDaoRecordset
de DAO, que tienen valores predeterminados diferentes.
Para obtener más información sobre estos tipos de conjunto de registros, vea Conjunto de registros (ODBC). Para obtener información relacionada, vea la sección sobre el uso de cursores de bloque y desplazables en Windows SDK.
Precaución
Si el tipo solicitado no se admite, el marco de trabajo produce una excepción.
lpszSQL
Puntero de cadena que contiene uno de los elementos siguientes:
Un puntero
NULL
.Nombre de una tabla.
Una instrucción SQL
SELECT
(opcionalmente, con una cláusula SQLWHERE
oORDER BY
).Una instrucción
CALL
que especifica el nombre de una consulta predefinida (procedimiento almacenado). Procure no insertar un espacio en blanco entre la llave y la palabra claveCALL
.
Para obtener más información sobre esta cadena, vea la tabla y la descripción del rol de ClassWizard en la sección Comentarios.
Nota:
El orden de las columnas del conjunto de resultados debe coincidir con el orden de las llamadas de función RFX o RFX masivo en la invalidación de la función DoFieldExchange
o DoBulkFieldExchange
.
dwOptions
Máscara de bits que puede especificar una combinación de los valores que se muestran a continuación. Algunas de estas opciones son mutuamente excluyentes. El valor predeterminado es none
.
CRecordset::none
No hay opciones establecidas. Este valor del parámetro es mutuamente excluyente con todos los demás valores. De forma predeterminada, el conjunto de registros se puede actualizar conEdit
o conDelete
, y permite anexar nuevos registros conAddNew
. La posibilidad de actualización depende del origen de datos y de la opción denOpenType
que se especifique. La optimización de adiciones masivas no está disponible. La captura masiva de filas no se implementará. Los registros eliminados no se omitirán al navegar por el conjunto de registros. Los marcadores no están disponibles. Se implementa la comprobación automática de campos modificados.CRecordset::appendOnly
NiEdit
niDelete
están permitidos en el conjunto de registros. Solo permiteAddNew
. Esta opción es mutuamente excluyente conCRecordset::readOnly
.CRecordset::readOnly
El conjunto de registros se abre como de solo lectura. Esta opción es mutuamente excluyente conCRecordset::appendOnly
.CRecordset::optimizeBulkAdd
Se usa una instrucción SQL preparada para optimizar la adición de muchos registros a la vez. Solo se aplica si no se está utilizando la función de API ODBCSQLSetPos
para actualizar el conjunto de registros. La primera actualización determina qué campos se marcan como modificados. Esta opción es mutuamente excluyente conCRecordset::useMultiRowFetch
.CRecordset::useMultiRowFetch
Implementa la captura masiva de filas para permitir la recuperación de varias filas en una misma operación de búsqueda. Se trata de una característica avanzada diseñada para mejorar el rendimiento; sin embargo,ClassWizard
no admite el intercambio masivo de campos de registros. Esta opción es mutuamente excluyente conCRecordset::optimizeBulkAdd
. Si se especificaCRecordset::useMultiRowFetch
, la opciónCRecordset::noDirtyFieldCheck
se activará automáticamente (el almacenamiento en búfer doble no estará disponible); en los conjuntos de registros de solo avance, la opciónCRecordset::useExtendedFetch
se activará automáticamente. Para más información sobre la obtención masiva de filas, vea Conjunto de registros: obtener registros de forma masiva (ODBC).CRecordset::skipDeletedRecords
Omite todos los registros eliminados al navegar por el conjunto de registros. Esto ralentiza el rendimiento en ciertas búsquedas relativas. Esta opción no es válida en los conjuntos de registros de solo avance. Si se llama aMove
con el parámetro nRows establecido en 0 y la opciónCRecordset::skipDeletedRecords
configurada,Move
se impondrá.CRecordset::skipDeletedRecords
es similar a los paquetes de controladores, lo que significa que las filas eliminadas se quitan del conjunto de registros. Sin embargo, si el controlador empaqueta registros, solo se omitirán los registros que elimine; no se omitirán los registros eliminados por otros usuarios mientras el conjunto de registros está abierto.CRecordset::skipDeletedRecords
omitirá las filas eliminadas por otros usuarios.CRecordset::useBookmarks
Se pueden usar marcadores en el conjunto de registros, si esto es posible. Los marcadores ralentizan la recuperación de datos pero mejoran el rendimiento de la navegación de datos. No es válida en conjuntos de registros solo hacia delante. Para obtener más información, vea Conjunto de registros: marcadores y posiciones absolutas (ODBC).CRecordset::noDirtyFieldCheck
Desactiva la comprobación automática de campos modificados (almacenamiento en búfer doble). Esto mejorará el rendimiento; sin embargo, para marcar manualmente los campos como modificados se debe llamar a las funciones miembroSetFieldDirty
ySetFieldNull
. El almacenamiento en búfer doble de la claseCRecordset
es similar al almacenamiento en búfer doble de la claseCDaoRecordset
. Sin embargo, enCRecordset
no se puede habilitar el almacenamiento en búfer doble en campos individuales; hay que habilitarlo o deshabilitarlo en todos los campos. Si se especifica la opciónCRecordset::useMultiRowFetch
,CRecordset::noDirtyFieldCheck
se activará automáticamente; sin embargo,SetFieldDirty
ySetFieldNull
no se pueden utilizar en conjuntos de registros que implementan la captura masiva de filas.CRecordset::executeDirect
No use una instrucción SQL preparada. Para mejorar el rendimiento, especifique esta opción si nunca se va a llamar a la función miembroRequery
.CRecordset::useExtendedFetch
ImplementaSQLExtendedFetch
en lugar deSQLFetch
. Está diseñado para implementar la obtención masiva de filas en conjuntos de registros solo hacia delante. Si se especifica la opciónCRecordset::useMultiRowFetch
en un conjunto de registros de solo avance,CRecordset::useExtendedFetch
se activará automáticamente.CRecordset::userAllocMultiRowBuffers
El usuario asignará búferes de almacenamiento para los datos. Use esta opción conCRecordset::useMultiRowFetch
si quiere asignar su propio almacenamiento; de lo contrario, el marco asignará automáticamente el almacenamiento necesario. Para más información, consulte Conjunto de registros: obtener registros de forma masiva (ODBC). EspecificarCRecordset::userAllocMultiRowBuffers
sin especificarCRecordset::useMultiRowFetch
da como resultado una aserción errónea.
Valor devuelto
Un valor distinto de cero si el objeto CRecordset
se ha abierto correctamente; de lo contrario, es 0 si CDatabase::Open
(si se le llama) devuelve 0.
Comentarios
Se debe llamar a esta función miembro para ejecutar la consulta definida por el conjunto de registros. Antes de llamar a Open
, se debe crear el objeto de conjunto de registros.
La conexión de este conjunto de registros con el origen de datos depende de cómo se cree el conjunto de registros antes de llamar a Open
. Si se pasa al constructor del conjunto de registros un objeto CDatabase
que no ha estado conectado al origen de datos, esta función miembro usa GetDefaultConnect
para intentar abrir el objeto de base de datos. Si se pasa NULL al constructor del conjunto de registros, el constructor crea un objeto CDatabase
, y Open
intenta conectar el objeto de base de datos. Para obtener detalles sobre cómo cerrar el conjunto de registros y la conexión en estas circunstancias variables, vea Close
.
Nota:
El acceso a un origen de datos mediante un objeto CRecordset
siempre es compartido. A diferencia de la clase CDaoRecordset
, un objeto CRecordset
no se puede usar para abrir un origen de datos con acceso exclusivo.
Cuando se llama a Open
, una consulta (normalmente, una instrucción SQL SELECT
) selecciona los registros según los criterios que se muestran en la tabla siguiente.
Valor del parámetro lpszSQL |
Los registros seleccionados están determinados por | Ejemplo |
---|---|---|
NULL |
La cadena devuelta por GetDefaultSQL . |
|
Nombre de tabla SQL | Todas las columnas de la lista de tablas de DoFieldExchange o DoBulkFieldExchange . |
"Customer" |
Nombre de la consulta (procedimiento almacenado) predefinida | Las columnas de la consulta cuya devolución se ha definido. | "{call OverDueAccts}" |
SELECT lista de columnas FROM lista de tablas |
Las columnas especificadas de las tablas indicadas. | "SELECT CustId, CustName FROM Customer" |
Precaución
No inserte espacios en blanco adicionales en la cadena SQL. Por ejemplo, si inserta un espacio en blanco entre la llave y la palabra clave CALL
, MFC interpretará incorrectamente la cadena SQL como un nombre de tabla y la incorporará a una instrucción SELECT
, lo que hará que se produzca una excepción. Del mismo modo, si la consulta predefinida usa un parámetro de salida, no inserte un espacio en blanco entre la llave y el símbolo ''. Por último, no debe insertar espacios en blanco antes de la llave en una CALL
instrucción o antes de la SELECT
palabra clave en una SELECT
instrucción .
El procedimiento habitual consiste en pasar NULL
a Open
; en este caso, Open
llama a GetDefaultSQL. Si se está utilizando una clase CRecordset
derivada, GetDefaultSQL
proporciona el nombre o los nombres de tabla especificados en ClassWizard
. Se puede especificar otra información en el parámetro lpszSQL
.
Independientemente del valor que se pase, Open
construye una cadena SQL final para la consulta (la cadena puede tener anexadas cláusulas SQL WHERE
y ORDER BY
a la cadena lpszSQL
que se pasó) y, después, ejecuta la consulta. Para examinar la cadena construida hay que llamar a GetSQL
después de llamar a Open
. Para obtener más detalles sobre cómo el conjunto de registros crea una instrucción SQL y selecciona registros, vea Conjunto de registros: cómo actualizan registros los conjuntos de registros (ODBC).
Los miembros de datos de campo de la clase de conjunto de registros están enlazados a las columnas de los datos seleccionados. Si se devuelve algún registro, el primer registro se convierte en el registro actual.
Si se desea establecer opciones para el conjunto de registros, como un filtro o una ordenación, deben especificarse después de crear el objeto de conjunto de registros, pero antes de llamar a Open
. Si desea actualizar los registros del conjunto de registros una vez que este se ha abierto, llame a Requery
.
Para obtener más información, incluidos ejemplos adicionales, vea Conjunto de registros (ODBC), Conjunto de registros: cómo actualizan registros los conjuntos de registros (ODBC) y Conjunto de registros: crear y cerrar conjuntos de registros (ODBC).
Ejemplo
En los ejemplos de código siguientes se muestran distintas formas de llamar a Open
.
// rsSnap, rsLName, and rsDefault are CRecordset or CRecordset-derived
// objects
// Open rs using the default SQL statement, implement bookmarks, and turn
// off automatic dirty field checking
rsSnap.Open(CRecordset::snapshot, NULL, CRecordset::useBookmarks |
CRecordset::noDirtyFieldCheck);
// Pass a complete SELECT statement and open as a dynaset
rsLName.Open(CRecordset::dynaset, _T("Select L_Name from Customer"));
// Accept all defaults
rsDefault.Open();
CRecordset::RefreshRowset
Actualiza los datos y el estado de una fila del conjunto de filas actual.
void RefreshRowset(
WORD wRow,
WORD wLockType = SQL_LOCK_NO_CHANGE);
Parámetros
wRow
Posición, según un índice de base 1, de una fila del conjunto de filas actual. Este valor puede oscilar entre 0 y el tamaño del conjunto de filas.
wLockType
Valor que indica cómo bloquear la fila después de actualizarla. Para conocer más detalles, vea la sección Comentarios.
Comentarios
Si se pasa un valor de cero para wRow
, se actualizarán todas las filas del conjunto de filas.
Para usar RefreshRowset
, se debe haber implementado la captura masiva de filas especificando la opción CRecordset::useMulitRowFetch
en la función miembro Open
.
RefreshRowset
llama a la función de API ODBC SQLSetPos
. El parámetro wLockType
especifica el estado de bloqueo de la fila después de que SQLSetPos
se haya ejecutado. En la siguiente tabla se describen los posibles valores de wLockType
.
wLockType | Descripción |
---|---|
SQL_LOCK_NO_CHANGE (valor predeterminado) |
El controlador o el origen de datos garantiza que la fila está en el mismo estado bloqueado o desbloqueado que antes de que se llamara a RefreshRowset . |
SQL_LOCK_EXCLUSIVE |
El controlador o el origen de datos bloquea la fila exclusivamente. No todos los orígenes de datos admiten este tipo de bloqueo. |
SQL_LOCK_UNLOCK |
El controlador o el origen de datos desbloquea la fila. No todos los orígenes de datos admiten este tipo de bloqueo. |
Consulte Windows SDK para obtener más información sobre SQLSetPos
. Para más información sobre la obtención masiva de filas, vea Conjunto de registros: obtener registros de forma masiva (ODBC).
CRecordset::Requery
Recompila (actualiza) un conjunto de registros.
virtual BOOL Requery();
Valor devuelto
Un valor distinto de cero si el conjunto de registros se recompiló correctamente; de lo contrario, 0.
Comentarios
Si se devuelve algún registro, el primer registro se convierte en el registro actual.
Para que el conjunto de registros refleje las adiciones y eliminaciones que usted u otros usuarios hayan realizado en el origen de datos, el conjunto de registros se debe recompilar mediante una llamada a Requery
. Si el conjunto de registros es un conjunto de registros dinámicos, refleja automáticamente las actualizaciones (pero no las adiciones) que usted u otros usuarios hayan realizado en sus registros existentes. Si el conjunto de registros es una instantánea, se debe llamar a Requery
para reflejar las modificaciones realizadas por otros usuarios, así como las adiciones y eliminaciones.
En un conjunto de registros dinámicos o una instantánea, llame a Requery
cada vez que quiera recompilar el conjunto de registros mediante un nuevo filtro u ordenación, o bien nuevos valores de parámetro. Establezca la propiedad de nuevo filtro u ordenación asignando nuevos valores a m_strFilter
y a m_strSort
antes de llamar a Requery
. Establezca nuevos parámetros asignando nuevos valores a los miembros de datos de parámetros antes de llamar a Requery
. Si las cadenas de filtro y ordenación no cambian, la consulta se puede reutilizar, lo que mejora el rendimiento.
Si se produce un error en el intento de recompilación del conjunto de registros, se cierra el conjunto de registros. Antes de llamar a Requery
, puede determinar si se puede volver a consultar el conjunto de registros llamando a la función miembro CanRestart
. CanRestart
no garantiza que Requery
se realice correctamente.
Precaución
Llame a Requery
solo después de haber llamado a Open
.
Ejemplo
En este ejemplo se recompila un conjunto de registros para aplicar un criterio de ordenación diferente.
CCustomer rsCustSet(&m_dbCust);
// Open the recordset
rsCustSet.Open();
// Use the recordset ...
// Set the sort order and Requery the recordset
rsCustSet.m_strSort = _T("L_Name, ContactFirstName");
if (!rsCustSet.CanRestart())
return; // Unable to requery
if (!rsCustSet.Requery())
// Requery failed, so take action
AfxMessageBox(_T("Requery failed!"));
CRecordset::SetAbsolutePosition
Coloca el conjunto de registros en el registro correspondiente al número de registro especificado.
void SetAbsolutePosition(long nRows);
Parámetros
nRows
Posición ordinal, según un índice de base 1, del registro actual del conjunto de registros.
Comentarios
SetAbsolutePosition
mueve el puntero de registro actual en función de esta posición ordinal.
Nota:
Esta función miembro no es válida en los conjuntos de registros de solo avance.
En los conjuntos de registros ODBC, un valor de posición absoluta de 1 hace referencia al primer registro del conjunto de registros y un valor de 0, a la posición del principio del archivo (BOF).
También se pueden pasar valores negativos a SetAbsolutePosition
. En tal caso, la posición del conjunto de registros se evalúa desde el final del conjunto de registros. Por ejemplo, SetAbsolutePosition( -1 )
mueve el puntero de registro actual al último registro del conjunto de registros.
Nota:
La posición absoluta no está pensada para usarse como número de registro suplente. Los marcadores siguen siendo la forma recomendada de conservar una posición determinada y volver a ella, ya que la posición de un registro cambia cuando se eliminan los registros anteriores. Además, no se puede tener la certeza de que un registro determinado vaya a tener la misma posición absoluta si el conjunto de registros se vuelve a crear, porque el orden de los registros individuales dentro de un conjunto de registros no está garantizado, a menos que se cree con una instrucción SQL usando una cláusula ORDER BY
.
Para obtener más información sobre la navegación por el conjunto de registros y los marcadores, vea los artículos Conjunto de registros: desplazamiento (ODBC) y Conjunto de registros: marcadores y posiciones absolutas (ODBC).
CRecordset::SetBookmark
Coloca el conjunto de registros en el registro que contiene el marcador especificado.
void SetBookmark(const CDBVariant& varBookmark);
Parámetros
varBookmark
Referencia a un objeto CDBVariant
que contiene el valor de marcador de un registro específico.
Comentarios
Llame a CanBookmark
para determinar si se admiten marcadores en el conjunto de registros. Para que los marcadores estén disponibles (si se admiten), debe establecer la opción CRecordset::useBookmarks
en el parámetro dwOptions
de la función miembro Open
.
Nota:
Si no se admiten marcadores o no están disponibles, la llamada a SetBookmark
producirá una excepción. Los marcadores no se admiten en conjuntos de registros de solo avance.
Para recuperar primero el marcador del registro actual, llame a GetBookmark
, que guarda el valor de marcador en un objeto CDBVariant
. Más adelante, puede volver a ese registro llamando a SetBookmark
mediante el valor de marcador guardado.
Nota:
Después de determinadas operaciones de conjunto de registros, conviene comprobar la persistencia del marcador antes de llamar a SetBookmark
. Por ejemplo, si se recupera un marcador con GetBookmark
y, luego, se llama a Requery
, es posible que el marcador ya no sea válido. Llame a CDatabase::GetBookmarkPersistence
para comprobar si puede llamar a SetBookmark
de forma segura.
Para obtener más información sobre los marcadores y la navegación por el conjunto de registros, vea los artículos Conjunto de registros: marcadores y posiciones absolutas (ODBC) y Conjunto de registros: desplazamiento (ODBC).
CRecordset::SetFieldDirty
Marca un miembro de datos de campo del conjunto de registros como modificado o sin cambios.
void SetFieldDirty(void* pv, BOOL bDirty = TRUE);
Parámetros
pv
Contiene la dirección de un miembro de datos de campo en el conjunto de registros o NULL
. Si es NULL
, se marcan todos los miembros de datos de campo del conjunto de registros (en C++, NULL
no es lo mismo que NULL en la terminología de bases de datos, que significa "sin valor").
bDirty
TRUE
si el miembro de datos del campo se va a marcar como "con modificaciones". De lo contrario, FALSE
si el miembro de datos de campo se va a marcar como "sin modificaciones".
Comentarios
Marcar los campos como sin modificaciones hace que esos campos no se actualicen, lo cual genera menos tráfico SQL.
Nota:
Esta función miembro no se puede usar en conjuntos de registros que usen la captura masiva de filas. Si se ha implementado la captura masiva de filas, SetFieldDirty
generará una aserción con errores. Para más información sobre la obtención masiva de filas, vea Conjunto de registros: obtener registros de forma masiva (ODBC).
El marco marca los miembros de datos de campo modificados para asegurarse de que se escribirán en el registro en el origen de datos mediante el mecanismo de intercambio de campos de registro (RFX). Cuando se cambia el valor de un campo, dicho campo se suele establecer como con modificaciones de manera automática, por lo que el usuario rara vez tendrá que llamar a SetFieldDirty
por sí mismo, si bien es posible que quiera asegurarse de que las columnas se van a actualizar expresamente o se van a insertar independientemente del valor contenido en el miembro de datos del campo.
Si se usa NULL
como primer argumento de la función, esta solo se aplicará a los campos outputColumn
, no a los campos param
. Por ejemplo, la llamada
SetFieldNull(NULL);
establecerá únicamente los campos outputColumn
en NULL
; los campos param
no se verán afectados.
Para trabajar en los campos param
, debe proporcionar la dirección real del campo param
individual en el que quiera trabajar, como:
SetFieldNull(&m_strParam);
Esto significa que no se pueden establecer todos los campos param
en NULL
, cosa que sí es factible con los campos outputColumn
.
CRecordset::SetFieldNull
Marca un miembro de datos de campo del conjunto de registros como NULL (es decir, sin valor) o como distinto de NULL.
void SetFieldNull(void* pv, BOOL bNull = TRUE);
Parámetros
pv
Contiene la dirección de un miembro de datos de campo en el conjunto de registros o NULL
. Si es NULL
, se marcan todos los miembros de datos de campo del conjunto de registros (en C++, NULL
no es lo mismo que NULL en la terminología de bases de datos, que significa "sin valor").
bNull
Un valor distinto de cero si el miembro de datos de campo se marca como que no tiene ningún valor (NULL). De lo contrario, 0 si el miembro de datos de campo se va a marcar como no NULL.
Comentarios
Cuando se agrega un registro nuevo a un conjunto de registros, todos los miembros de datos de campo se establecen inicialmente en un valor NULL y se marcan como "con modificaciones". Cuando se recupera un registro de un origen de datos, sus columnas ya tienen valores o bien son NULL.
Nota:
No llame a esta función miembro en los conjuntos de registros que usen la captura masiva de filas. Si se ha implementado la captura masiva de filas, una llamada a SetFieldNull
generará una aserción con errores. Para más información sobre la obtención masiva de filas, vea Conjunto de registros: obtener registros de forma masiva (ODBC).
Si desea designar un campo del registro actual específicamente para no tener un valor, llame a SetFieldNull
con bNull
establecido en TRUE
para marcarlo como NULL. Si un campo se marcó previamente como NULL y ahora le quiere asignar un valor, establezca su nuevo valor. No es necesario quitar la marca NULL con SetFieldNull
. Para saber si un campo puede ser NULL, llame a IsFieldNullable
.
Si se usa NULL
como primer argumento de la función, esta solo se aplicará a los campos outputColumn
, no a los campos param
. Por ejemplo, la llamada
SetFieldNull(NULL);
establecerá únicamente los campos outputColumn
en NULL
; los campos param
no se verán afectados.
Para trabajar en los campos param
, debe proporcionar la dirección real del campo param
individual en el que quiera trabajar, como:
SetFieldNull(&m_strParam);
Esto significa que no se pueden establecer todos los campos param
en NULL
, cosa que sí es factible con los campos outputColumn
.
Nota:
Al establecer parámetros en NULL, una llamada a SetFieldNull
antes de que se abra el conjunto de registros da como resultado una aserción. En tal caso, llame a SetParamNull
.
SetFieldNull
se implementa a través de DoFieldExchange
.
CRecordset::SetLockingMode
Establece el modo de bloqueo en bloqueo "optimista" (valor predeterminado) o "pesimista". Determina cómo se bloquean los registros para las actualizaciones.
void SetLockingMode(UINT nMode);
Parámetros
nMode
Contiene uno de los siguientes valores de enum LockMode
:
optimistic
El bloqueo optimista bloquea el registro que se está actualizando únicamente durante la llamada aUpdate
.pessimistic
El bloqueo pesimista bloquea el registro en cuanto se llama aEdit
y lo mantiene bloqueado hasta que la llamada aUpdate
finaliza o el usuario se traslada a otro registro.
Comentarios
Llame a esta función miembro si necesita especificar cuál de las dos estrategias de bloqueo de registros usa el conjunto de registros para las actualizaciones. De forma predeterminada, el modo de bloqueo de un conjunto de registros es optimistic
. Puede cambiarlo a una estrategia de bloqueo pessimistic
, más precavida. Llame a SetLockingMode
después de construir y abrir el objeto de conjunto de registros, pero antes de llamar a Edit
.
CRecordset::SetParamNull
Marca un parámetro como NULL (es decir, sin valor) o como distinto de NULL.
void SetParamNull(
int nIndex,
BOOL bNull = TRUE);
Parámetros
nIndex
Índice de base cero del parámetro.
bNull
Si es TRUE
(valor predeterminado), el parámetro se marca como NULL. De lo contrario, el parámetro se marca como distinto de NULL.
Comentarios
A diferencia de SetFieldNull
, se puede llamar a SetParamNull
antes de que abrir el conjunto de registros.
SetParamNull
se suele usar con consultas predefinidas (procedimientos almacenados).
CRecordset::SetRowsetCursorPosition
Mueve el cursor a una fila del conjunto de filas actual.
void SetRowsetCursorPosition(WORD wRow, WORD wLockType = SQL_LOCK_NO_CHANGE);
Parámetros
wRow
Posición, según un índice de base 1, de una fila del conjunto de filas actual. Este valor puede oscilar entre 1 y el tamaño del conjunto de filas.
wLockType
Valor que indica cómo bloquear la fila después de actualizarla. Para conocer más detalles, vea la sección Comentarios.
Comentarios
Al implementar la captura masiva de filas, los conjuntos de filas recuperan registros, donde el primer registro del conjunto de filas capturado es el registro actual. Llame a SetRowsetCursorPosition
para designar otro registro del conjunto de filas como registro actual. Por ejemplo, puede combinar SetRowsetCursorPosition
con la función miembro GetFieldValue
para recuperar dinámicamente los datos de cualquier registro del conjunto de registros.
Para usar SetRowsetCursorPosition
, se debe haber implementado la captura masiva de filas especificando la opción CRecordset::useMultiRowFetch
en el parámetro dwOptions
de la función miembro Open
.
SetRowsetCursorPosition
llama a la función de API ODBC SQLSetPos
. El parámetro wLockType
especifica el estado de bloqueo de la fila después de que SQLSetPos
se haya ejecutado. En la siguiente tabla se describen los posibles valores de wLockType
.
wLockType |
Descripción |
---|---|
SQL_LOCK_NO_CHANGE (valor predeterminado) |
El controlador o el origen de datos garantiza que la fila está en el mismo estado bloqueado o desbloqueado que antes de que se llamara a SetRowsetCursorPosition . |
SQL_LOCK_EXCLUSIVE |
El controlador o el origen de datos bloquea la fila exclusivamente. No todos los orígenes de datos admiten este tipo de bloqueo. |
SQL_LOCK_UNLOCK |
El controlador o el origen de datos desbloquea la fila. No todos los orígenes de datos admiten este tipo de bloqueo. |
Consulte Windows SDK para obtener más información sobre SQLSetPos
. Para más información sobre la obtención masiva de filas, vea Conjunto de registros: obtener registros de forma masiva (ODBC).
CRecordset::SetRowsetSize
Especifica el número de registros que desea recuperar durante una captura.
virtual void SetRowsetSize(DWORD dwNewRowsetSize);
Parámetros
dwNewRowsetSize
Número de filas que se van a recuperar durante una captura determinada.
Comentarios
Esta función miembro virtual especifica cuántas filas quiere recuperar en una misma captura al usar la captura masiva de filas. Para implementar la captura masiva de filas, se debe establecer la opción CRecordset::useMultiRowFetch
en el parámetro dwOptions
de la función miembro Open
.
Nota:
Si se llama a SetRowsetSize
sin implementar la captura masiva de filas, se producirá una aserción con errores.
Llame a SetRowsetSize
antes de llamar a Open
para establecer inicialmente el tamaño del conjunto de filas del conjunto de registros. El tamaño predeterminado del conjunto de filas cuando se implementa la captura masiva de filas es 25.
Nota:
Tenga precaución al llamar a SetRowsetSize
. Si va a asignar almacenamiento manualmente para los datos (según lo especificado por la opción CRecordset::userAllocMultiRowBuffers
del parámetro dwOptions en Open
), debe comprobar si necesita reasignar estos búferes de almacenamiento después de llamar a SetRowsetSize
, pero antes de realizar cualquier operación de navegación de cursor.
Para obtener el valor actual del tamaño del conjunto de filas, llame a GetRowsetSize
.
Para más información sobre la obtención masiva de filas, vea Conjunto de registros: obtener registros de forma masiva (ODBC).
CRecordset::Update
Completa una operación AddNew
o Edit
guardando los datos nuevos o editados en el origen de datos.
virtual BOOL Update();
Valor devuelto
Valor distinto de cero si un registro se ha actualizado correctamente; de lo contrario, 0 si no ha cambiado ninguna columna. Si no se ha actualizado ningún registro, o si se ha actualizado más de uno, se produce una excepción. También se produce una excepción ante cualquier otro error en el origen de datos.
Comentarios
Llame a esta función miembro después de una llamada a la función miembro AddNew
o Edit
. Esta llamada es necesaria para completar la operación AddNew
o Edit
.
Nota:
Si ha implementado la captura masiva de filas, no puede llamar a Update
. Si lo hace, dará lugar a una aserción con errores. Aunque la clase CRecordset
no proporciona un mecanismo para actualizar filas masivas de datos, puede escribir sus propias funciones mediante la función SQLSetPos
de la API ODBC. Para más información sobre la obtención masiva de filas, vea Conjunto de registros: obtener registros de forma masiva (ODBC).
Tanto AddNew
como Edit
preparan un búfer de edición en el que se colocan los datos agregados o editados para guardarlos en el origen de datos. Update
guarda los datos. Solo se actualizan los campos marcados o detectados como modificados.
Si el origen de datos admite transacciones, puede incluir la llamada a Update
(y su correspondiente llamada a AddNew
o a Edit
) como parte de una transacción. Para obtener más información sobre las transacciones, vea Transacción (ODBC).
Precaución
Si se llama a Update
sin llamar primero a AddNew
o a Edit
, Update
produce una excepción CDBException
. Si se llama a AddNew
o a Edit
, se debe llamar a Update
antes de llamar a una operación Move
o antes de cerrar el conjunto de registros o la conexión del origen de datos. De lo contrario, los cambios se pierden sin previo aviso.
Para obtener más información sobre cómo tratar errores de Update
, vea Conjunto de registros: cómo actualizan registros los conjuntos de registros (ODBC).
Ejemplo
Vea Transacción: realizar una transacción en un conjunto de registros (ODBC).
Consulte también
Clase CObject
Gráfico de jerarquías
Clase CDatabase
Clase CRecordView