Actualizaciones por posición (ODBC)
ODBC admite dos métodos para realizar actualizaciones por posición en un cursor:
SQLSetPos
Cláusula WHERE CURRENT OF
El procedimiento habitual es utilizar 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 utilizar con cualquier conjunto de resultados de instrucciones cuando los atributos de cursor del identificador de instrucción se establecen para utilizar cursores del servidor. Las columnas del conjunto de resultados deben estar enlazadas a variables de programa. En cuanto la aplicación obtiene 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 buena alternativa para crear y ejecutar una instrucción SQL. SQLSetPos funciona en el conjunto de filas actual y sólo se puede utilizar 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 utiliza un nuevo tamaño del conjunto de filas, pero sólo 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 a SQLFetchScroll. La llamada a SQLSetPos utiliza el tamaño del conjunto de filas anterior, pero SQLFetch o SQLFetchScroll utiliza 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 del conjunto de filas; es decir, su valor debe estar en el intervalo comprendido entre 1 y el número de filas que se han obtenido 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 varias 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 de filas.
Cuando SQLSetPos vuelve, la fila eliminada es la fila actual y su estado es SQL_ROW_DELETED. La fila no se puede utilizar en ninguna operación de colocación adicional, como en las llamadas a SQLGetData o SQLSetPos.
Al eliminar todas las filas del conjunto de filas (RowNumber es igual a 0), la aplicación puede evitar que el controlador elimine determinadas filas utilizando la matriz de operación de filas de igual forma que 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 obtenidos, 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 a SQLFetch para recuperar una fila.
Llame a SQLSetPos (SQL_POSITION) para colocar el cursor en la fila.
Genere y ejecute una instrucción UPDATE con una cláusula WHERE ACTUAL OF utilizando el nombre del cursor establecido con SQLSetCursorName.
También 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 ningún nombre de cursor mediante SQLSetCursorName.
SQLSetPos prevalece frente a WHERE OF ACTUAL cuando se utilizan 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.