http://digilander.libero.it/Cenati

Crea mdb con ADO e VbScript

home | e-mail e contatti | Introduzione al sito | Cosa e' e come imparare VbScript 

 

 

 

 

 

Creare un file mdb di Microsoft Access usando ADO

Con il programma ado-tables ho mostrato in una finestra di Internet Explorer la struttura di un file mdb. Con lo script ado-records ho scelto una tabella dal database e ne ho visualizzato i record.

Ma come posso fare per creare un archivio mdb se non ho Microsoft Access oppure se ho la necessità di crearne uno con tabelle e campi ottenuti dallo script? E per scriverci dei record? Tutto nello script che segue.

La cosa più semplice da fare per creare un database è appoggiarsi ad un programma apposito. C'é Access, ma anche OpenOffice contiene un modulo per la creazione di archivi. E' la cosa più semplice perchè in questo modo c'è una interfaccia visuale per visualizzare e modificare i campi di tutte le tabelle.

In un ristretto numero di casi può essere necessario creare le tabelle ed i campi basandosi interamente su informazioni ottenute dallo script, quindi non è possibile creare preventivamente la struttura delle tabelle e delle colonne usando Access.

Le prime due parti dello script che segue hanno principalmente uno scopo dimostrativo. Difficilmente dovrò creare da zero un database con la sua struttura di tabelle e di campi. E' sicuramente più frequente il caso in cui si deve scrivere in un archivio esistente.

Creare un database vuoto

La prima parte dello script usa l'oggetto adox.catalog per creare un file vuoto. Finchè non si specificano tabelle e colonne, il file viene creato vuoto e con il formato richiesto. Nell'esempio, che ho trovato in rete, sono riportati i valori necessari per creare un database in diverse versioni del motore JET. Ma si possono creare anche file in formato Paradox, Db III, Testo, ecc. Basta usare la costante giusta.

Creare delle tabelle

La seconda parte dello script si occupa di aprire un database esistente e di crearvi una nuova tabella con dei campi. Il codice riporta alcuni valori tratti dalla collezione DataTypeEnum del modello ad oggetti di ADO. Ce ne sono anche altri che non ho elencato. Quando si crea una colonna della tabella (cioè un campo, come nome, cognome ecc.) bisogna indicare di che genere è quel dato. Nell'esempio ho creato un oggetto "tabella" da una istanza di adox.table.

Una volta creata la tabella (ma solo in memoria), le aggiungo dei campi con tbl.columns.append. Devo specificare il nome del campo ed il tipo. Se voglio un campo di tipo "data" dovrò indicare il tipo 7. L'elenco completo dei tipi di campo si può appunto trovare cercando la collezione DataTypeEnum nel modello ad oggetti di ADO, ma certamente è più facile creare i campi con Access scegliendo il tipo di campo dall'elenco.

