Newsgroup: it.comp.lang.visual-basic
Titolo: Connessione ADO

Se dovete costruire un'applicazione con più form che necessitano di una
stessa connessione ad un database, come gestite la cosa?
Io ho aperto la connessione nel form principale, dichiarando public
l'oggetto conn, poi in tutti gli altri form mi basta creare un oggetto a cui
assegno
Set cn = mainform.conn
Va bene così? Il fatto è che ho qualche problema nell'estrazione dei dati,
ovvero a volte con una semplice query di selezione non mi vengono restituiti
tutti i dati che richiedo, cioè alcuni campi mi vengono restituiti vuoti
quando in realtà non lo sono. Non so proprio da cosa possa dipendere questo
problema, spero proprio che, nonostante la complessità della mia domanda,
qualcuno possa aiutarmi..
Un'altra cosa: non riesco a dichiarare all'inizio del listato i miei oggetti
ADO (con New), ma devo dichiararli prima come oggetti normali, poi creo
un'istanza della classe con la procedura CreateObject. Cioè faccio
Dim conn As Object
Set conn = CreateObject("ADODB.Connection")
ma mi viene generato un errore quando provo a fare
Dim conn As ADODB.Connection
Set conn = New ADODB.Connection
Devo prima dichiarare qualcosa?
Grazie a tutti quelli che potranno aiutarmi.

 Devo prima dichiarare qualcosa?
devi dichiarare nei riferimenti "Microsoft Activex Data Object" (o qualcosa
del genere, non stiamo a sottilizzare ;-) ) nella versione che vuoi/puoi
Salutoni
Sergio


io userei una variabile di tipo adodb.connection dichiarata
come public in un modulo bas standard, così eviti
di dover fare tutte le volte set cn = mainform.conn,
ma usi direttamente la varibaile dichiarata nel modulo bas
che ha visibilità globale rispetto all'applicazione
il problema dei dati mancanti non credo possa essere imputato
alla connection, escludendo errori nella query di selezione,
prova ad aumentare il valore
del command timeout, ma non sò se può essere utile nel tuo progetto
-- 
bye BlackMagic
ICQ# 85485468

 ha scritto:

Sěěěěěě, grazie ^__^
Ora ci riesco pure io ;)
Ciao

 del command timeout, ma non sò se può essere utile nel tuo progetto
Errori nella query non ce ne sono, ho scritto milanta query in precedenza e
questa è una banale query con un inner join.
La cosa strana è che ho il problema solo facendo join con una tabella;
inoltre "cambiando di posto" le richieste dei dati allora posso avere
risultati diversi.
Ti faccio un esempio:
io ho in una tabella di un db SQL Server i campi (CodMat, Descrizione,
Quantita, Misura, Soglia) il tipo di dati non è importante (cmq Quantita e
Soglia sono Integer, Descrizione è Text e gli altri sono Varchar). Questa
tabella viene messa in join con un'altra sulla base dell'uguale valore di
CodMat (che è PK). Quando vado ad estrarre i dati e metterli in una ListView
o anche in semplici TextBox ho delle anomalie: la descrizione appare solo se
viene stampata per prima o per seconda, se voglio mettere Quantita e Misura
a fianco separati da uno spazio mi viene stampato solo Quantita (sebbene
misura abbia un valore ben preciso)...
Sono queste stranezze che mi lasciano perplesso, poiché non so proprio dove
agire per correggere questi errori che, a parer mio, non hanno senso di
esistere.. :(
Puoi aiutarmi? Grazie.

Il problema è proprio quello dell'ordine con il quale richiedo il dati al
RecordSet. Ho fatto alcune prove, i risultati mi sconcertano..
La query è questa:
SELECT M.*, MP.Materiale, MP.Categoria, MP.Stato, MP.kg_m
FROM M INNER JOIN MP ON M.CodMat=MP.CodMat
ORDER BY M.CodMat
M contiene nell'ordine i campi (CodMat, Descrizione, Quantita, Misura,
Soglia).
Apro un recordset rs con questa query. Se richiedo i campi nell'ordine in
cui sono nelle due tabelle va tutto bene; se però ad esempio richiedo
"Soglia" prima di "Quantita", non mi viene mostrato nè rs("Quantita") nè
rs("Misura"), ma tutti i campi dell'altra tabella.
Se invece richiedo "Soglia" DOPO aver richiesto un campo dell'altra tabella
allora soglia non mi viene mostrata.
Penso che "rimedierò" richiedendo i campi in ordine, ma non lo trovo affatto
un comportamento normale.
Questa è la mia prima applicazione in Visual Basic, ma ciò non vuol dire che
non sappia usare gli oggetti ADO e il VBScript; infatti da parecchio tempo
scrivo pagine ASP e mai ho incontrato simili problemi, se apro un recordset
posso chiedere in qualsiasi ordine i campi...
C'è una spiegazione logica a questa "anomalia"?
Grazie.

 ha scritto nel messaggio
news:hf4Da.57289$g92.1...@news2.tin.it...

ad essere sincero non ho capito bene cosa e perchè succede,
anche perchè non mi è mai successo che cambiando l'ordine di lettura dei
campi
di un recordset mia cambia il risultato, specialmente se prima ho verificato
il risultato delle query tramite il db...

Raynor@localhost wrote:
CUT
ipotesi
a) son campi calcolati ne leggi uno si scatena qualcosa che modifica li
altri
b) C'è qualche loop di relazioni...integrità referenziali o menate del
genere che manda letteralmente in tilt il motoreDB
c) C'è similitudine di nomi fra campi ...prova a scivere un po di più e
controllare se ci sono nomi uguali(rabbrividisco fra un anno  quando tu o un
altro perderete un pomeriggio a capire cosa è MP o M ...perchè nel frattempo
la documentazione si perde...il tracciato record evapora etc etc!)
--
Il Wodkino Nazionale è a : 
www.martek.it
Pagina Vb/Bestiario/Lamer Experience :
http://www.martek.it/go.asp?portamia=2
 Quotefix e altro:
http://www.martek.it/go.asp?portamia=4
Usr: ICLVB Pw: amici

 la documentazione si perde...il tracciato record evapora etc etc!)
Nessuna delle tre. Le tabelle sono semplicissime, non ho scritto per esteso
i nomi delle tabelle per non rendere ancora più complessa la query, comunque
quelli sono solo alias.
Ho scoperto comunque il problema. Io aprivo il recordset con
Set rs = cn.Execute(sql)
dove rs è il recordset, cn la connessione ADO e sql è lo statement di
selezione.
Invece di utilizzare questa sintassi ho usato il metodo Open specificando
CursorType=adOpenStatic (o adOpenDynamic) e tutto funziona.
In pratica quello che succedeva era che, se io scrivevo la query
SELECT campo1, campo2, campo3 FROM tabella
e richiedevo, in ordine, rs("campo1"), rs("campo3") e rs("campo2"), campo2
mi veniva mostrato vuoto, sebbene in realtà non lo fosse. Ora comunque con
il CursorType impostato funziona correttamente.
Spero almeno di essere d'aiuto a qualcun altro..
Ciao e grazie a tutti quelli che sono intervenuti.
P.S. comunque non rabbrividire, fra un anno nessuno perderà un pomeriggio
per questa storia; questo lavoro è solo per una tesina di basi di dati ^__^