Newsgroup: it.comp.lang.visual-basic
Titolo: Complessita' query per ADO

Salve a tutti!
In un prg mi connetto ad Oracle 8 con Ado 2.6. I recordset li apro con una 
procedura del tipo:
Procedure OpenRecordset(ByVal Connessione as ADODB.Connection, _
                        ByRev MyRs as ADODB.Recordset, _
                        ByVal sStringa as String)
  With MyRs
    .CursorType = adopenForwardOnly
    .ActiveConnection = Connessione
    .Source = sStringa
    .Open , , , , adCmdText
  End With
End Proc
Funziona, tranne per una query abbastanza aggrovigliata, con una struttura 
tipo ( <Query1> MINUS <Query2> ) UNION ( <Query3> ) ORDER BY ...
Eseguendo il bloccone da TOAD, va tutto ok...non e' che ADO 2.6 ha dei 
limiti sulla complessita' delle query da aprire? Per la cronaca, l'apertura 
non riporta nessun errore, solo che MyRs.State vale 0 sia prima che dopo 
(mentre dovrebbe passare da 0 ad 1, come fa in tutti gli altri casi).
Qualche suggerimento?
Bye by SixaM 8-]


DIMENTICAVO COSA IMPORTANTE
uso Oracle Data Control (oradc.ocx)
Alberto

Ho risolto, ma in un modo veramente becero:
query non funzionante:
(SELECT CAMPO1, CAMPO2, .. FROM TABELLA WHERE <condizione1>
MINUS
SELECT CAMPO1, CAMPO2, .. FROM TABELLA WHERE <condizione2>)
UNION
SELECT CAMPO1, CAMPO2, .. FROM TABELLA WHERE <condizione3>
query funzionante
SELECT CAMPO1, CAMPO2, .. FROM
  (SELECT CAMPO1, CAMPO2, .. FROM TABELLA WHERE <condizione1>
  MINUS
  SELECT CAMPO1, CAMPO2, .. FROM TABELLA WHERE <condizione2>)
UNION
SELECT CAMPO1, CAMPO2, .. FROM TABELLA WHERE <condizione3>
L'unica ipotesi e' che la clausola MINUS nel primo caso 
viene...'interpretata' a livello piu' alto che nel secondo, in cui resta 
nascosta. Infatti, una query del tipo SELECT COUNT(*) FROM (
  (SELECT CAMPO1, CAMPO2 FROM TABELLA WHERE <condizione1>
  MINUS
  SELECT CAMPO1, CAMPO2 FROM TABELLA WHERE <condizione2>)
  UNION
  SELECT CAMPO1, CAMPO2 FROM TABELLA WHERE <condizione3>
)
funzionava...mah... 8-o
Bye by SixaM 8-]

     .ActiveConnection = Connessione
Non entro nel merito del problema principale, che vedo che hai risolto, ma
ti segnalo che impostare una connessione in questo modo non è la maniera
giusta.
Oltre al fatto di utilizzare le proprietà predefinite, che in generale
riducono la leggibilità del codice, perchè aprire una connessione aggiuntiva
(con rischio anche di terminare le licenze disponibili sul server), quando
ne hai già una aperta?
Ciao
Alberto


Bye by SixaM 8-]
-- 
Using M2, Opera's revolutionary e-mail client: 
http://www.opera.com/m2/

 esistente.
Vero.
Passi alla funzione la connessione esistente.
Ma poi non la utilizzi.
Ti sei mai chiesto come mai davanti a quel .ActiveConnection=Connessione non
ci sia il SET?
Perchè la proprietà predefinita dell'oggetto Adodb.Connection è
.ConnectionString.
Quindi, omettendo il set, imponi l'utilizzo della proprietà predefinita
Connectionstring, quindi sfrutti una stringa anzichè un oggetto, e quindi il
recordset NON PUO' basarsi sulla connection esistente, perchè non ne ha mai
ricevuto il puntatore, che invece gli avresti consegnato usando il Set.
Senza che tu te ne accorga, il recordset si apre una nuova connection tutta
per se, la usa, e poi la rilascia quando non ne ha più bisogno.
Che questo venga, a volte, mascherato dal connection pooling di Ado, o che
non ti crei problemi perchè il tuo server non conta le licenze, posso
capirlo, ma è importante sapere quello che si sta facendo.
E tu, con quel codice, non stai utilizzando una connessione esistente.
Questo, in generale, è male.
ciao
Alberto

 posso capirlo, ma č importante sapere quello che si sta facendo.
Dimenticavo: con provider che non supportano il "Persist Security Info", e
con autenticazioni non trusted, il tuo metodo non funziona proprio, anzichč
semplicemente ridurre le performance.
Ciao
Alberto