Compartir vía


Actualizaciones por posición (ODBC)

Se aplica a: SQL Server Azure SQL Database Azure SQL Instancia administrada Azure Synapse Analytics Analytics Platform System (PDW)

ODBC admite dos métodos para realizar actualizaciones por posición en un cursor:

  • SQLSetPos

  • Cláusula WHERE CURRENT OF

El enfoque más común es usar SQLSetPos. Tiene las opciones siguientes.

SQL_POSITION
Sitúa el cursor en una fila específica del conjunto de filas actual.

SQL_REFRESH
Actualiza las variables de programa enlazadas a las columnas del conjunto de resultados mediante los valores de la fila en la que está situado el cursor actualmente.

SQL_UPDATE
Actualiza la fila actual del cursor mediante los valores almacenados en las variables de programa que están enlazadas a las columnas del conjunto de resultados.

SQL_DELETE
Elimina la fila actual del cursor.

SQLSetPos se puede usar con cualquier conjunto de resultados de instrucción cuando se establecen los atributos de cursor del controlador de instrucciones para usar cursores de servidor. Las columnas del conjunto de resultados deben estar enlazadas a variables de programa. En cuanto la aplicación haya capturado una fila, llama a SQLSetPos(SQL_POSTION) para colocar el cursor en la fila. A continuación, la aplicación podría llamar a SQLSetPos(SQL_DELETE) para eliminar la fila actual, o puede mover los nuevos valores de datos a las variables de programa enlazadas y llamar a SQLSetPos(SQL_UPDATE) para actualizar la fila actual.

Las aplicaciones pueden actualizar o eliminar cualquier fila del conjunto de filas con SQLSetPos. Llamar a SQLSetPos es una alternativa conveniente para construir y ejecutar una instrucción SQL. SQLSetPos funciona en el conjunto de filas actual y solo se puede usar después de una llamada a SQLFetchScroll.

El tamaño del conjunto de filas se establece mediante una llamada a SQLSetStmtAttr con un argumento de atributo de SQL_ATTR_ROW_ARRAY_SIZE. SQLSetPos usa un nuevo tamaño de conjunto de filas, pero solo después de una llamada a SQLFetch o SQLFetchScroll. Por ejemplo, si se cambia el tamaño del conjunto de filas, se llama a SQLSetPos y, a continuación , se llama a SQLFetch o SQLFetchScroll . La llamada a SQLSetPos usa el tamaño del conjunto de filas anterior, pero SQLFetch o SQLFetchScroll usa el nuevo tamaño del conjunto de filas.

La primera fila del conjunto de filas es el número de fila 1. El argumento RowNumber de SQLSetPos debe identificar una fila en el conjunto de filas; es decir, su valor debe estar en el intervalo entre 1 y el número de filas que se capturaron más recientemente. Esto valor puede ser menor que el tamaño del conjunto de filas. Si RowNumber es 0, la operación se aplica a cada fila del conjunto de filas.

La operación de eliminación de SQLSetPos hace que el origen de datos elimine una o más filas seleccionadas de una tabla. Para eliminar filas con SQLSetPos, la aplicación llama a SQLSetPos con Operation establecido en SQL_DELETE y RowNumber establecido en el número de la fila que se va a eliminar. Si RowNumber es 0, se eliminan todas las filas del conjunto.

Después de que SQLSetPos devuelva, la fila eliminada es la fila actual y su estado es SQL_ROW_DELETED. La fila no se puede usar en ninguna operación posicionada adicional, como llamadas a SQLGetData o SQLSetPos.

Al eliminar todas las filas del conjunto de filas (RowNumber es igual a 0), la aplicación puede impedir que el controlador elimine determinadas filas mediante la matriz de operaciones de fila igual que para la operación de actualización de SQLSetPos.

Cada fila que se elimina debe ser una fila que exista en el conjunto de resultados. Si los búferes de la aplicación se rellenaron con los valores capturados, y si se ha mantenido una matriz de estado de fila, sus valores en cada una de estas posiciones de fila no deben ser SQL_ROW_DELETED, SQL_ROW_ERROR ni SQL_ROW_NOROW.

Las actualizaciones por posición también se pueden realizar utilizando la cláusula WHERE CURRENT OF en instrucciones UPDATE, DELETE e INSERT. WHERE CURRENT OF requiere un nombre de cursor que ODBC generará cuando se llame a la función SQLGetCursorName o que puede especificar llamando a SQLSetCursorName. A continuación, se incluyen los pasos generales utilizados para ejecutar una actualización WHERE CURRENT OF en una aplicación ODBC:

  • Llame a SQLSetCursorName para establecer un nombre de cursor para el identificador de instrucción.

  • Genere una instrucción SELECT con una cláusula FOR UPDATE OF y ejecútela.

  • Llame a SQLFetchScroll para recuperar un conjunto de filas o SQLFetch para recuperar una fila.

  • Llame a SQLSetPos (SQL_POSITION) para colocar el cursor en la fila.

  • Compile y ejecute una instrucción UPDATE con una cláusula WHERE CURRENT OF mediante el nombre del cursor establecido con SQLSetCursorName.

Como alternativa, podría llamar a SQLGetCursorName después de ejecutar la instrucción SELECT en lugar de llamar a SQLSetCursorName antes de ejecutar la instrucción SELECT. SQLGetCursorName devuelve un nombre de cursor predeterminado asignado por ODBC si no establece un nombre de cursor mediante SQLSetCursorName.

SQLSetPos es preferible a WHERE CURRENT OF cuando se usan cursores de servidor. Si utiliza un cursor estático actualizable con la biblioteca de cursores ODBC, la biblioteca de cursores implementa las actualizaciones WHERE CURRENT OF agregando una cláusula WHERE con los valores de clave de la tabla subyacente. Esto puede dar lugar a actualizaciones no deseadas si las claves de la tabla no son únicas.

Consulte también

Usar cursores (ODBC)