Função SQLSetCursorName
Conformidade
Versão introduzida: Conformidade com as normas ODBC 1.0: ISO 92
Resumo
SQLSetCursorName associa um nome de cursor a uma instrução ativa. Se um aplicativo não chamar SQLSetCursorName, o driver gerará nomes de cursor conforme necessário para o processamento de instruções SQL.
Sintaxe
SQLRETURN SQLSetCursorName(
SQLHSTMT StatementHandle,
SQLCHAR * CursorName,
SQLSMALLINT NameLength);
Argumentos
StatementHandle
[Entrada] Identificador de instrução.
CursorName
[Entrada] Nome do cursor. Para um processamento eficiente, o nome do cursor não deve incluir espaços à esquerda ou à direita no nome do cursor e, se o nome do cursor incluir um identificador delimitado, o delimitador deve ser posicionado como o primeiro caractere no nome do cursor.
NameLength
[Entrada] Comprimento em caracteres de *CursorName.
Devoluções
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR ou SQL_INVALID_HANDLE.
Diagnóstico
Quando
SQLSTATE | Erro | Descrição |
---|---|---|
01000 | Advertência geral | Mensagem informativa específica do motorista. (A função retorna SQL_SUCCESS_WITH_INFO.) |
01004 | Dados da cadeia de caracteres, truncados à direita | O nome do cursor excedeu o limite máximo, portanto, apenas o número máximo permitido de caracteres foi usado. |
24000 | Estado do cursor inválido | A instrução correspondente a StatementHandle já estava em um estado executado ou posicionado no cursor. |
34000 | Nome do cursor inválido | O nome do cursor especificado em *CursorName era inválido porque excedia o comprimento máximo definido pelo driver ou começava com "SQLCUR" ou "SQL_CUR". |
3C000 | Nome do cursor duplicado | O nome do cursor especificado em *CursorName já existe. |
HY000 | Erro geral | Ocorreu um erro para o qual não havia SQLSTATE específico e para o qual nenhum SQLSTATE específico de implementação foi definido. A mensagem de erro retornada por |
HY001 | Erro de alocação de memória | O driver não pôde alocar a memória necessária para suportar a execução ou conclusão da função. |
HY009 | Uso inválido de ponteiro nulo | (DM) O argumento CursorName era um ponteiro nulo. |
HY010 | Erro de sequência de função | (DM) Uma função de execução assíncrona foi chamada para o identificador de conexão associado ao StatementHandle. Essa função assíncrona ainda estava em execução quando a função SQLSetCursorName foi chamada. (DM) Uma função de execução assíncrona foi chamada para o StatementHandle e ainda estava em execução quando essa função foi chamada. (DM) SQLExecute, SQLExecDirect, SQLBulkOperationsou SQLSetPos foi chamado para o StatementHandle e retornou SQL_NEED_DATA. Esta função foi chamada antes de os dados serem enviados para todos os parâmetros ou colunas de dados em execução. |
HY013 | Erro de gerenciamento de memória | A chamada de função não pôde ser processada porque os objetos de memória subjacentes não puderam ser acessados, possivelmente devido a condições de pouca memória. |
HY090 | String inválida ou comprimento do buffer | (DM) O argumento NameLength era inferior a 0, mas não igual a SQL_NTS. |
HY117 | A conexão é suspensa devido ao estado desconhecido da transação. Apenas as funções de desconexão e somente leitura são permitidas. | (DM) Para obter mais informações sobre o estado suspenso, consulte função SQLEndTran. |
HYT01 | O tempo limite de conexão expirou | O período de tempo limite de conexão expirou antes que a fonte de dados respondesse à solicitação. O período de tempo limite da conexão é definido por meio SQLSetConnectAttr SQL_ATTR_CONNECTION_TIMEOUT. |
IM001 | Driver não suporta esta função | (DM) O driver associado ao StatementHandle não suporta a função. |
Observações
Os nomes dos cursores são usados apenas em instruções de atualização e exclusão posicionadas (por exemplo, UPDATEnome da tabela ...ONDE CURRENT OFCURSOR-NAME). Para obter mais informações, consulte instruções Positioned Update and Delete. Se o aplicativo não chamar SQLSetCursorName para definir um nome de cursor, na execução de uma instrução de consulta o driver gera um nome que começa com as letras SQL_CUR e não excede 18 caracteres de comprimento.
Todos os nomes de cursor dentro da conexão devem ser exclusivos. O comprimento máximo de um nome de cursor é definido pelo driver. Para máxima interoperabilidade, recomenda-se que os aplicativos limitem os nomes dos cursores a não mais de 18 caracteres. No ODBC 3*.x*, se um nome de cursor for um identificador entre aspas, ele será tratado de maneira sensível a maiúsculas e minúsculas e poderá conter caracteres que a sintaxe do SQL não permitiria ou trataria especialmente, como espaços em branco ou palavras-chave reservadas. Se um nome de cursor deve ser tratado de maneira que diferencia maiúsculas de minúsculas, ele deve ser passado como um identificador entre aspas.
Um nome de cursor definido explícita ou implicitamente permanece definido até que a instrução à qual está associado seja descartada, usando SQLFreeHandle. SQLSetCursorName pode ser chamado para renomear um cursor em uma instrução, desde que o cursor esteja em um estado alocado ou preparado.
Exemplo de código
No exemplo a seguir, um aplicativo usa SQLSetCursorName para definir um nome de cursor para uma instrução. Em seguida, ele usa essa instrução para recuperar resultados da tabela CUSTOMERS. Finalmente, ele executa uma atualização posicionada para alterar o número de telefone de John Smith. Observe que o aplicativo usa identificadores de instrução diferentes para as instruções SELECT e UPDATE.
Para obter outro exemplo de código, consulte SQLSetPos.
#define NAME_LEN 50
#define PHONE_LEN 10
SQLHSTMT hstmtSelect,
SQLHSTMT hstmtUpdate;
SQLRETURN retcode;
SQLHDBC hdbc;
SQLCHAR szName[NAME_LEN], szPhone[PHONE_LEN];
SQLINTEGER cbName, cbPhone;
/* Allocate the statements and set the cursor name. */
SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmtSelect);
SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmtUpdate);
SQLSetCursorName(hstmtSelect, "C1", SQL_NTS);
/* SELECT the result set and bind its columns to local buffers. */
SQLExecDirect(hstmtSelect,
"SELECT NAME, PHONE FROM CUSTOMERS",
SQL_NTS);
SQLBindCol(hstmtSelect, 1, SQL_C_CHAR, szName, NAME_LEN, &cbName);
SQLBindCol(hstmtSelect, 2, SQL_C_CHAR, szPhone, PHONE_LEN, &cbPhone);
/* Read through the result set until the cursor is */
/* positioned on the row for John Smith. */
do
retcode = SQLFetch(hstmtSelect);
while ((retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) &&
(strcmp(szName, "Smith, John") != 0));
/* Perform a positioned update of John Smith's name. */
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
SQLExecDirect(hstmtUpdate,
"UPDATE EMPLOYEE SET PHONE=\"2064890154\" WHERE CURRENT OF C1",
SQL_NTS);
}
Funções relacionadas
Para obter informações sobre | Ver |
---|---|
Executando uma instrução SQL | Função SQLExecDirect |
Executando uma instrução SQL preparada | da função SQLExecute |
Devolver um nome de cursor | da função SQLGetCursorName |
Definindo opções de rolagem do cursor | da função SQLSetScrollOptions |
Ver também
de referência da API ODBC
Arquivos de cabeçalho ODBC