Atualizações posicionadas (ODBC)
O ODBC dá suporte a dois métodos para executar atualizações posicionadas em um cursor:
SQLSetPos
Cláusula WHERE CURRENT OF
A abordagem mais comum é usar SQLSetPos. Ela tem as seguintes opções:
SQL_POSITION
Posiciona o cursor ODBC em uma linha específica do conjunto de linhas atual.SQL_REFRESH
Atualiza variáveis de programa associadas às colunas de conjunto de resultados com os valores da linha em que cursor está atualmente posicionado.SQL_UPDATE
Atualiza a linha atual do cursor com os valores armazenados nas variáveis de programa associadas às colunas do conjunto de resultados.SQL_DELETE
Exclui a linha atual do cursor.
SQLSetPos pode ser usado com qualquer conjunto de resultados de instrução quando o cursor do identificador da instrução for definido para usar cursores do servidor. As colunas do conjunto de resultados devem ser associadas para programar variáveis. Assim que o aplicativo busca uma linha, ele chama SQLSetPos(SQL_POSTION) para posicionar o cursor na linha. O aplicativo pode então chamar SQLSetPos(SQL_DELETE) para excluir a linha atual ou pode mover novos valores de dados para as variáveis do programa associado e chamar SQLSetPos(SQL_UPDATE) para atualizar a linha atual.
Os aplicativos podem atualizar ou excluir qualquer linha no conjunto de linhas com SQLSetPos. Chamar SQLSetPos é uma alternativa conveniente para construir e executar uma instrução SQL. SQLSetPos opera no conjunto de linhas atual e pode ser usado somente depois de uma chamada a SQLFetchScroll.
O tamanho do conjunto de linhas é definido por SQLSetStmtAttr com um argumento de atributo de SQL_ATTR_ROW_ARRAY_SIZE. SQLSetPos usa um tamanho de conjunto de linhas novo, mas somente depois de uma chamada para SQLFetch ou SQLFetchScroll. Por exemplo, se o tamanho de conjunto de linhas for alterado, SQLSetPos será chamado e então SQLFetch ou SQLFetchScroll serão chamados. A chamada para SQLSetPos usa o tamanho de conjunto de linhas antigo, mas SQLFetch ou SQLFetchScroll usa o tamanho de conjunto de linhas novo.
A primeira linha do conjunto de linhas é o número de linha 1. O argumento RowNumber em SQLSetPos deve identificar uma linha no conjunto de linhas, isto é, seu valor deve estar na faixa entre 1 e o número de linhas buscado mais recentemente. Ele pode ser menor que o tamanho do conjunto de linhas. Se RowNumber for 0, a operação se aplicará a toda linha no conjunto de linhas.
A operação de exclusão do SQLSetPos faz com que a fonte de dados exclua uma ou mais linhas selecionadas em uma tabela. Para excluir linhas com SQLSetPos, o aplicativo chama SQLSetPos com Operation definido como SQL_DELETE e RowNumber definido como o número de linhas a excluir. Se RowNumber for 0, todas as linhas do conjunto de linhas serão excluídas.
Depois que SQLSetPos for retornado, a linha excluída será a linha atual e seu status será SQL_ROW_DELETED. A linha não pode ser usada em operações posicionadas adicionais, como chamadas para SQLGetData ou SQLSetPos.
Quando você exclui todas as linhas de um conjunto de linhas (RowNumber é igual a 0), o aplicativo pode impedir que o driver exclua determinadas linhas usando a matriz de operação de linhas como ocorre com a operação de atualização do SQLSetPos.
Todas as linhas excluídas devem existir no conjunto de resultados. Se os buffers do aplicativo tiverem sido preenchidos pela busca e se uma matriz de status de linha tiver sido mantida, seus valores em cada uma das novas posições não deverão ser SQL_ROW_DELETED, SQL_ROW_ERROR ou SQL_ROW_NOROW.
Atualizações posicionadas também pode ser executadas usando a cláusula WHERE CURRENT OF nas instruções UPDATE, DELETE e INSERT. WHERE CURRENT OF requer um nome de cursor que o ODBC gerará quando a função SQLGetCursorName for chamada ou que você pode especificar chamando SQLSetCursorName. As etapas gerais a seguir são usadas para executar uma atualização WHERE CURRENT OF em um aplicativo ODBC:
Chame SQLSetCursorName para estabelecer um nome de cursor para o identificador de instrução.
Compile uma instrução SELECT com uma cláusula FOR UPDATE DE e execute-a.
Chame SQLFetchScroll para recuperar um conjunto de linhas ou SQLFetch para recuperar uma linha.
Chame SQLSetPos (SQL_POSITION) para posicionar o cursor na linha.
Compile e execute uma instrução UPDATE com uma cláusula WHERE CURRENT OF que usa o nome de cursor definido com SQLSetCursorName.
Como alternativa, chame SQLGetCursorName depois de executar a instrução SELECT, em vez de chamar SQLSetCursorName antes de executar a instrução SELECT. SQLGetCursorName retornará um nome de cursor padrão atribuído por ODBC, se você não definir um nome de cursor usando SQLSetCursorName.
SQLSetPos tem preferência sobre WHERE CURRENT OF quando você estiver usando cursores de servidor. Se você estiver usando um cursor atualizável estático com a biblioteca de cursores ODBC, a biblioteca de cursores implementará as atualizações WHERE CURRENT OF com os valores de chave para a tabela subjacente. Isso pode provocar atualizações não pretendidas, caso as chaves da tabela não foram exclusivas.