Newsgroup: it.comp.lang.visual-basic
Titolo: [ADO] Anomalie per add/update

Spero che questo post sia d'aiuto a qualcuno, io ci ho sbattuto la testa
per 2 giorni, ed ora che ho risolto non so nemmeno perche' funziona...
Antefatto:
per aggiornare i dati uso una procedurina del tipo
Dim cmd as ADODB.Command
Set CMD.ActiveConnection = <mia AdoDbconnessione>
CMD.CommandText = <mia query tipo insert into... o update_set>
CMD.Execute
Inizio: 
VB6+ADO2.6+Access2000: la cosa funziona da dio...e va bene anch con
Oracle.
Il dramma:
su un pc con ADO2.5, connettendomi a SQLServer2000, inizio ad avere una
caterva di errori 3265 (una ricerca su Google mi informa che e' l'errore
che ADO da quando non trova un elemento). Le query, eseguite da
QueryAnalyser, funziano perfettamente...
La soluzione:
ripeto: non so anora perche' il metodo originale andava in errore, ne'
perche' il nuovo metodo funziona.
Dim Rs as new ADODB.Recordset
set rs.ActiveConnection = <mia AdoDbconnessione>
rs.cursorlocation = aduseserver
rs.open <la query di prima>, , adopenstatic, adlockoptimistic, adcmdtext
set rs = nothing
Bye by SixaM 8-]
P.S. Il mil bl (livello di basitura ( = l'essere basito)) si sta
pericolosamente avvicinando al livello di guardia...
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 ha scritto nel messaggio
news:57d35b4c06e5d6b8691...@mygate.mailgate.org...

Ciao,
a me sembra un modo molto strano il tuo utilizzo dell'oggetto Command, c'č
da chiedersi come poteva funzionare.
Io farei cosě
-------------------------------------
Dim CMD as ADODB.Command
Set CMD=NEW ADODB.Command
CMD.CommandType = adCmdText
CMD.ActiveConnection = "Stringa di connessione"
CMD.CommandText = "<mia query tipo insert into... o update_set>"
CMD.CommandTimeout = 300
CMD.Execute
Set CMD=Nothing
--------------------------------------
Ciao Giorgio

 CMD.ActiveConnection = "Stringa di connessione"
domanda: consigli di utilizzare la stringa di connessione anche se si
dispone di una connessione già aperta e funzionante?
-- 
Salutoni
Sergio
per rispondere... togli il group dall'indirizzo


Ciao Sergio,
no assolutamente, visto che è già aperta è inutile riaprirla, fa solo
perdere tempo al server e al client.
Non avendo ben interpretato <mia AdoDbconnessione> ho messo "Stringa di
connessione"
Scusa per la svista.
Ciao Giorgio

 >
per intenderci con un esempio
-------------------------
Dim CMD As ADODB.Command
Set CMD = New ADODB.Command
Dim Cn As ADODB.Connection
Set Cn = New ADODB.Connection
Cn.Open "Provider=SQLOLEDB.1" & _
        ";Data Source=(local)" & _
        ";Initial Catalog=Prova" & _
        ";Integrated Security = SSPI"
CMD.CommandType = adCmdText
CMD.ActiveConnection = Cn
CMD.CommandText = "UPDATE Clienti Set Nome=Nome"
CMD.CommandTimeout = 300
CMD.Execute
Set CMD = Nothing
Cn.Close
Set Cn = Nothing
------------------------------
Ciao Giorgio

set CMD.ActiveConnection = Cn
------------
Ciao,
anche se non metti il Set viene assegnato l'oggetto Cn e non la stringa di
connessione
(come in questo caso)
---------------
CMD.ActiveConnection = Cn.ConnectionString
---------------
se vuoi mettere il Set  non fa differenza. Se hai Sql Profiler (tool di  Sql
Server)  puoi verificare che in entrambi i casi viene intercettato un solo
*Audit Login*.
Ciao Giorgio

 *Audit Login*.
tendenzialmente mi fido della tua competenza, ma quanto dici in questo caso
fa a pugni con quanto ho sempre letto del funzionamento di visual basic.
se si omette la clausola "set" non viene effettuato l'assegnamento del
riferimento all'oggetto, ma si lavora sulla proprietà predefinita del
medesimo. dato che la proprietà predefinita dell'oggetto connection è la
connectionstring, la mia interpretazione del costrutto
cmd.attiveconnection = cn
è che viene passata la stringa di connessione, e non la connessione stessa.
non avendo sql profiler, non posso però dimostrare la mia affermazione :-)


 stessa.
Prendo posizione al fianco di Sergio.
L'assegnazione senza set non può ovviamente associare un riferimento, ma
solo un valore.
Tale necessità di un valore per la property Let richiede una forzatura della
proprietà predefinita dell'oggetto Connection, che è appunto la
ConnectionString.
La connectionstring viene quindi passata BYVAL alla proprietà
ActiveConnection del recordset, il quale provvede ad aprire una nuova
connection. In realtà ciò non è normalmente visibile lato Sql-Server, in
quanto Ado fornisce una funzionalità lato Client che si chiama Pooling, e
che consente al client di sfruttare una connection già esistente.
In pratica, da parte di VB viene richiesta una nuova connection, ma è Ado
che autonomamente decide di non aprire una nuova connection.
Fin qui, quindi, non cambierebbe in pratica niente usando o meno il Set.
In realtà, con installazioni di Sql-Server che contano le connessioni per
questioni di licenza, il contatore aumenta, in quanto l'AdoPooling è
costretto dal provider a segnalare quante connection sta emulando (visto
personalmente anche di recente)
Analogamente, l'Ado pooling potrebbe non attivarsi con provider che non
permettono il PersistSecurityInfo, richiedendo ad ogni nuova connessione di
ri-specificare la password.
Per tagliare la testa al toro, mettersi in una condizione di sfruttamento
minimo delle risorse lato-client e per essere a prova di bomba, conviene
sfruttare l'assegnazione col Set.
Ciao
Alberto

dispone di una connessione già aperta e funzionante?
Altro dubbio.
Perche non usare direttamente la connessione, anzichè un nuovo
comando?
[
connessione.Execute clausolaSQL
]
Ciao!

personalmente anche di recente)
La licenza di Sql Server è per client non per connessione, ogni client (vedi
HOST_NAME() e stored procedure Sp_Who la manuale di Sql Server) può aprire
da 1 a n connessioni ma rimane sempre 1 client che ad esempio si collega a
più databases (uno per ogni connessione) dello stesso server. Sarebbe come
se un client di Win2000 Server venisse limitato ad aprire un solo file alla
vota.
Ciao Giorgio

