Compartir vía


Construcción de instrucciones Searched

Importante

Esta característica se quitará en una versión futura de Windows. Evite usar esta característica en el nuevo trabajo de desarrollo y planee modificar las aplicaciones que actualmente usan esta característica. Microsoft recomienda usar la funcionalidad del cursor del controlador.

Para admitir instrucciones update y delete posicionadas, la biblioteca de cursores construye una instrucción UPDATE o DELETE buscada a partir de la instrucción posicionada. Para admitir llamadas a SQLGetData en un bloque de datos, la biblioteca de cursores crea una instrucción SELECT buscada para crear un conjunto de resultados que contenga la fila de datos actual. En cada una de estas instrucciones, la cláusula WHERE enumera los valores almacenados en la memoria caché para cada columna enlazada que devuelve SQL_PRED_SEARCHABLE o SQL_PRED_BASIC para el identificador de campo de SQL_DESC_SEARCHABLE en SQLColAttribute.

Precaución

La cláusula WHERE construida por la biblioteca de cursores para identificar la fila actual puede no identificar las filas, identificar una fila diferente o identificar más de una fila.

Si una instrucción update o delete posicionada afecta a más de una fila, la biblioteca de cursores actualiza la matriz de estado de fila solo para la fila en la que se coloca el cursor y devuelve SQL_SUCCESS_WITH_INFO y SQLSTATE 01001 (conflicto de la operación de cursor). Si la instrucción no identifica ninguna fila, la biblioteca de cursores no actualiza la matriz de estado de fila y devuelve SQL_SUCCESS_WITH_INFO y SQLSTATE 01001 (conflicto de operaciones de cursor). Una aplicación puede llamar a SQLRowCount para determinar el número de filas que se actualizaron o eliminaron.

Si la cláusula SELECT usada para colocar el cursor de una llamada a SQLGetData identifica más de una fila, no se garantiza que SQLGetData devuelva los datos correctos. Si no identifica ninguna fila, SQLGetData devuelve SQL_NO_DATA.

Si una aplicación cumple las instrucciones siguientes, la cláusula WHERE construida por la biblioteca de cursores debe identificar de forma única la fila actual, excepto cuando esto es imposible, como cuando el origen de datos contiene filas duplicadas.

  • Enlace columnas que identifiquen de forma única la fila. Si las columnas enlazadas no identifican de forma única la fila, la cláusula WHERE construida por la biblioteca de cursores podría identificar más de una fila. En una instrucción update o delete posicionada, esta cláusula puede hacer que se actualice o elimine más de una fila. En una llamada a SQLGetData, esta cláusula podría hacer que el controlador devuelva datos de la fila incorrecta. Enlazar todas las columnas de una clave única garantiza que cada fila se identifique de forma única.

  • Asigne búferes de datos lo suficientemente grandes como para que no se produzca ningún truncamiento. La memoria caché de la biblioteca de cursores es una copia de los valores de los búferes del conjunto de filas enlazados al conjunto de resultados con SQLBindCol. Si los datos se truncan cuando se colocan en estos búferes, también se truncarán en la memoria caché. Es posible que una cláusula WHERE construida a partir de valores truncados no identifique correctamente la fila subyacente en el origen de datos.

  • Especifique búferes de longitud no NULL para los datos binarios de C. La biblioteca de cursores asigna búferes de longitud en su memoria caché solo si el argumento StrLen_or_IndPtr en SQLBindCol no es NULL. Cuando se SQL_C_BINARY el argumento TargetType , la biblioteca de cursores requiere la longitud de los datos binarios para construir una cláusula WHERE a partir de los datos. Si no hay ningún búfer de longitud para una columna de SQL_C_BINARY y la aplicación llama a SQLGetData o intenta ejecutar una instrucción update o delete posicionada, la biblioteca de cursores devuelve SQL_ERROR y SQLSTATE SL014 (se emitió una solicitud posicionada y no todos los campos de recuento de columnas se almacenaron en búfer).

  • Especifique búferes de longitud que no aceptan valores NULL para las columnas que aceptan valores NULL. La biblioteca de cursores asigna búferes de longitud en su memoria caché solo si el argumento StrLen_or_IndPtr en SQLBindCol no es NULL. Dado que SQL_NULL_DATA se almacena en el búfer de longitud, la biblioteca de cursores supone que cualquier columna para la que no se especifique ningún búfer de longitud no acepta valores NULL. Si no se especifica ninguna columna de longitud para una columna que acepta valores NULL, la biblioteca de cursores construye una cláusula WHERE que usa el valor de datos para la columna. Esta cláusula no identificará correctamente la fila.