Newsgroup: it.comp.lang.visual-basic
Titolo: Aggiornamento Struttura Database ADOX e SQL

Ciao a tutti
qualche giorno fa ho chiesto al NG
un consiglio su come aggiornare la struttura
di un mdb da codice con ADO.
Mi è stato suggerito di utilizzare ADOX.
Ora riesco a verificare se un campo è presente
in una determinata tabella.
Poi leggendo altri messaggi nel NG ho letto
che ADOX non permette la modifica del tipo
di dati di un campo e che tale modifica è
possibile invece con SQL.
A questo punto se ho capito bene io la routine
di aggiornamento automatico struttura DB la vedrei
così:
Con ADOX verifico l'esistenza di tabelle, campi etc...
poi le modifiche le faccio con SQL.
Secondo voi è un approccio corretto?
Preferirei fare tutto con ADOX o con SQL ma nel primo caso
(sempre se ho capito) non posso modificare il tipo dati e nel
secondo (SQL) non so come verificare l'esistenza di tabelle e campi.
Qualche suggerimento?
Grazie a tutti.
Ciao
Roberto

Ho provato a scrivere un pò di righe che
copio qui sotto...
Ho provato ad aggiornare sia con SQL che
con ADOX e al momento quello che mi sembra
di avere capito è:
1 - Con ADOX forse si riesce ad impostare
le proprietà dei campi in modo più accurato
(ad esempio il default value etc...) però
provando a modificare come qui sotto il tipo di
un campo mi restituisce il messaggio
'Operazione non consentita nel contesto corrente".
2 - Con SQL invece sembra filare tutto liscio.
Però forse si ha meno possibilità di controllo.
Scusate l'eventuale involontaria confusione
Spero cmq di essere stato chiaro.
Ultima cosa: come si chiude il catalogo
visto che cat.close non esiste?
Set Cat = Nothing ??
Ciao
Grazie
      ' Variabili
     Dim cn As ADODB.Connection
     Dim cat As Catalog
     ' Impostazione della connessione
     Set cn = New ADODB.Connection
     cn.Open GL_StringaConnessione
     ' Impostazione del catalogo
     Set cat = New Catalog
     Set cat.ActiveConnection = cn
     ' CON SQL ----------------------------------------
     ' Cicla le colonne (campi) della tabella e verifica
     ' se il campo esiste o no.
     For c = 0 To cat.Tables("tblArticoli").Columns.Count - 1
         If LCase(cat.Tables("tblArticoli").Columns(c).Name) = 
"prova1" then		
             salta = True
             Exit For
         End If
     Next
     ' Se il campo non esiste lo si aggiunge con SQL.
     If Not salta Then
         strsql = "ALTER TABLE tblArticoli ADD"
         strsql = strsql & " prova1 INT"
         cn.Execute strsql
     Else
         ' Inizializza la variabile per eventuali
         ' istruzioni successive
         salta = False
     End If
     ' Con SQL è possibile anche modificare il tipo dati
     ' di un campo
     strsql = "ALTER TABLE tblArticoli ALTER COLUMN"
     strsql = strsql & " prova1 varchar(100) "
     cn.Execute strsql
     '------------------------------------------------
     ' CON ADOX --------------------------------------
     ' Cicla le colonne (campi) della tabella e verifica
     ' se il campo esiste o no.
     For c = 0 To cat.Tables("tblArticoli").Columns.Count - 1
         If LCase(cat.Tables("tblArticoli").Columns(c).Name) = "prova2" Then
             salta = True
             Exit For
         End If
     Next
     ' Se il campo non esiste lo si aggiunge con ADOX.
     ' Attenzione: non tutti i tipi di campo proposti dalla tendina
     ' sono accettati (testo sembra essere adWChar).
     If Not salta Then
         cat.Tables("tblArticoli").Columns.Append "prova2", adWChar, 100
     Else
         ' Inizializza la variabile per eventuali
         ' istruzioni successive
         salta = False
     End If
     ' Con ADOX sembra possibile modificare il tipo dati di un
     ' campo ma poi quando si esegue il codice ritorna il messaggio
     ' "Operazione non consentita nel contesto corrente"
     cat.Tables("tblArticoli").Columns("prova2").Type = adCurrency
     '------------------------------------------------
     ' Chiusura Catalogo e Connessione
     Set cat = Nothing
     cn.Close
     Set cn = Nothing

 Però forse si ha meno possibilità di controllo.
Diciamo che occorre conoscere bene il dbms.
Con Sql-Server, ad esempio, esiste una tabella SysColumns e una 
SysObjects, su cui è possibile fare interrogazioni con normalissime 
query, ed avere la struttura del database.
Immagino che anche in Access esistano tabelle analoghe.
Prova a visualizzare anche le tabelle nascoste, magari ti si apre un 
mondo...
Ciao
Alberto
-- 
Si è visto di meglio,
ma si è scopato di peggio,
qualche volta a pago
e non erano neanche sempre donne
[Paolo]

Grazie per la risposta.
Sono ancora cmq in difficoltà..
Poichè non sono molto esperto sto cercando
anche sul web una qualche dritta...
Ho trovato un sito 
http://sqlzoo.net/
dove ci sono n esempi su come usare SQL
e al punto 6 (come vedi qui sotto) insegnano
a cercare tabelle e colonne.
Quando però specifico che sto utilizzando
come db access mi restituisce una istruzione per
vedere le tabelle ma nello stesso tempo mi dice
che per non esistono interrogazioni per trovare i campi.
Questo è quello che ho capito io (forse male).
Non voglio farvi perdere troppo tempo.
Come vedete cerco di arrangiarmi.
Mi servirebbe solamente un esempio su come
è possibile verificare se un campo è presente
in una tabella di access tramite SQL.
Ciao
Grazie
Reference Section: how to...
1) Create and Drop:
How to create tables, indexes, views and other things. How to get rid of
them.
2) Insert and Delete
How to put records into a table, change them and how to take them out
again.
3) Dates and times
How to work with dates; adding, subtracting and formatting.
4) Functions
How to use string functions, logical functions and mathematical functions.
5) Users
How to create users, give them access, get at other peoples tables. How
to find processes and kill them.
6) Meta Data
How to find out what tables and columns exist. How to count and limit
the rows return.


 in una tabella di access tramite SQL.
Per trovare le tabelle, come ti dicevo, puoi eseguire una banale query 
sulla tabella nascosta MSysObjects (che a questo punto avrai già 
trovato, visto quanto ti dicevo nel mio post precedente).
Per avere alcune informazioni sui campi di una tabella, una volta che 
hai il nome di quest'ultima, puoi eseguire una Select top 1 *, in modo 
da avere un recordset Ado con una sola riga, ma con tutte le colonne.
Poi con un normale For Each Fld in RS.Fields te li scorri e ti 
scandagli tipo, dimensione, ecc...
E quindi puoi decidere come e cosa fare come modifica.


 Roberto ha detto questo martedì :