"ErPotenza" <no....@thank.you> ha scritto nel messaggio
news:h68df0l8u61r3n35f...@4ax.com...

Puoi usarla tranquillamente solo che non puoi impostare il timeout per quel
comando in particolare e se devi richiamare una Stored procedure non puoi
ricevere i parametri di ritorno della stessa. I parametri di ingresso li
puoi simulare nella clausolaSQL
--------------
clausolaSQL="EXEC miaStoredProc " & Parametro1 & "," & Parametro2
--------------
Ciao Giorgio

 Set CMD=Nothing
Esattamente quello che facevo (e che faccio tutt'ora)...solo che nel caso 
descritto nel mio primo post non funzionava...
-- 
Bye by SixaM 8-]
---------------------
Sito comune  : 
www.it-lang-vb.net
Aiuto on line: premi F1
- Ricordati che lo strumento piu' importante ce l'hai tra le orecchie.
- mmm...la forfora?

 La licenza di Sql Server è per client non per connessione
Ne esistono tante.
Ad esempio, MSDE conta le connessioni.
SP_Who incrementa le connessioni per ogni oggetto Ado aperto, ma se hai
usato il Set quelle aperte da uno stesso client contano come una sola.
Per sedare ogni dubbio, credo sia utile questo aneddoto:
Applicativo da installare su un centinaio di client. Collegati
contemporaneamente, al massimo una trentina. Il cliente compra 30 licenze
client per Sql-Server.
Noi abbiamo una licenza "Per Server", e tutto viene testato in sede da noi
senza problemi.
Ogni client deve aprire, in alcune operazioni, una dozzina di recordset
contemporaneamente.
Installiamo dal cliente, client1 si connette, client2 si connette, Tin!
errore: "Licenze Esaurite". Avevamo raggiunto le 30 licenze al terzo client
contemporaneo.
Guardo il codice, scritto da un collega. Non ci sono i Set davanti
all'impostazione delle ActiveConnection. Metto tutti i Set, e ritentiamo.
Devo dire come è andata a finire?
Quindi, non ti so dire esattamente come e perchè Sql si comporti in maniera
diversa, ma ti so dire *che* Sql si comporta in maniera diversa.
Da cui, usare o meno il Set non è indifferente.
Ciao
Alberto

 Per sedare ogni dubbio, credo sia utile questo aneddoto:
Per sedare ogni dubbio (Visto che hai i tools di Sql Server) basta che
controllo quanti audit login vengono fatti (con Query Profiler) e quante
connessioni vengono aperte (con Sp_Who).
Non sono cose che mi invento, provare per credere.
Ciao Giorgio

 Non sono cose che mi invento, provare per credere.
Se ti rileggi il caso che ti ho esposto, vedrai senza ombra di dubbio che
c'è un conteggio che avanza in modo diverso usando o meno il Set.
Puoi fare tutti gli Audit che vuoi, ma senza 'Set' le licenze si esaurivano.
Tutto qua.
Ciao
Alberto