Article: Q125767
Product(s): Open Database Connectivity (ODBC)
Version(s): WINDOWS:2.0
Operating System(s):
Keyword(s):
Last Modified: 12-JUN-2001
2.00.2317
WINDOWS
kbprg kberrmsg
-------------------------------------------------------------------------------
The information in this article applies to:
- Microsoft Open Database Connectivity, version 2.0
-------------------------------------------------------------------------------
SYMPTOMS
========
When you use the ODBC desktop drivers, the following message is displayed after
SQExecDirect or SQLPrepare fails with a SQL_ERROR return code:
Query too complex
CAUSE
=====
There are two possible causes for this:
- Application is running low on stack space.
- The SQL query is hitting the defined SQL limits in the driver. For instance,
the desktop database driver help files ODBCDRV.HLP and ODBCDRV32.HLP (16- and
32-bit versions, respectively) list the SQL limitations:
a. Maximum of 40 AND predicates in a WHERE clause.
b. Maximum of 16 tables in a FROM clause.
c. Maximum of 40 search conditions in a HAVING clause.
If a snapshot is created on a table with more than 40 columns, Microsoft
Foundation Classes (MFC) applications will get this error message on using the
CRecordSet::Update method. This is because the MFC database classes use the
Cursor Library for snapshots, and on a CRecordSet::Update, the Cursor Library
builds a WHERE clause listing all the columns in the table. This WHERE clause
has more than 40 AND predicates, therefore, an error is reported by the driver.
Note: An MFC ODBC application that references long binary data using the
RFX_LongBinary function may encounter this error when the recordset is opened.
This is because the cursor library precedes calls to SQLGetData with the
execution of a SELECT statement with a WHERE clause as described above.
The long binary column does not contribute toward exceeding the 40-column limit
because it is not referenced in the generated WHERE clause.
RESOLUTION
==========
To resolve the first cause above, you must set the stack size to 20K or more.
To resolve the second cause, where the error occurs on the CRecordSet::Update
method, you must:
- Force MFC to use the native cursor functionality within the driver instead of
using the Cursor Library. This is typically done by creating a dynaset
instead of a snapshot, and be ensuring that the CDatabase object used by your
CRecordset object does not load the cursor library. This is done by setting
the fifth argument of CDatabase::Open to FALSE. (This also implies you will
need to explicitly create and open a CDatabase object for your CRecordset
object.)
OR
- Reduce the number of columns in the recordset.
Additional query words: 2.00.2317 Access dbase fox paradox 16bit 32bit MFC database classes Windows NT
======================================================================
Keywords :
Technology : kbAudDeveloper kbODBCSearch kbODBC200
Version : WINDOWS:2.0
Issue type : kbprb
=============================================================================