Compartir vía


Escribir ODBC 3.x aplicaciones

Cuando se actualiza una aplicación ODBC 2.x a ODBC 3.x, debe escribirse de modo que funcione con controladores ODBC 2.x y 3.x . La aplicación debe incorporar código condicional para aprovechar al máximo las características de ODBC 3.x .

El atributo de entorno SQL_ATTR_ODBC_VERSION debe establecerse en SQL_OV_ODBC2. Esto garantizará que el controlador se comporte como un controlador ODBC 2.x con respecto a los cambios descritos en la sección Cambios de comportamiento.

Si la aplicación usará cualquiera de las características descritas en la sección Nuevas características, se debe usar código condicional para determinar si el controlador es un controlador ODBC 3.x o ODBC 2.x . La aplicación usa SQLGetDiagField y SQLGetDiagRec para obtener SQLSTATEs de ODBC 3.x al realizar el procesamiento de errores en estos fragmentos de código condicional. Se deben tener en cuenta los siguientes puntos sobre la nueva funcionalidad:

  • Una aplicación afectada por el cambio en el comportamiento del tamaño del conjunto de filas debe tener cuidado de no llamar a SQLFetch cuando el tamaño de la matriz sea mayor que 1. Estas aplicaciones deben reemplazar las llamadas a SQLExtendedFetch por llamadas a SQLSetStmtAttr para establecer el atributo de instrucción SQL_ATTR_ARRAY_STATUS_PTR y en SQLFetchScroll, de modo que tengan código común que funcione con controladores ODBC 3.x y ODBC 2.x. Dado que SQLSetStmtAttr con SQL_ATTR_ROW_ARRAY_SIZE se asignará a SQLSetStmtAttr con SQL_ROWSET_SIZE para controladores ODBC 2.x, las aplicaciones solo pueden establecer SQL_ATTR_ROW_ARRAY_SIZE para sus operaciones de recuperación de varias filas.

  • La mayoría de las aplicaciones que actualizan no se ven afectadas realmente por los cambios en los códigos SQLSTATE. En el caso de las aplicaciones afectadas, pueden realizar una búsqueda mecánica y reemplazar en la mayoría de los casos mediante la tabla de conversión de errores de la sección "Asignación de SQLSTATE" para convertir códigos de error ODBC 3.x en códigos ODBC 2.x . Dado que el Administrador de controladores ODBC 3.x realizará la asignación de SQLSTATEs de ODBC 2.x a SQLSTATEs odbc 3.x , estos escritores de aplicaciones solo necesitan comprobar los SQLSTATEs de ODBC 3.x y no preocuparse por incluir SQLSTATEs ODBC 2.x en código condicional.

  • Si una aplicación hace un gran uso de tipos de datos de fecha, hora y marca de tiempo, la aplicación puede declararse como una aplicación ODBC 2.x y usar su código existente en lugar de usar código acondicionado.

