Newsgroup: it.comp.lang.visual-basic
Titolo: ADO e Errore 3360 Query Troppo Complessa - Notizia forse di interesse comune

Lo sapevate che non si può aggiornare un recorset con più di 39 campi??
Ma dove sta scritto  ??
Ho risolto il problema ma penso che questo possa essere di interesse comune.
Ricapitolando :
ADO 2.0 o ADO 2.1 indifferentemente
apro il recordset con 65 campi :
 RS.Open sSql, Db, adOpenStatic, adLockBatchOptimistic
oppure
 RS.Open sSql, Db, adOpenKeyset, adLockBatchOptimistic
indifferentemente
Se eseguo un inserimento quindi
 Rs.addnew
 ........ routine aggiornamento campi
        If RS.EditMode = adEditInProgress Then
        RS.UpdateBatch adAffectAll
        End If
 ............ movimenti nel recordset
 risultato: tutto funziona
Se aggiorno il recordset
 ........ routine aggiornamento campi
        If RS.EditMode = adEditInProgress Then
        RS.UpdateBatch adAffectAll
        End If
 risultato :   ERRORE-QUERY TROPPO COMPLESSA
Aggirando l'ostacolo
 ........ routine aggiornamento dei primi 39 campi
        If RS.EditMode = adEditInProgress Then
        RS.UpdateBatch adAffectAll
        End If
 ........ routine aggiornamento dei successivi 26 campi
        If RS.EditMode = adEditInProgress Then
        RS.UpdateBatch adAffectAll
        End If
 risultato :   funziona
Deduco :
 In ADO 2.0 e ADO 2.1 non si può aggiornare un recorset con più di 39 campi
in
 una sola transazione, ma bisogna spezzare il recordset in blocchi di 39
campi
 invocando ogni volta l'update.
Come è possibile. Dove lo trovo referenziato in MSDN
Ovvero, dove sbaglio??
Per questo ho perso 2 gg. di lavoro ??
Tra le tante informazioni sull'errore 3360 - query troppo complessa ho
trovato:
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.
da dove in effetti, anche se con un ragionamento conseguente,si potrebbe
dedurre che la query
non deve interessare più di 40 campi.
In realtà, comunque, non può interessare più di 39 campi.
E comunque, di ciò, nessuna traccia nel msdn di Visual Studio 6.
Veramente inspiegabile.
Saluti a tutti per l'interessamento.

...


rsAdo.UpdateBatch adAffectAll
Certo, hai ragione, è più veloce, ma resta il fatto che non è comprensibile
che con ado 2.1 non si sia messo riparo ai numerosi bug di ado.
Se usi Update nei singoli campi incappi sullo stesso errore.
Con i Command la gestione dei corsori, in alcuni casi, va a pallino in
maniera inspiegabile, privando così il programmatore a query sql di
aggiornamento, inserimento etc.
Trovo che dovendo gestire in maniera pesante grossi o numerosi archivi, ciò
non è assolutamente accettabile.
E meno male che ADO è il gestore di punta e del futuro !
Spero che presto si faccia chiarezza e soprattutto si risolvano i problemi.
Soprattutto, documentare e documentare. Non si può stare un'ora al giorno in
internet per reperire documentazione!
Ciao.