Conjunto de registros: Parametrizar un conjunto de registros (ODBC)

Este tema es aplicable a las clases ODBC de MFC.

En ocasiones le interesa poder seleccionar registros en tiempo de ejecución mediante el uso de la información que ha calculado o que ha obtenido del usuario final. Los parámetros del conjunto de registros le permiten lograr ese objetivo.

En este tema se explica:

Conjuntos de registros con parámetros

Un conjunto de registros parametrizado permite pasar información de parámetros en tiempo de ejecución. Esto tiene dos efectos de gran valor:

  • La velocidad de ejecución podría mejorar.

  • Permite crear una consulta en tiempo de ejecución, basada en información que no está disponible para usted en tiempo de diseño (por ejemplo, información obtenida del usuario o calculada en tiempo de ejecución).

Cuando llame a Open para ejecutar la consulta, el conjunto de registros usa la información de parámetros para completar la instrucción SQL SELECT. Se puede parametrizar cualquier conjunto de registros.

Cuándo usar parámetros

Entre los usos más habituales de los parámetros se incluyen los siguientes:

  • Pasar argumentos en tiempo de ejecución a una consulta predefinida.

    Para pasar parámetros a un procedimiento almacenado, debe especificar una instrucción completa CALL de ODBC personalizada (con marcadores de posición de parámetro) cuando llame a Open y reemplazar la instrucción SQL predeterminada del conjunto de registros. Para más información, consulte CRecordset::Open en la referencia de la biblioteca de clases, y SQL: Personalización de la instrucción SQL del conjunto de registros (ODBC) y Conjunto de registros: Declaración de una clase para una consulta predefinida (ODBC).

  • Realizar eficazmente un gran número de nuevas consultas con diferente información de parámetros.

    Por ejemplo, cada vez que el usuario final busque información sobre un alumno específico en la base de datos de registro de alumnos, usted puede especificar el nombre o el identificador del alumno como un parámetro obtenido del usuario. Después, cuando llame a la función miembro Requery del conjunto de registros, la consulta solo seleccionará el registro de ese alumno.

    La cadena de filtro del conjunto de registros, almacenada en m_strFilter, podría tener un aspecto parecido a este:

    "StudentID = ?"
    

    Supongamos que obtiene el identificador del alumno en la variable strInputID. Al establecer un parámetro en strInputID (por ejemplo, el identificador de alumno 100), el valor de la variable se enlaza al marcador de posición del parámetro representado por el símbolo "?" en la cadena de filtro.

    Asigne el valor del parámetro de la manera siguiente:

    strInputID = "100";
    ...
    m_strParam = strInputID;
    

    No conviene establecer una cadena de filtro de esta manera:

    m_strFilter = "StudentID = 100";   // 100 is incorrectly quoted
                                       // for some drivers
    

    Para ver una explicación de cómo usar correctamente las comillas en cadenas de filtro, consulte Conjunto de registros: Filtrado de registros (ODBC).

    El valor del parámetro es distinto cada vez que vuelve a consultar el conjunto de registros para un nuevo identificador de alumno.

    Sugerencia

    Es mucho más eficaz usar un parámetro que simplemente un filtro. Para un conjunto de registros parametrizado, la base de datos debe procesar una instrucción SELECT de SQL una sola vez. Para un conjunto de registros filtrado sin parámetros, la instrucción SELECT debe procesarse cada vez que vuelva a realizar una consulta con Requery con un nuevo valor de filtro.

Para más información sobre los filtros, consulte Conjunto de registros: Filtrado de registros (ODBC).

Parametrización de la clase Recordset

Nota:

Esta sección se aplica a objetos derivados de CRecordset donde no se haya implementado la obtención masiva de filas. Si usa la obtención masiva de filas, la implementación de parámetros es un proceso similar. Para más información, consulte Conjunto de registros: obtener registros de forma masiva (ODBC).

Antes de crear la clase de conjunto de registros, determine qué parámetros necesita, cuáles son sus tipos de datos y cómo los usa el conjunto de registros.

Parametrización de una clase de conjunto de registros

Nota:

