PRB: CDBException Thrown Opening Recordset on Stored Procedure (170823)
The information in this article applies to:
- The Microsoft Foundation Classes (MFC), when used with:
- Microsoft Visual C++, 32-bit Editions 2.0
- Microsoft Visual C++, 32-bit Editions 2.1
- Microsoft Visual C++, 32-bit Editions 2.2
- Microsoft Visual C++, 32-bit Editions 4.0
- Microsoft Visual C++, 32-bit Editions 4.0a
- Microsoft Visual C++, 32-bit Editions 4.1
- Microsoft Visual C++, 32-bit Editions 4.2b
- Microsoft Visual C++, 32-bit Enterprise Edition 4.2
- Microsoft Visual C++, 32-bit Professional Edition 4.2
- Microsoft Visual C++ for Windows, 16-bit edition 1.52
This article was previously published under Q170823 SYMPTOMS
When you use the "Call" syntax to invoke a stored procedure when opening a
recordset, an exception might be thrown. Depending upon the version of
Visual C++, whether or not you have DB Tracing enabled and the DBMS in use,
you might see one of the following errors:
Version: 4.X
Message Box: <See below for DBMS specific error message>
Output Window: <See below for DBMS specific error message>
State:37000,Native:<DBMS specific>,Origin:[<vendor>]
[<driver name/version>][<DBMS--optional>]
Error: ODBC failure on SQLPrepare->
Version: 2.X
Message Box: Internal application error.
Output Window: <See below for DBMS specific error message>
State:37000,Native:<DBMS specific>,Origin:[<vendor>]
[<driver name/version>][<DBMS--optional>]
Error: ODBC failure on SQLPrepare.
Version: 1.5X
Message Box: Internal application error.
Output Window: <See below for DBMS specific error message>
State:37000[<vendor>][<driver name/version>]
[<DBMS--optional>]
DBMS specific error information:
DBMS Error String Native Code
------------------------------------------------------------------
SQL Server: Incorrect syntax near the keyword 'EXEC'. 156
Access: Syntax error in FROM clause. -3506
(and other
desktop
drivers)
NOTE: If you are using Visual C++ 1.5X and connecting to a 16-bit SQL
Server datasource, an exception may not be thrown but the desired result
set is not returned.
CAUSE
While this line of code may appear to be a perfectly valid way to invoke a
stored procedure, there is a small error:
m_pSet->Open(CRecordset::snapshot, "{ Call szCallTest}");
The space between the "{" and the "C" cause MFC to misinterpret the Call
statement as the name of a table. MFC makes a case insensitive comparison
between any SQL provided in the Open() call and the literal constant
szCall, which is defined as _T("{call "). If the comparison fails, the
provided SQL is incorrectly incorporated into a SELECT statement that is
executed instead of the stored procedure call.
RESOLUTION
Make sure that there are no extra spaces between the first curly brace and
the "Call" key word.
STATUS
This behavior is by design.
Modification Type: | Major | Last Reviewed: | 12/2/2003 |
---|
Keywords: | kbDatabase kbprb KB170823 |
---|
|