La actualización también debe incluir los pasos siguientes:

  • Llama a SQLSetEnvAttr antes de asignar una conexión para establecer el atributo de entorno de SQL_ATTR_ODBC_VERSION en SQL_OV_ODBC2.

  • Reemplace todas las llamadas a SQLAllocEnv, SQLAllocConnect o SQLAllocStmt por llamadas a SQLAllocHandle por el argumento HandleType adecuado de SQL_HANDLE_ENV, SQL_HANDLE_DBC o SQL_HANDLE_STMT.

  • Reemplace todas las llamadas a SQLFreeEnv o SQLFreeConnect por llamadas a SQLFreeHandle por el argumento HandleType adecuado de SQL_HANDLE_DBC o SQL_HANDLE_STMT.

  • Reemplaza todas las llamadas a SQLSetConnectOption por llamadas a SQLSetConnectAttr. Si establece un atributo cuyo valor es una cadena, establezca el argumento StringLength correctamente. Cambie el argumento Attribute de SQL_XXXX a SQL_ATTR_XXXX.

  • Reemplace todas las llamadas a SQLGetConnectOption por llamadas a SQLGetConnectAttr. Si obtiene una cadena o un atributo binario, establezca BufferLength en el valor adecuado y pase un argumento StringLength . Cambie el argumento Attribute de SQL_XXXX a SQL_ATTR_XXXX.

  • Reemplace todas las llamadas a SQLSetStmtOption por llamadas a SQLSetStmtAttr. Si establece un atributo cuyo valor es una cadena, establezca el argumento StringLength correctamente. Cambie el argumento Attribute de SQL_XXXX a SQL_ATTR_XXXX.

  • Reemplace todas las llamadas a SQLGetStmtOption por llamadas a SQLGetStmtAttr. Si obtiene una cadena o un atributo binario, establezca BufferLength en el valor adecuado y pase un argumento StringLength . Cambie el argumento Attribute de SQL_XXXX a SQL_ATTR_XXXX.

  • Reemplace todas las llamadas a SQLTransact por llamadas a SQLEndTran. Si el identificador válido más a la derecha en la llamada a SQLTransact es un identificador de entorno, se debe usar un argumento HandleType de SQL_HANDLE_ENV en la llamada SQLEndTran con el argumento Handle adecuado. Si el identificador válido más a la derecha en la llamada a SQLTransact es un identificador de conexión, se debe usar un argumento HandleType de SQL_HANDLE_DBC en la llamada a SQLEndTran con el argumento Handle adecuado.

  • Reemplace todas las llamadas a SQLColAttributes por llamadas a SQLColAttribute. Si el argumento FieldIdentifier es SQL_COLUMN_PRECISION, SQL_COLUMN_SCALE o SQL_COLUMN_LENGTH, no cambie nada más que el nombre de la función. Si no es así, cambie FieldIdentifier de SQL_COLUMN_XXXX a SQL_DESC_XXXX. Si FieldIdentifier es SQL_DESC_CONCISE_TYPE y el tipo de datos es un tipo de datos datetime, cambie al tipo de datos ODBC 3.x correspondiente.

  • Si usa cursores de bloque, cursores desplazables o ambos, la aplicación hace lo siguiente:

    • Establece el tamaño del conjunto de filas, el tipo de cursor y la simultaneidad de cursor mediante SQLSetStmtAttr.

    • Llama a SQLSetStmtAttr para establecer SQL_ATTR_ROW_STATUS_PTR para que apunten a una matriz de registros de estado.

    • Llama a SQLSetStmtAttr para establecer SQL_ATTR_ROWS_FETCHED_PTR para que apunte a sqlINTEGER.

    • Realiza los enlaces necesarios y ejecuta la instrucción SQL.

    • Llama a SQLFetchScroll en un bucle para recuperar filas y desplazarse por el conjunto de resultados.

    • Si la aplicación desea recuperar por marcador, llama a SQLSetStmtAttr para establecer SQL_ATTR_FETCH_BOOKMARK_PTR en una variable que contendrá el marcador de la fila que desea recuperar, y llama a SQLFetchScroll con un argumento FetchOrientation de SQL_FETCH_BOOKMARK.

  • Si usa matrices de parámetros, la aplicación hace lo siguiente:

    • Llama a SQLSetStmtAttr para establecer el atributo SQL_ATTR_PARAMSET_SIZE en el tamaño de la matriz de parámetros.

    • Llama a SQLSetStmtAttr para establecer SQL_ATTR_ROWS_PROCESSED_PTR para que apunte a una variable interna UDWORD.

    • Realiza operaciones de preparación, enlace y ejecución según corresponda.

    • Si la ejecución se detiene por algún motivo (como SQL_NEED_DATA), puede encontrar la fila "actual" de parámetros inspeccionando la ubicación a la que apunta SQL_ATTR_ROWS_PROCESSED_PTR.

Esta sección contiene los temas siguientes.