El Asistente para consumidores ODBC MFC no está disponible en Visual Studio 2019 ni en versiones posteriores. Aun así, puede crear esta funcionalidad manualmente.

  1. Ejecute el Asistente para consumidores ODBC MFC desde Agregar clase para crear la clase.

  2. Especifique los miembros de datos de campo para las columnas del conjunto de registros.

  3. Después de que el asistente escriba la clase en un archivo del proyecto, vaya al archivo .h y agregue manualmente uno o más miembros de datos de parámetros a la declaración de clase. La adición podría tener un aspecto parecido al ejemplo siguiente, como parte de una clase de instantánea diseñada para responder a la consulta "¿Qué alumnos están en el último curso?".

    class CStudentSet : public CRecordset
    {
    // Field/Param Data
        CString m_strFirstName;
        CString m_strLastName;
        CString m_strStudentID;
        CString m_strGradYear;
    
        CString m_strGradYrParam;
    };
    

    Agregue los miembros de datos de parámetros después de los miembros de datos de campo generados por el asistente. La convención es anexar la palabra "Param" al nombre de cada parámetro definido por el usuario.

  4. Modifique la definición de la función miembro DoFieldExchange en el archivo. cpp. Agregue una llamada de función de RFX para cada miembro de datos de parámetros que haya agregado a la clase. Para información sobre cómo escribir las funciones RFX, consulte Intercambio de campos de registro: Funcionamiento de RFX. Preceda las llamadas a RFX para los parámetros de una sola llamada a:

    pFX->SetFieldType( CFieldExchange::param );
    // RFX calls for parameter data members
    
  5. En el constructor de la clase de conjunto de registros, aumente el número de parámetros, m_nParams.

    Para información, consulte Intercambio de campos de registros: Trabajar con el código de asistente.

  6. Al escribir el código que crea un objeto de conjunto de registros de esta clase, coloque un símbolo "?" (signo de interrogación) en todos los lugares de las cadenas de la instrucción SQL en los que se deba reemplazar un parámetro.

    En tiempo de ejecución, los valores de parámetro se pase rellenarán en orden los marcadores de posición "?". El primer miembro de datos de parámetros establecido después de la llamada a SetFieldType reemplazará el primer símbolo "?"de la cadena SQL, el segundo miembro de datos de parámetros reemplazará el segundo símbolo "?", y así sucesivamente.

Nota:

El orden de los parámetros es importante, ya que el orden de las llamadas a RFX para los parámetros de la función DoFieldExchange debe coincidir con el orden de los marcadores de posición de parámetros de la cadena SQL.

Sugerencia

La cadena con la que probablemente trabajará es aquella que especifique (si lo hace) para el miembro de datos m_strFilter de la clase, pero algunos controladores ODBC podrían admitir parámetros en otras cláusulas SQL.

Pasar valores de parámetro en tiempo de ejecución

Debe especificar los valores de parámetro antes de llamar a Open (para un nuevo objeto de conjunto de registros) o Requery (para uno ya existente).

Procedimiento para pasar valores de parámetro a un objeto de conjunto de registros en tiempo de ejecución

  1. Construya el objeto de conjunto de registros.

  2. Prepare una o varias cadenas, como la cadena m_strFilter, que contengan la instrucción SQL o partes de ella. Coloque marcadores de posición "?" en los que irá la información de los parámetros.

  3. Asigne un valor de parámetro en tiempo de ejecución a cada miembro de datos de parámetros del objeto.

  4. Llame a la función miembro Open (o Requery, para un conjunto de registros existente).

Por ejemplo, suponga que quiere especificar una cadena de filtro para el conjunto de registros mediante el uso de la información obtenida en tiempo de ejecución. Imagine que previamente construyó un conjunto de registros de la clase CStudentSet, denominado rsStudents, y que ahora quiere volver a consultarlo para encontrar determinada información sobre los alumnos.

// Set up a filter string with
// parameter placeholders
rsStudents.m_strFilter = "GradYear <= ?";

// Obtain or calculate parameter values
// to pass--simply assigned here
CString strGradYear = GetCurrentAcademicYear( );

// Assign the values to parameter data members
rsStudents.m_strGradYrParam = strGradYear;

// Run the query
if( !rsStudents.Requery( ) )
    return FALSE;

El conjunto de registros contiene registros para aquellos alumnos cuyos registros cumplan las condiciones especificadas por el filtro, que se construyó a partir de parámetros en tiempo de ejecución. En este caso, el conjunto de registros contiene registros para todos los alumnos del último curso.

Nota:

Si es necesario, puede establecer el valor de un miembro de datos de parámetros en null mediante SetParamNull. Del mismo modo, puede comprobar si un miembro de datos de parámetros es null mediante IsFieldNull.

Consulte también

Conjunto de registros (ODBC)
Conjunto de registros: Agregar, actualizar y eliminar registros (ODBC)
Conjunto de registros: Cómo se seleccionan los registros (ODBC)