Partilhar via


Alterando linhas com operações posicionadas

Os cursores atualizáveis dão suporte a instruções de modificação de dados que atualizam as linhas por meio do cursor. Quando posicionado em uma linha de um cursor atualizável, você poderá realizar operações de atualização ou de exclusão que têm como alvo as linhas da tabela base usadas para criar a linha atual do cursor. São as chamadas atualizações posicionadas.

As atualizações posicionadas são executadas na mesma conexão que abriu o cursor. Isso permite que as modificações de dados compartilhem o mesmo espaço de transação do cursor e impede que as atualizações sejam barradas por bloqueios mantidos pelo cursor.

Há dois métodos para executar atualizações posicionadas em um cursor:

  • Cláusula Transact-SQL WHERE CURRENT OF em uma instrução UPDATE ou DELETE.

  • Um banco de dados API posicionou a função ou o método de atualização, como a função SQLSetPos ODBC.

Executando atualizações posicionadas com Transact-SQL

A cláusula WHERE CURRENT OF do Transact-SQL é usada, em geral, em procedimentos armazenados, gatilhos e scripts do Transact-SQL, quando se torna necessário fazer modificações com base nas linhas especificadas de um cursor. O procedimento armazenado, gatilho ou script irão:

  • DECLARE e OPEN um cursor.

  • Usar instruções FETCH para posicionamento em linha de cursor.

  • Executar uma instrução UPDATE ou DELETE usando uma cláusula WHERE CURRENT OF. Usar o cursor_name da instrução DECLARE como cursor_name da cláusula WHERE CURRENT OF.

Executando atualizações posicionadas com APIs

Os cursores criados por funções e métodos DB OLE e ADO não são usados em cláusulas WHERE CURRENT OF por não terem nomes. O ODBC, no entanto, dá suporte à obtenção de nome para um cursor de servidor API com a função SQLGetCursorName. Depois de definir os atributos de cursor e abrir um cursor executando uma instrução do Transact-SQL, use a função SQLGetCursorName para adquirir um nome para o cursor. Após o posicionamento no cursor, execute uma instrução UPDATE ou DELETE com uma cláusula WHERE CURRENT OF que referencia o nome retornado por SQLGetCursorName. Esse método, entretanto, não é recomendado. O melhor, em vez dele, é usar as funções de atualização posicionadas no ODBC API.

As APIs de banco de dados dão suporte a dois métodos diferentes para executar operações posicionados em cursores de servidor API. O ODBC dá suporte a um modelo; OLE DB e ADO, a outro modelo.

No ODBC, associe as colunas do cursor para programar variáveis e, em seguida, posicione-as em uma linha específica de cursor. Quando executar uma atualização posicionada, altere os valores de dados das variáveis de programa para os valores novos. Chame a função SQLSetPos para executar a operação posicionada.

Essa função oferece as seguintes opções:

  • SQLSetPos(SQL_POSITION)
    Somente ODBC, posiciona o cursor ODBC em uma linha específica do conjunto atual de linhas.

  • SQLSetPos(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.

  • SQLSetPos(SQL_UPDATE)
    Atualiza a linha atual do cursor com os valores armazenados nas variáveis de programa associadas às colunas do conjunto de resultados.#

  • SQLSetPos(SQL_DELETE)
    Exclui a linha atual do cursor.

O OLE DB e ADO usam um modelo diferente para oferecer suporte a atualizações posicionadas.

No OLE DB, quando posicionado em uma linha dentro do conjunto de linhas, chame os métodos IRowsetChange::SetData ou IRowsetChange::DeleteRows para executar atualizações posicionadas. Se o provedor OLE DB oferecer suporte a IRowsetUpdate::Update, as alterações feitas com os métodos IRowsetChange serão armazenadas em cache até que você chame IRowsetUpdate::Update. Se o provedor OLE DB não oferecer suporte a IRowsetUpdate::Update, as alterações feitas com os métodos IRowsetChange serão feitas de imediato.

No ADO, quando posicionado em uma linha dentro do conjunto de registros, chame os métodos Update ou Delete do objeto Recordset para executar atualizações posicionadas. Se o provedor OLE DB oferecer suporte a IRowsetUpdate::Update, as alterações feitas com os métodos Update ou Delete do objeto Recordset são armazenadas em cache até que você chame o método UpdateBatch do objeto Recordset. Se o provedor OLE DB não oferecer suporte a IRowsetUpdate::Update, as alterações feitas com os métodos Update ou Delete do objeto Recordset são feitas imediatamente.

Consulte também

Referência

Conceitos