Identificativo articolo: 195979 - Ultima modifica: lunedì 14 marzo 2005 - Revisione: 3.2

PRB: Errore "Errore di sintassi accanto alla tabella 'nometabella" "all'aggiornamento di Recordset

Suggerimento di sistemaIl presente articolo fa riferimento a un sistema operativo diverso da quello in uso. Il contenuto dell'articolo che potrebbe non essere relativo al sistema in uso è disabilitato.

In questa pagina

Espandi tutto | Chiudi tutto

Sintomi

Opzione di SQL Server quoted_identifier impostata su OFF, è possibile che venga visualizzato il seguente errore:
Errore di run-time '-2147217900 (80040e14)':
Riga 1: Errore di sintassi vicino "tablename"
Questo errore si verifica quando si utilizzano i cursori sul lato client con provider OLE DB per SQL Server (SQLOLEDB). L'errore si verifica su un ActiveX Data Objects metodo Update del recordset (ADO) e potrebbero verificarsi in un metodo AddNew .

Cause

Con cursori sul lato client ADO, quando si richiama un oggetto ADO metodo AddNew o aggiornamento del recordset, il provider OLE DB prepara un'istruzione SQL per inviare a SQL Server.

Il Provider Microsoft OLE DB per SQL Server automaticamente virgolette gli identificatori di metodo Update di un recordset ADO e può essere offerta gli identificatori di un metodo AddNew . Gli identificatori includono i nomi delle tabelle e i nomi dei campi.

Aggiornamento, ad esempio, della tabella dei titoli nel database pubs con il codice riportato di seguito:
MyADORecordet.Update
				
il precedente dovrebbe essere preparati analogo al seguente:
UPDATE "titles" SET "title"='Hello World' WHERE "title_id"='3'
				
nota che il nome della tabella è racchiuso tra virgolette, "titoli", e che ogni nome di campo è in offerte, "titolo", "title_id" e così via.

Se SQL Server opzione QUOTED_IDENTIFIER è impostata su OFF, SQL Server non riconosce i nomi di tabella e campo nomi racchiusi tra virgolette.

Si verifica l'errore "Errore di sintassi vicino"tablename"".

Risoluzione

Se non si dispone di un motivo per impostare l'identificatori tra virgolette, consente di impostarli nuovamente in e il precedente messaggio di errore non verrà visualizzato.

Se è necessario disporre di identificatori distanziare tra virgolette, riportato di seguito è due soluzioni alternative che consentono di impostare l'opzione quoted_identifier off e aggiornare i record utilizzando ADO Recordset:
  • Utilizzare i cursori sul lato server.

    Ad esempio, prima di aprire un oggetto ADO Connection denominato cn, utilizzare la seguente sintassi:
    cn.CursorLocation = adUseServer
    						
    - oppure -
  • Utilizzare il Provider Microsoft OLE DB per driver ODBC con il driver ODBC di Microsoft SQL Server.

    Per impostazione predefinita, il ODBC SQL Server driver virgolette gli identificatori. Tuttavia, è possibile configurare il ODBC SQL Server driver per la preparazione di istruzioni SQL senza virgolette gli identificatori.

    Nota : È necessario utilizzare il driver ODBC SQL Server 2.65.0240 fornito con SQL Server 6.5 Service Pack 2 o un driver versione successivo. Versioni precedenti di SQL Server Driver ODBC non dispongono di questa funzionalità.
    1. Aggiungere "QuotedID = No" nella stringa di connessione ODBC.

      - oppure -
    2. Deselezionare Usa ANSI identificatori tra virgolette la configurazione del nome origine dati Microsoft SQL Server (DSN).
      1. Aprire Amministratore ODBC.
      2. Aprire il DSN utente o DSN di sistema che si utilizza per connettersi al database di SQL Server.
      3. Fare clic su Avanti fino a raggiungere la finestra di dialogo con Identificatori tra virgolette ANSI di utilizzo .
      4. Deselezionare la casella di controllo accanto a Identificatori tra virgolette ANSI di utilizzo .
      5. Fare clic su Fine .
