Newsgroup: it.comp.appl.access
Titolo: Ado, query parametriche e problemi

Non sono esperto di ADO (ho sempre usato DAO) ed ho il seguente
problema:
Ho delle query parametriche che devono essere aperte da codice. Potrei
usare DAO ma dato che lo stesso codice dovrà funzionare anche con Sql
Server (e store procedure) ho deciso di usare ADO per uniformare il
codice.
Ho scritto il seguente codice che mentre funziona quando il db è Sql
Server  mi va in errore quando il db è access.
-------------------
Dim DbConn As ADODB.Connection
Dim DbRst_Generico As ADODB.Recordset
Dim DbCmd_Generico As ADODB.Command
Set DbConn = CurrentProject.Connection 'Sono in VBA dentro access
Set DbCmd_Generico = New ADODB.Command
DbCmd_Generico.ActiveConnection = DbConn
DbCmd_Generico.CommandText = "qryDati"
DbCmd_Generico.Parameters("NomeParametro1") = ....
DbCmd_Generico.Parameters("NomeParametro2") = .... 
DbCmd_Generico.CommandType = adCmdStoredProc
Set DbRst_Generico = DbCmd_Generico.Execute
-------------------
Da' un errore di runtime (numero negativo) quando arriva ad eseguire
la 
DbCmd_Generico.Parameters e dice "Istruzione SQL non valida. Prevista
'DELETE', 'INSERT',..."
Girando un po' in rete ho visto che sarebbe meglio usare anche ADOX
assieme
ad ADO e quindi ho convertito (partendo da un esempio in internet) il
codice nella forma 
--------------------
Dim DbConn As ADODB.Connection
Dim DbCatalog as ADOX.Catalog
Dim DbRst_Generico As ADODB.Recordset
Dim DbCmd_Generico As ADODB.Command
Set DbConn = CurrentProject.Connection 'Sono in VBA dentro access
Set DbCatalog = New ADOX.Catalog
DbCatalog.ActiveConnection = DbConn
Set DbCmd_Generico = DbCatalog.Procedures("qryDati").Command
DbCmd_Generico.ActiveConnection = DbConn
DbCmd_Generico.Parameters("NomeParametro1") = ....
DbCmd_Generico.Parameters("NomeParametro2") = .... 
DbCmd_Generico.CommandType = adCmdStoredProc
Set DbRst_Generico = DbCmd_Generico.Execute
---------------------
Ma anche cosi' stesso errore di prima e nello stesso punto.
Alla fine ho ottenuto il funzionamento solo quando l'ho modificato in
---------------------
Dim DbConn As ADODB.Connection
Dim DbRst_Generico As ADODB.Recordset
Dim DbCmd_Generico As ADODB.Command
Dim Parametri as Variant
Set DbConn = CurrentProject.Connection 'Sono in VBA dentro access
Set DbCmd_Generico = New ADODB.Command
DbCmd_Generico.ActiveConnection = DbConn
Parametri = Array (.... , ....)
DbCmd_Generico.CommandType = adCmdStoredProc
Set DbRst_Generico = DbCmd_Generico.Execute(, Parametri)
----------------------
Cosi' funziona, ma solo se i parametri non sono mai a NULL.
In tale caso mi da' errore di runtime 3001 ("Gli argomenti non sono
validi ....")
Concludendo quindi vi chiedo:
1) Dove ho sbagliato, ossia perchè le prime 2 forme non vanno con
Access (ma vanno invece con SQL Server) e come si possono aggiustare
per farle funzionare (in particolare la prima senza ADOX).
2) Come faccio a farlo funzionare quando uno o + parametri sono a
NULL.
Ciao
Fabrizio

 -------------------
[CUT]
Ma perchè DAO non funziona con SQL_SERVER e StoredProcedure...??
Strano da me va tutto con A97......!
Se non sei costretto a cambiare usa pure DAO.
@Alex.


Ciao
Fabrizio

 ha scritto nel messaggio
news:o08s0vg2kpiv0kham...@4ax.com...

Sono spiacente di non poterti aiutare, ma ADO non l'ho quasi mai usato,
quindi dovrei
dedicarmici.... per risponderti....!
Ma se hai un pò di tempo prova a fare un Test di quanto impiega ADO e DAO
a reperire lo stesso Recordset via ODBC-Direct......! Poi mi sai dire....!
Io uso DAO 3.51(A97) connesso ad un Server MySQL via ODBC direct, non
rinuncio
a nulla, funziona molto bene.
Capisco che se ormai hai sviluppato in una direzione conviene che prosegui.
Io solitamente non mi oriento verso il più comodo, ma verso il più
performante.....!
@Alex.

---------------------
Ho risolto. 
Per la prima forma del codice mi sa che non ci sono soluzioni, mentre
la seconda (quella quotata sopra) va cosi' corretta.
--------------------
Dim DbConn As ADODB.Connection
Dim DbCatalog as ADOX.Catalog
Dim DbRst_Generico As ADODB.Recordset
Dim DbCmd_Generico As ADODB.Command
Set DbConn = CurrentProject.Connection 'Sono in VBA dentro access
Set DbCatalog = New ADOX.Catalog
DbCatalog.ActiveConnection = DbConn
Set DbCmd_Generico = DbCatalog.Procedures("qryDati").Command
DbCmd_Generico.CommandType = adCmdStoredProc
DbCmd_Generico.Parameters("[NomeParametro1]") = ....
DbCmd_Generico.Parameters("[NomeParametro2]") = .... 
Set DbRst_Generico = DbCmd_Generico.Execute
---------------------
Insomma andava eliminata la dichiarazione di activeconnection per
dbcmd_generico (la connessione viene ereditata dall'oggetto command di
DbCatalog) ed i nomi parametri erano da scrivere tra [] (cosi' come
appaiono nel Sql della query).
Cosi' funziona ed accetta anche i parametri a NULL, cosa che la terza
forma invece non permetteva (ma forse anche li' ci sarebbe qualche
correzzione da fare).
Ciao
Fabrizio


Ciao
Fabrizio

Oppure puoi usare una cosa del tipo:
[cut]
cmd.CommandType = adCmdText
cmd.CommandText = "exec nomestoredprocedure @nomeparam1=valore1,
@nomeparam2=valore2, ecc., ecc."
cmd.Execute
Ciao