Compartir a través de


Cursores de bloque y los cursores desplazables, compatibilidad con versiones anteriores de las aplicaciones ODBC 3.x

La existencia de SQLFetchScroll y SQLExtendedFetch la primera división clara de ODBC entre la interfaz de programación de aplicaciones (API), que es el conjunto de funciones que llama a la aplicación y la interfaz del proveedor de servicios (SPI), que es el conjunto de funciones que implementa el controlador. Esta división es necesaria para equilibrar el requisito de ODBC 3.x, que usa SQLFetchScroll, para alinearse con los estándares y ser compatible con ODBC 2.x, que usa SQLExtendedFetch.

La API de ODBC 3.x, que es el conjunto de funciones a las que llama la aplicación, incluye SQLFetchScroll y los atributos de instrucción relacionados. La SPI de ODBC 3.x, que es el conjunto de funciones que implementa el controlador, incluye SQLFetchScroll, SQLExtendedFetch y los atributos de instrucción relacionados. Dado que ODBC no aplica formalmente esta división entre la API y la SPI, las aplicaciones de ODBC 3.x pueden llamar a SQLExtendedFetch y los atributos de instrucción relacionados. Sin embargo, no es necesario que las aplicaciones de ODBC 3.x lo hagan. Para obtener más información sobre las API y las SPI, consulte la introducción a la arquitectura de ODBC.

Para obtener información sobre cómo el Administrador de controladores ODBC 3.x asigna las llamadas a los controladores ODBC 2.x y ODBC 3.x, y qué funciones y atributos de instrucción debe implementar un controlador ODBC 3.x para los cursores de bloque y desplazables, consulte Lo que hace el controlador en el Anexo G: Directrices de controlador para la compatibilidad con versiones anteriores.

En la tabla siguiente se resumen las funciones y los atributos de instrucción que una aplicación de ODBC 3.x debe usar con cursores de bloque y desplazables. También enumera los cambios entre ODBC 2.x y ODBC 3.x en esta área que las aplicaciones de ODBC 3.x deben tener en cuenta para ser compatibles con los controladores ODBC 2.x.

Función o

atributo de instrucción
Comentarios
SQL_ATTR_FETCH_BOOKMARK_PTR Apunta al marcador que se va a usar con SQLFetchScroll.

Cuando una aplicación lo establece en un controlador ODBC 2.x, debe apuntar a un marcador de longitud fija.
SQL_ATTR_ROW_STATUS_PTR Apunta a la matriz de estado de fila rellenada por SQLFetch, SQLFetchScroll, SQLBulkOperations y SQLSetPos.

Si una aplicación lo establece en un controlador ODBC 2.x y llama a SQLBulkOperation con una operación de SQL_ADD antes de llamar a SQLFetchScroll, SQLFetch o SQLExtendedFetch, se devuelve SQLSTATE HY011 (el atributo no se puede establecer ahora).

Cuando una aplicación llama a SQLFetch en un controlador ODBC 2.x, SQLFetch se asigna a SQLExtendedFetch y, por tanto, devuelve valores en esta matriz.
SQL_ATTR_ROWS_FETCHED_PTR Apunta al búfer en el que SQLFetch y SQLFetchScroll devuelven el número de filas capturadas.

Cuando una aplicación llama a SQLFetch en un controlador ODBC 2.x, SQLFetch se asigna a SQLExtendedFetch y, por tanto, devuelve un valor en este búfer.
SQL_ATTR_ROW_ARRAY_SIZE Establece el tamaño del conjunto de filas.

Si una aplicación llama a SQLBulkOperations con una operación de SQL_ADD en un controlador ODBC 2.x, se usará SQL_ROWSET_SIZE para la llamada, no SQL_ATTR_ROW_ARRAY_SIZE, porque la llamada se asigna a SQLSetPos con una operación de SQL_ADD, que usa SQL_ROWSET_SIZE.

Llamar a SQLSetPos con una operación de SQL_ADD o SQLExtendedFetch en un controlador ODBC 2.x usa SQL_ROWSET_SIZE.

Llamar a SQLFetch o SQLFetchScroll en un controlador ODBC 2.x usa SQL_ATTR_ROW_ARRAY_SIZE.
SQLBulkOperations Realiza operaciones de inserción y marcador. Cuando se llama a SQLBulkOperations con una operación de SQL_ADD en un controlador ODBC 2.x, se asigna a SQLSetPos con una operación de SQL_ADD. A continuación se muestran los detalles de implementación:

- Cuando se trabaja con un controlador ODBC 2.x, una aplicación debe usar solo el ARD asignado implícitamente asociado a StatementHandle; no puede asignar otro ARD para agregar filas, ya que las operaciones de descriptor explícitas no se admiten en un controlador ODBC 2.x. Una aplicación debe usar SQLBindCol para enlazar con ARD, no SQLSetDescField ni SQLSetDescRec.
- Al llamar a un controlador ODBC 3.x, una aplicación puede llamar a SQLBulkOperations con una operación de SQL_ADD antes de llamar a SQLFetch o SQLFetchScroll. Al llamar a un controlador ODBC 2.x, una aplicación debe llamar a SQLFetchScroll antes de llamar a SQLBulkOperations con una operación de SQL_ADD.
SQLFetch Devuelve el siguiente conjunto de filas. A continuación se muestran los detalles de implementación:

- Cuando una aplicación llama a SQLFetch en un controlador ODBC 2.x, se asigna a SQLExtendedFetch.
- Cuando una aplicación llama a SQLFetch en un controlador ODBC 3.x, devuelve el número de filas especificadas con el atributo de instrucción SQL_ATTR_ROW_ARRAY_SIZE.
SQLFetchScroll Devuelve el conjunto de filas especificado. A continuación se muestran los detalles de implementación:

- Cuando una aplicación llama a SQLFetchScroll en un controlador ODBC 2.x, devuelve SQLSTATE 01S01 (error en fila) antes de cada error que se aplica a una sola fila. Esto solo se debe a que el Administrador de controladores ODBC 3.x lo asigna a SQLExtendedFetch y SQLExtendedFetch devuelve este SQLSTATE. Cuando una aplicación llama a SQLFetchScroll en un controlador ODBC 3.x, nunca devuelve SQLSTATE 01S01 (error en fila).
- Cuando una aplicación llama a SQLFetchScroll en un controlador ODBC 2.x con FetchOrientation establecido en SQL_FETCH_BOOKMARK, el argumento FetchOffset debe establecerse en 0. Se devuelve SQLSTATE HYC00 (característica opcional no implementada) si se intenta capturar marcadores basados en desplazamiento con un controlador ODBC 2.x.

Nota:

Las aplicaciones de ODBC 3.x no deben usar SQLExtendedFetch ni el atributo de instrucción SQL_ROWSET_SIZE. En su lugar, deben usar SQLFetchScroll y el atributo de instrucción SQL_ATTR_ROW_ARRAY_SIZE. Las aplicaciones de ODBC 3.x no deben usar SQLSetPos con una operación de SQL_ADD, pero deben usar SQLBulkOperations con una operación de SQL_ADD.