Se un campo può avere lunghezze diverse (nell'esempio ci sono dei campi di testo) devo indicarlo nel codice. Ad esempio NOME sarà di max 50 caratteri.

Una volta creata la struttura della tabella, devo scriverla nel database con tables.append. Solo ora viene trasferita dalla memoria al file.

Scrivere dei record in un database

Questa è la parte più utile. Prendiamo un database esitente, con una struttura nota, e scriviamoci qualcosa.

Prima di tutto è necessario aprire il database usando l'oggetto connection. Poi uso un oggetto Recordset per puntare ai record di una determinata tabella (identificata con Recordset.Source e poi aperta con Recordset.Open).

A questo punto basta creare un nuovo record (addnew) e riferirsi alle colonne con Recordset("nome colonna") oppure con Recordset(n). Il primo metodo consente di essere più certi su dove stiamo scrivendo. Per salvare i dati è necessario forzarne la scrittura con Recordset.Update.

Ovviamente questo sistema funziona su tutti le righe (record) della tabella. Se anzichè creare un nuovo record con addnew voglio modificare un record esistente, posso spostarmi su quella riga e scrivere. Modificherò quindi il record corrente.

Copia il programma riportato qui sotto in un file con estensione ".vbs" oppure scarica l'archivio zip contentente lo script.

      
' *****************************************************
' ADO - Crea mdb file.vbs
' (c) Cenati Giovanni - http://digilander.libero.it/Cenati
' Codice vbs liberamente utilizzabile citando il sito
' Questo programma è diviso in tre parti indipendenti.
' La prima parte crea un file mdb vuoto (database di Access)
' La seconda parte apre il file mdb e vi crea
' una tabella con tre colonne.
' La terza parte accede all'archivio e scrive un record.
' --
' This script is made of 3 independent parts.
' The first creates an empty mdb file (Access database).
' The second creates a table with 3 columns in it.
' The third writes a record.
' *****************************************************
Const Jet10 = 1
Const Jet11 = 2
Const Jet20 = 3
Const Jet3x = 4
Const Jet4x = 5

Sub CreateNewMDB(FileName, Format)
  Dim Catalog
  Set Catalog = CreateObject("ADOX.Catalog")
  Catalog.Create "Provider=Microsoft.Jet.OLEDB.4.0;" & _
     "Jet OLEDB:Engine Type=" & Format & _
    ";Data Source=" & FileName
End Sub

'Crea nuovo database
CreateNewMDB "test.mdb", Jet4x

'------------------------------------------------------------------

'Apre il database creato e aggiunge una tabella con alcune colonne.
set tbl = createobject ("ADOX.Table")
set cat = createobject ("ADOX.Catalog")
    
' Open the Catalog.
cat.ActiveConnection = "Provider='Microsoft.Jet.OLEDB.4.0';" & _
        "Data Source='test.mdb';"
    'Membri di ADODB.DataTypeEnum
    Const adInteger = 3
    Const adVarWChar = 202
    Const adBinary = 128
    Const adDate = 7
    Const adDecimal = 14
    Const adDouble = 5
    Const adLongVarWChar = 203
    tbl.Name = "Clienti"
    tbl.Columns.Append "Codice", adInteger
    tbl.Columns.Append "Nome", adVarWChar, 50
    tbl.Columns.Append "Cognome", adVarWChar, 50
    cat.Tables.Append tbl
set tbl = nothing
set cat = nothing

'------------------------------------------------------------------

Set rs = CreateObject("ADODB.Recordset")
Set oConnection = createobject("ADODB.Connection")
oConnection.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='test.mdb';"
rs.ActiveConnection = oConnection
rs.CursorType=1 : rs.LockType=3

' Imposto il nome della tabella in cui scrivere
rs.Source= "Clienti" 
rs.Open
'Aggiungo un record nuovo e ci scrivo
rs.AddNew
rs("Codice") = 7
rs("Nome") = "Giovanni"
rs("Cognome") = "Cenati"
'Chiedo ad ADO di scrivere il record creato.
rs.Update
'********* ADO - Crea mdb file.vbs ***************

Ma non è finita

Quello che ho scritto è solo una parte di quello che si può fare con ADO. Il resto non l'ho approfondito, anche se alcuni dei libri che ho letto vanno molto più in profondità. In particolare vi rimando ad un buon volume come "Costruire Applicazioni con Access" (elencato nella bibliografia) oppure ad un libro su Visual Basic che tratti anche la gestione di database. Voglio però fornire degli spunti su che altro che si può fare con i database.

Si usa dire che ci sono almeno tre modi diversi di fare la stessa cosa con i database. Uno usa i metodi di ADO, come mostrato in questi esempi.

Un'altro metodo usa la sintassi SQL e manda i comandi al motore del database. Per creare una tabella si potrebbe quindi creare una stringa contenente il comando strSQL = "CREATE TABLE Clienti (Nome TEXT (50), Cognome TEXT (5);"

Oppure si possono usare gli oggetti DAO (Data Access Object) che sono lievemente diversi da ADO (ActiveX Data Object) ma permettono di fare quasi le stesse cose.

Un terzo modo è usare l'automazione di Access.Application. Ovviamente bisogna avere installato Microsoft Access sulle macchine sulle quali intendo usare lo script.

Altre cose che si possono fare con ADO sono la lettura di altri formati di file. Si può leggere un foglio excel senza avere excel. Si può gestire un flusso di dati (stream) non organizzati come archivio (in BatchBrowser ce n'è un esempio: intercetto un file scaricato da internet per salvarlo su un file).

Non so nulla di come ci si può connettere a database residenti su server remoti, per i quali è necessario costruire stringhe di connessione complesse.

Non ho parlato affatto di come creare relazioni tra i dati.

E neppure degli indici, utili per cercare più velocemente un determinato record. Non ho avuto finora necessità di performance elevate nella ricerca dei dati (anzi, non ho avuto proprio necessità di cercare dati, fino ad ora mi sono limitato a scrivere degli script per popolare un database esistente) quindi non ne ho approfondito i metodi.

Tutto questo per dire che l'argomento non si può esaurire in una paginetta come questa, ma se è necessario fare un lavoro serio sulla gestione dei database bisogna approfondire le conoscenze e magari passare ad un linguaggio che offra maggiore flessibilità e maggiori strumenti per visualizzare i risultati. Visual Basic offre oggetti che fanno quasi tutta la connessione ad un archivio in modo trasparente per l'utente e per il programmatore.

Giovanni Cenati

 

 


© Cenati Giovanni 2004/2010 - http://digilander.libero.it/Cenati - Reventlov at Katamail com

home | e-mail e contatti | Introduzione al sito | Cosa e' e come imparare VbScript