Newsgroup: it.comp.lang.visual-basic
Titolo: ADO ed enumerazione Tabelle/Campi

Salve sto provando ad enumerare le tabelle presenti in un DB Access con 
OpenSchema(adSchemaTables) ed effettivamente ottendo l'elenco di tutte 
le tabelle presenti nel DB.
Ora perň vorrei poter avere info riguardo ogni singola tabella, e cioč 
l'elenco di tutti i campi di quella tabella.
So farlo una volta aperto il recordset. Cioč se faccio
Dim RS as new ADODB.Recordset
RS.Open "Select * from...", ecc. ecc.
poi so che posso fare un bel ciclo su RS.Fields per sapere tutto 
riguardo quella tabella.
Perň qualcosa mi dice che non sia necessario aprire ogni recordset per 
avere le info, ma che con la ADODB.Connection sia possibile fare tutto ciň.
Qualcuno sa dirmi qualcosa a riguardo?
Thx in anticipo!
-- 
Dato che non sappiamo quando moriremo, siamo soliti pensare che la vita 
sia una fonte inesauribile. Eppure ogni cosa accade soltanto un certo 
numero di volte, quasi raramente ad essere sinceri.
Quante volte ti ricorderai di un certo pomeriggio della tua infanzia, un 
pomeriggio che č una parte cosě profonda di te senza il quale non 
potresti dare un senso alla tua vita? Forse quattro o cinque volte. 
Forse anche di meno...
E quante volte nella tua vita guarderai la luna piena? Forse venti...
Eppure tutto sembra non debba mai finire...

 -- 
Se ne è parlato molto nei vecchi post e ci sono due correnti di pensiero:
usare DAO oppure ADO. Cerca sui vecchi post oppure scarica il programma
(favoloso!) di Lupo ESP0DAMA.
Ciao, Vincenzo

 l'elenco di tutti i campi di quella tabella.
Questo č estrapolato da una mia classe Tables per ADO.
clsTableDef altro non č che una classe che memorizza 4 info sulla tabella.
Di questa classe ti do solo il metodo OpenStructure che risponde anche 
alla tua seconda domanda
Private m_Connection As ADODB.Connection
Private colTables As Collection
Public Property Set Connection(ByVal Obj As Connection)
     Dim objStruct As ADODB.Recordset
     Dim objTableDef As clsTableDef
     Set m_Connection = Obj
     Set objStruct = m_Connection.OpenSchema(adSchemaTables)
     Set colTables = New Collection
     Do While Not objStruct.EOF
         If (objStruct.Fields("TABLE_TYPE") = "TABLE") Then
             Set objTableDef = New clsTableDef
             objTableDef.OpenStructure m_Connection, 
objStruct.Fields("TABLE_NAME")
             colTables.Add objTableDef, objStruct.Fields("TABLE_NAME")
         End If
         objStruct.MoveNext
     Loop
     objStruct.Close
     Set objStruct = Nothing
End Property
Public Sub OpenStructure(ByVal objConnection As Connection, ByVal 
TableName As String)
     Set m_Connection = objConnection
     Set objStruct = New ADODB.Recordset
     objStruct.Open "SELECT * FROM [" & TableName & "] WHERE FALSE", 
objConnection
     m_Name = TableName
End Sub
Ciao

 l'elenco di tutti i campi di quella tabella.
Con ADO devi affidarti a ADOX
Puoi vederne un esempio in ESP0DAMA (sul SC e troppo pompato da VincePik,
che comunque ringrazio) alla Sub ESB0DAMA_D_INFO_TABELLA.

 Questo è estrapolato da una mia classe Tables per ADO.
Ehm, ... chiedeva di non aprire il recordset... ;-)

[VincePik@work = 
circa_v...@tiscali.it
 in
c3n6jj$2au1cu$
1...@ID-207068.news.uni-berlin.de
]
ha esagerato ;-)
... comunque, grazie.

 Ehm, ... chiedeva di non aprire il recordset... ;-)
