CORRECÇÃO: Biblioteca de base de dados sp_cursor falha a mensagem de erro 16933 se Bracketed identificadores são transmitidos com o parâmetro nomedatabela

Traduções de Artigos Traduções de Artigos
Artigo: 290413 - Ver produtos para os quais este artigo se aplica.
N.º DE BUGS: 352148 (SHILOH_BUGS)
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Quando utilizar cursores servidor API de biblioteca de base de dados, se o parâmetro de nome de tabela que é transmitido para sp_cursor armazenado procedimento inclui um identificador entre parênteses, a execução de sp_cursor falha com a seguinte mensagem de erro:
SQL Server mensagem 16933, estado 2, gravidade 16:
O cursor não inclui a tabela a ser modificada ou a tabela não é actualizável através do cursor.
Consulte a secção "Mais informação" deste artigo para um exemplo e sintomas adicionais.

Causa

SQL Server não consegue analisar com êxito o nome da tabela entre parênteses com espaços.

Biblioteca de base de dados liga-se o nome da tabela como um tipo de dados SQLCHAR, que tem um comprimento fixo de 255 caracteres (o tamanho máximo deste tipo de dados). A memória intermédia contém o nome da tabela, incluindo os parênteses, com os restantes bytes preenchidos com espaços.

Resolução

Para resolver este problema, obtenha o service pack mais recente do SQL Server 2000. Para obter informações adicionais, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
290211INF: How to Obtain the Latest SQL Server 2000 Service Pack

Como contornar

Para contornar o problema, remova os parênteses do nome da tabela na função dbcursor ; por exemplo:
dbcursor(hcursor, CRS_INSERT, 1, "curTblTest", "'a'");
				

Ponto Da Situação

A Microsoft confirmou que este é um problema no SQL Server 2000. Este problema foi corrigido pela primeira vez no SQL Server 2000 Service Pack 1.

Mais Informação

O Microsoft ® SQL Server ? fornecedor OLE DB, controlador de ODBC para SQL Server e bibliotecas de programação de biblioteca de base de dados têm funções especiais cursor optimizadas para operações do cursor entre uma aplicação cliente e um computador que esteja a executar o SQL Server. Estas funções de cursor (ou API) utilizar cursores do servidor que são implementados através da utilização de procedimentos especiais de sistema armazenados no SQL Server do qual sp_cursor é um. Para mais informações, consulte o tópico "API Server cursores" no SQL Server Books Online.

O fornecedor de OLE DB, o controlador ODBC e interface de programação de biblioteca de base de dados todos os têm formas diferentes de chamar estes procedimentos armazenado do sistema. Estes procedimentos armazenado do sistema aparecem no SQL Server Profiler rastreios de aplicações do Microsoft ActiveX Data Objects (ADO), OLE DB, ODBC e biblioteca de base de dados que utilizam a API de servidor cursores. Estes procedimentos armazenado do sistema destinam apenas a utilização interna de SQL Server Provider para OLE DB, o controlador de ODBC para SQL Server e a DLL da biblioteca de base de dados. A funcionalidade completa destes procedimentos está disponível para as aplicações através da utilização da funcionalidade de cursor da base de dados APIs. Especificar os procedimentos directamente numa aplicação não é suportada.

Passos para reproduzir o comportamento

O exemplo que se segue utiliza dbcursor biblioteca de base de dados cursor função, que pode utilizar para efectuar actualizações posicionais, elimina ou insere. Pode encontrar mais informações sobre a utilização da função dbcursor no SQL Server Books Online. Os parâmetros que são passados para a função dbcursor incluir o nome tabela da tabela que está a ser modifed. Implementação da função real consiste numa chamada para sp_cursor com o nome da tabela transmitido como um parâmetro.
  1. Crie a seguinte tabela utilizando o SQL Server Query Analyzer:
    create table curTblTest ( col1 char(10))
    					
  2. Utilizar dbcursor API de biblioteca de base de dados para inserir uma única linha:
    /* 
     * For clarity purposes, DB connection and error handling steps 
     * were not included in the sample code. 
     */ 
    :
    DBCURSOR  *hcursor;
    DBINT	  pstat[5];
    char 	  col1[5][11];
    :
       hcursor = dbcursoropen(dbproc,
                              "select col1 from [curTblTest]", 
                               CUR_DYNAMIC, CUR_LOCKCC, 5, pstat);
       dbcursorbind(hcursor, 1, NTBSTRINGBIND, 11, NULL, (LPBYTE )col1);
       dbcursor(hcursor, CRS_INSERT, 1, "[curTblTest]", "'a'");
       dbcursorclose(hcursor);
    					
    o código de falha com a mensagem de 16933 erro. Para observar o que foi enviado para o computador com o SQL Server, utilize o utilitário de SQL Profiler e capturar os seguintes eventos com as colunas de dados adequado:

    • Procedimentos armazenados - RPC: início
    • Erros e excepções - aviso
Foi capturado o rastreio de Profiler de exemplo seguinte:

RPC:Starting

exec sp_cursor @cursor = 180150000, @optype = 4, @rownumber = 1, 
@table = '[curTblTest]  ... padded with 244 spaces ...  ', @VALUES = 
'''a'''

Exception
    
Error: 16933, Severity: 16, State: 2

SQL Server was not able to parse "@table = '[curTblTest]        '" 
correctly.

				

Propriedades

Artigo: 290413 - Última revisão: 6 de novembro de 2003 - Revisão: 3.2
A informação contida neste artigo aplica-se a:
  • Microsoft SQL Server 2000 Standard Edition
Palavras-chave: 
kbmt kbbug kbfix kbsqlserv2000sp1fix KB290413 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 290413

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com