Partilhar via


Atualizações posicionadas (ODBC)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada SQL do Azure do Azure Synapse AnalyticsAnalytics Platform System (PDW)

ODBC suporta dois métodos para executar atualizações posicionadas em um cursor:

  • SQLSetPos

  • ONDE ATUAL DE cláusula

A abordagem mais comum é usar SQLSetPos. Tem as seguintes opções.

SQL_POSITION
Posiciona o cursor em uma linha específica no conjunto de linhas atual.

SQL_REFRESH
Atualiza as variáveis do programa vinculadas às colunas do conjunto de resultados com os valores da linha em que o cursor está posicionado no momento.

SQL_UPDATE
Atualiza a linha atual no cursor com os valores armazenados nas variáveis do programa vinculadas às colunas do conjunto de resultados.

SQL_DELETE
Exclui a linha atual no cursor.

SQLSetPos pode ser usado com qualquer conjunto de resultados de instrução quando os atributos do cursor do identificador de instrução são definidos para usar cursores de servidor. As colunas do conjunto de resultados devem ser vinculadas a variáveis de programa. Assim que o aplicativo busca uma linha, ele chama SQLSetPos(SQL_POSITION) 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 de programa acopladas 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 após uma chamada para SQLFetchScroll.

O tamanho do conjunto de linhas é definido por uma chamada para SQLSetStmtAttr com um argumento de atributo de SQL_ATTR_ROW_ARRAY_SIZE. SQLSetPos usa um novo tamanho de conjunto de linhas, mas somente após uma chamada para SQLFetch ou SQLFetchScroll. Por exemplo, se o tamanho do conjunto de linhas for alterado, SQLSetPos for chamado e, em seguida, SQLFetch ou SQLFetchScroll for chamado. A chamada para SQLSetPos usa o tamanho do conjunto de linhas antigo, mas SQLFetch ou SQLFetchScroll usa o novo tamanho do conjunto de linhas.

A primeira linha do conjunto de linhas é a linha número 1. O argumento RowNumber em SQLSetPos deve identificar uma linha no conjunto de linhas; ou seja, seu valor deve estar no intervalo entre 1 e o número de linhas que foram buscadas mais recentemente. Isso pode ser menor do que o tamanho do conjunto de linhas. Se RowNumber for 0, a operação se aplicará a todas as linhas do conjunto de linhas.

A operação de exclusão de SQLSetPos faz com que a fonte de dados exclua uma ou mais linhas selecionadas de uma tabela. Para excluir linhas com SQLSetPos, o aplicativo chama SQLSetPos com Operation definido como SQL_DELETE e RowNumber definido como o número da linha a ser excluída. Se RowNumber for 0, todas as linhas do conjunto de linhas serão excluídas.

Depois que SQLSetPos retorna, a linha excluída é a linha atual e seu status é SQL_ROW_DELETED. A linha não pode ser usada em nenhuma operação posicionada adicional, como chamadas para SQLGetData ou SQLSetPos.

Quando você exclui todas as linhas do conjunto de linhas (RowNumber é igual a 0), o aplicativo pode impedir que o driver exclua determinadas linhas usando a matriz de operação de linha como para a operação de atualização do SQLSetPos.

Cada linha excluída deve ser uma linha que existe no conjunto de resultados. Se os buffers do aplicativo foram preenchidos por busca e se uma matriz de status de linha foi mantida, seus valores em cada uma dessas posições de linha não devem ser SQL_ROW_DELETED, SQL_ROW_ERROR ou SQL_ROW_NOROW.

As atualizações posicionadas também podem 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. A seguir estão as etapas gerais 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.

  • Crie uma instrução SELECT com uma cláusula FOR UPDATE OF 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.

  • Crie e execute uma instrução UPDATE com uma cláusula WHERE CURRENT OF usando o nome do cursor definido com SQLSetCursorName.

Como alternativa, você pode chamar SQLGetCursorName depois de executar a instrução SELECT em vez de chamar SQLSetCursorName antes de executar a instrução SELECT. SQLGetCursorName retorna um nome de cursor padrão atribuído pelo ODBC se você não definir um nome de cursor usando SQLSetCursorName.

SQLSetPos é preferível a WHERE CURRENT OF quando você estiver usando cursores de servidor. Se você estiver usando um cursor estático e atualizável com a biblioteca de cursores ODBC, a biblioteca de cursores implementará as atualizações WHERE CURRENT OF adicionando uma cláusula WHERE com os valores de chave para a tabela subjacente. Isso pode causar atualizações não intencionais se as chaves na tabela não forem exclusivas.

Ver também

Usando cursores (ODBC)