Un momento :)
Ho visto un "SELECT * FROM ... WHERE FALSE" che mi fa luccicare gli occhi :)
Non volevo aprire il recordset perchč penso che non sia ottimale come 
suluzione, perchč se dovessi adottare questa tecnica su DB con tabelle 
enormi soltanto l'elenco delle tabelle sarebbe lento perchč dovrei 
aprire i recordset.
Perň quel "WHERE FALSE" cosa fa? Mi apre la tabella senza farne una 
scansione? Cioč se per assurdo (non tanto poi) avessi una tabella con 
tanti di quei record che un "Select * from TABELLA" ci metterebbe 1 
minuto per aprirla, quel "WHERE FALSE" me la caricherebbe in 1 secondo?
Fatemi sapere e vi ringrazio tantissimo!


 scansione?
Già, perchè nessun record soddisfa, ma il recordset (quindi la struttura)
c'è...
Un'altra via è ridurre il numero dei records restituiti:
Select TOP 1 * From ... Where ...

 ... comunque, grazie.
Prego.
Vincenzo

 formale.
Ho solo cambiato il solito "ha scritto" accodato all'header da QuoteFix...
;-)

 
Lo so, e lo avrei fatto anch'io se si potesse in ADO... ma si può? ;)
Il WHERE = FALSE serve proprio per non avere nessun record di ritorno.
Purtroppo non credo che funzioni (però non ho provato) su tabelle Access 
poichè la WHERE viene fatta *dopo* aver caricato i dati sul client.
Ciao

 Lo so, e lo avrei fatto anch'io se si potesse in ADO... ma si puň? ;)
PS. volevo evitare l'uso di ADOX, dato che se non sbaglio č stato 
rimosso dalle ultime versioni.
Ciao

[Zanna = 
circa_z...@virgilio.it
 in
c3n82r$29b5d3$
4...@ID-184808.news.uni-berlin.de
] ha scritto:

Ma davvero? Seriamente? E perchč mai?
E come farebbero a funzionare tutti i programmi che ci fanno conto?
No, dai...!

 l'elenco di tutti i campi di quella tabella.
Puoi utilizzare la stessa istruzione OpenSchema nel seguente modo :
set rstInformazioneCampi = connessione.OpenSchema(adSchemaColumns,
Array(null,null, "Nome della tua tabella",null))
Guarda comunque nell'help per i vari parametri che puoi passare alla
OpenSchema.
Walter

 OpenSchema.
Quale help? MSDN?
-- 
Dato che non sappiamo quando moriremo, siamo soliti pensare che la vita 
sia una fonte inesauribile. Eppure ogni cosa accade soltanto un certo 
numero di volte, quasi raramente ad essere sinceri.
Quante volte ti ricorderai di un certo pomeriggio della tua infanzia, un 
pomeriggio che è una parte così profonda di te senza il quale non 


 Quale help? MSDN?
Ovvio ;)
Ciao

Ok sono riuscito ad enumerare Tabelle e campi siete mitici :)
Non riuscivo a usare adSchemaColumns perchč come terzo argomento passavo 
RSTABLE("table_name") che mi generava quell'errore. RSTABLE č il 
recordset che utilizzo per enumerare le tabelle e per eliminare l'errore 
ho assegnato il nome della tabella ad una variabile stringa. Cosě ha 
funzionato (mistero!!!).
Ho visto anche ESP0DAMA ed č mitico :)
E bravo il lupacchiotto AUHAUHAUHA
-- 
Dato che non sappiamo quando moriremo, siamo soliti pensare che la vita 
sia una fonte inesauribile. Eppure ogni cosa accade soltanto un certo 
numero di volte, quasi raramente ad essere sinceri.
Quante volte ti ricorderai di un certo pomeriggio della tua infanzia, un 
pomeriggio che č una parte cosě profonda di te senza il quale non 


 E bravo il lupacchiotto AUHAUHAUHA
Bene, la prossima versione sarà a pagamento. :-P :-P
PS: Grazie. ;-)

 funzionato (mistero!!!).
Non è un mistero.
E' la solita conversione di VB.
Scommetto che il terzo parametro è un Variant, quindi lui giustamente 
passa il campo (ADO.Field) e non il valore (String).
Per fare la cosa in modo corretto dovresti passare 
RSTABLE("table_name").Value, cosa che in realtà andrebbe sempre fatta.
Ciao