Nota : esempi di entrambi soluzioni alternative sono racchiusi tra le "informazioni" sezione.

Status

Questo comportamento legato alla progettazione.

Informazioni

ADO e il sottostante provider OLE DB non sono a conoscenza di impostazione per il quoted_identifier, come impostato da di Transact SQL (T-SQL) istruzioni SQL Server:
  • Set quoted_identifier Off

    - oppure -
  • Set quoted_identifier on
Comportamento di identificatore tra virgolette lato client ADO è derivata dal provider OLE DB sottostante. Di conseguenza, per utilizzare i cursori sul lato client, è necessario configurare il provider a un'offerta o non identificatori di offerta, a seconda dell'impostazione di SQL Server per quoted_identifier.

Il provider OLE DB per SQL Server offerte automaticamente gli identificatori per garantire che se l'identificatore contiene un carattere speciale, esso verrà racchiuso tra virgolette, come richiesto da SQL Server. Si noti che l'identificatore non è effettivamente contenere un carattere speciale. È solo la possibilità che fa sì che il provider OLE DB citare l'identificatore. Il provider OLE DB per SQL Server non dispone di una proprietà per specificare che gli identificatori devono o non devono essere racchiuso tra virgolette in modo esplicito.

È possibile configurare il provider OLE DB per ODBC preparare le istruzioni SQL con o senza racchiudere gli identificatori tra virgolette. Utilizza l'impostazione di driver ODBC per QuotedID per determinare se gli identificatori di offerta. Per questo motivo, è possibile includere il "QuotedID = yes"o"QuotedID = No" opzione ODBC connettersi stringa oppure selezionare/deselezionare "Usa ANSI tra virgolette identificatori" in una configurazione DSN. Si noti che, per impostazione predefinita, "QuotedID = yes", con le istruzioni ODBC per gli identificatori di offerta.

Quando si utilizzano ADO cursori sul lato server, i cursori aperti sul server. Il provider OLE DB consente di preparare i sp_cursoropen T-SQL, sp_cursorfetch e istruzioni di cursore sul lato server correlato, anziché le query di azione.

Proprietà di "Quoted identifier riservatezza" dell'oggetto ADO Connection illustrata la configurazione che un provider utilizzato per gli identificatori di offerta. La proprietà "Quoted Identifier Sensitivity" è di sola lettura e disponibile solo in fase di esecuzione dopo l'apertura dell'oggetto Connection. La proprietà "Quoted Identifier Sensitivity" disponibile solo per alcuni provider, inclusi il SQL Server e il provider ODBC. Poiché la proprietà è di sola lettura, non è possibile utilizzare la proprietà "Quoted Identifier Sensitivity" per configurare un provider per offerta o l'offerta non identificatori.

L'oggetto ADO Connection di lettura - solo proprietà di "Quoted identifier riservatezza" sarà come segue:
   8 - When the Provider is configured to quote identifiers.
   0 - When the Provider is configured not to quote identifiers.
				

Procedura per riprodurre il problema

Nota: Sostituire il nome del server per nomeserver nelle stringhe di connessione nell'esempio di codice riportato di seguito.

