Article ID: 195979 - Last Review: March 14, 2005 - Revision: 3.2 PRB: Error "Syntax Error Near 'Tablename'" on Recordset UpdateThis article was previously published under Q195979 On This PageSYMPTOMS With SQL Server's quoted_identifier option set to Off, you
may receive the following error: Run-time error
'-2147217900 (80040e14)': Line 1: Syntax error near 'tablename' CAUSE With ADO client-side cursors, when you invoke an ADO
recordset's AddNew or Update method, the OLE DB Provider prepares a SQL statement to send to
SQL Server. The Microsoft OLE DB Provider for SQL Server automatically quotes identifiers on an ADO recordset's Update method and may quote identifiers on an AddNew method. Identifiers include table names and field names. For example, updating the Titles table in the Pubs database with the following code: If SQL Server's Quoted_Identifier option is set to Off, SQL Server will not recognize table names and field names enclosed in quotes. The error "Syntax error near 'tablename'" occurs. RESOLUTION If you do not have a reason to set quoted identifiers off,
set them back on and the above error message will no longer be shown. If it is necessary to have quoted identifiers set off, following are two workarounds that allow you to set the quoted_identifier option off and update records using ADO recordsets:
STATUS This behavior is by design. MORE INFORMATION ADO and the underlying OLE DB Provider are not aware of the
SQL Server setting for the quoted_identifier, as set by the Transact SQL
(T-SQL) statements:
The OLE DB Provider for SQL Server automatically quotes identifiers to ensure that if the identifier contains a special character, it will be quoted, as required by SQL Server. Note that the identifier does not have to actually contain a special character. It is only the possibility that causes the OLE DB Provider to quote the identifier. The OLE DB Provider for SQL Server does not have a property to explicitly specify that identifiers should or should not be quoted. You can configure the OLE DB provider for ODBC to prepare SQL statements with or without quotes around identifiers. It uses the ODBC driver setting for QuotedID to determine whether to quote identifiers. For this reason, you may include the "QuotedID=Yes" or "QuotedID=No" option in the ODBC connect string, or select/deselect "Use ANSI Quoted Identifiers" in a DSN setup. Note that, by default, "QuotedID=Yes", instructing the ODBC to quote identifiers. When you use ADO server-side cursors, cursors open on the server. The OLE DB Provider prepares the T-SQL sp_cursoropen, sp_cursorfetch, and related server-side cursor statements, instead of action queries. The ADO Connection object's "Quoted Identifier Sensitivity" property shows the configuration a Provider uses to quote identifiers. The "Quoted Identifier Sensitivity" property is read-only, and only available at run- time after the Connection object has been opened. The "Quoted Identifier Sensitivity" property is only available for certain Providers, including the SQL Server and ODBC Providers. Since the property is read-only, you cannot use the "Quoted Identifier Sensitivity" property to configure a Provider to quote or not quote identifiers. The ADO Connection object's read-only "Quoted Identifier Sensitivity" property will be as follows: 8 - When the Provider is configured to quote identifiers. 0 - When the Provider is configured not to quote identifiers. Steps to Reproduce BehaviorNOTE: In the following code examples, substitute your server's name for servername in the connection strings.This example uses the Pubs database that comes with SQL Server.
Examples of WorkaroundsUsing the OLE DB Provider for ODBC Drivers (MSDASQL)You must use the SQL Server ODBC driver 2.65.0240 that ships with SQL Server 6.5 Service Pack 2, or a later driver.Modify the connection string in the preceding example to the following. Note You must change UID <username> and PWD <strong password> to the correct values before you run this code. Make sure that UID has the appropriate permissions to perform this operation on the database. strcn = "Provider=MSDASQL;driver=SQL Server;UID=<user name>;PWD=<strong password>;" strcn = strcn & "DATABASE=pubs;SERVER=servername;QuotedId=No" Using Server-Side CursorsModify the cn.CursorLocation in the preceding example to the following:cn.CursorLocation = adUseServer REFERENCES SQL Server Books Online; search on: "quoted_identifier."
For a discussion of configuring the SQL Server ODBC Driver with quoted_identifier on or off, please see the following article in the Microsoft Knowledge Base: 135533
(http://support.microsoft.com/kb/135533/EN-US/
)
INF: Differences in SQL Behavior Between ODBC and ISQL
For additional information on the Microsoft ActiveX Data
Objects, please visit the following Web site: http://msdn.microsoft.com/dataaccessado/
(http://msdn.microsoft.com/dataaccessado/)
APPLIES TO
| Article Translations
|
Back to the top