In questo esempio viene utilizzato il database pubs fornito con SQL Server.
  1. Creare l'interfaccia utente:
    1. In Visual Basic, creare un nuovo progetto EXE standard. In base all'impostazione predefinita, viene creato il progetto Form1.
    2. Aggiungere un pulsante di comando a Form1.
  2. Impostare un riferimento di Microsoft ActiveX Data Objects Library.
  3. Copiare e incollare il codice riportato di seguito nell'evento Click di Command1.

    Nota <username>È necessario modificare ID utente <nomeutente> e la password < strong password > con i valori corretti prima di eseguire questo codice. Assicurarsi che ID utente disponga di autorizzazioni appropriati eseguire questa operazione sul database.
    Dim strcn As String
          Dim cn As New ADODB.Connection
          Dim rs As New ADODB.Recordset
    
          strcn = "Provider=SQLOLEDB;User ID=<user name>;Password=<strong password>;Initial Catalog=Pubs;"
          strcn = strcn &amp; "Data Source=servername"
    
          cn.ConnectionString = strcn
    
          'Error occurs with Client-side cursors.
          cn.CursorLocation = adUseClient
    
          cn.Open
    
          'Instruct SQL Server to turn off Quoted_Identifier.
          cn.Execute "set quoted_identifier off"
    
          rs.Open "select * from titles", cn, adOpenKeyset, adLockOptimistic
          rs(1).Value = "Hello World"
    
          'Error occurs on this line.
          rs.Update
    
          rs.Close
          Set rs = Nothing
          cn.Close
          Set cn = Nothing
    					
  4. Testare l'applicazione con quanto riportato di seguito:
    1. Facoltativamente, avviare il programma di SQL Server SQLTrace sul server. SQLTrace è un programma di autonomo nel gruppo SQL Server 6.5. SQLTrace consente di visualizzare le istruzioni SQL che arrivano a SQL Server.
    2. In Visual Basic, il pulsante di comando in fase di esecuzione causa l'errore seguente:
      Run-time error '-2147217900 (80040e14)':
                     Line 1: Syntax error near 'tablename'
      						
    3. Se si utilizza SQLTrace, è possibile esaminare T-SQL, l'istruzione UPDATE che ha creato il provider OLE DB per SQL Server. Si noti che i nomi di tabella e i nomi di campo vengono visualizzate tra virgolette.

Esempi di soluzioni

Utilizzo del provider OLE DB per driver ODBC (MSDASQL)

È necessario utilizzare il driver ODBC SQL Server 2.65.0240 fornito con SQL Server 6.5 Service Pack 2 o un driver versione successivo.

Modificare la stringa di connessione nell'esempio precedente al seguente.

Nota <username>È necessario modificare UID <nomeutente> e PWD < strong password > con i valori corretti prima di eseguire questo codice. Assicurarsi che UID disponga di autorizzazioni appropriati eseguire questa operazione sul database.
   strcn = "Provider=MSDASQL;driver=SQL Server;UID=<user name>;PWD=<strong password>;"
   strcn = strcn &amp; "DATABASE=pubs;SERVER=servername;QuotedId=No"
				

Utilizzo dei cursori del server

Modificare il cn.CursorLocation nell'esempio precedente al seguente:
   cn.CursorLocation = adUseServer
				
se si utilizza il programma di SQL Server SQLTrace, è possibile esaminare le istruzioni di sp_cursor T-SQL che crea il provider OLE DB.

Riferimenti

Documentazione in linea di SQL Server; cercare in: "quoted_identifier."

Per una descrizione della configurazione il driver ODBC di SQL Server con quoted_identifier on or off, vedere il seguente articolo della Microsoft Knowledge Base riportato di seguito:
135533  (http://support.microsoft.com/kb/135533/EN-US/ ) INF: Differenze nel comportamento SQL tra ODBC e ISQL
Per ulteriori informazioni su Microsoft ActiveX Data Objects, vedere il seguente sito Web:
http://msdn.microsoft.com/dataaccessado/ (http://msdn.microsoft.com/dataaccessado/)

Le informazioni in questo articolo si applicano a:
  • Microsoft ActiveX Data Objects 1.5
  • Microsoft ActiveX Data Objects 2.0
  • Microsoft ActiveX Data Objects 2.1 Service Pack 2
  • Microsoft ActiveX Data Objects 2.5
  • Microsoft ActiveX Data Objects 2.6
  • Microsoft ActiveX Data Objects 2.7
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
Chiavi: 
kbmt kbprb KB195979 KbMtit
Traduzione automatica articoliTraduzione automatica articoli
Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 195979  (http://support.microsoft.com/kb/195979/en-us/ )
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.