Newsgroup: it.comp.lang.perl
Titolo: Perl e MS Access

Secondo post in due giorni... mi sa che devo sforzarmi di piu' a trovare
soluzioni... ;)
Credevo che trovare il modo di accedere a un DB (se così si puo' definire)
Access fosse più facile, invece non riesco a identificare un modulo che fa
al caso mio.
Qualcuno di voi utilizza Perl per accedere a un DB Access e è così gentile
da darmi una dritta?
Grazie!

 da darmi una dritta?
Una possibilita' e' ODBC.
'bye

 ha scritto nel
messaggio news:mrmqnqm0duvn.ckp4j3t7g7m7$.dlg@40tude.net...


girare il programma, giusto?
Non è chiaro il contesto: vuoi accedere a un database Access sulla
stessa macchina su cui gira il programma perl o su un'altra?
direttamente, o in modalità client-server? la macchina su cui è il
database ha anche installato Access o comunque le librerie mdac?
Io uso l'interfaccia ADO, e nessun modulo se non Win32::OLE, per
accedere direttamente a database Acces sulla stessa macchina su cui
gira il programma perl.
Ciao.

 database ha anche installato Access o comunque le librerie mdac?
Hai ragione.
Io dovrei accedere da diverse macchine a un server dove c'è il Database
Access, e eseguire query su questo.
Cose che faccio già tranquillamente con Mysql utilizzando DBI.
E' possibile, ad esempio, usare DBI anche per Access? Non sono riuscito a
trovare moduli che mi permettessero di farlo.
Ammesso che io abbia cercato bene.


Si puo' usare DBI con Access usando DBD::ODBC, ma solo dalla macchina locale.
Access non e' un server di database. Pertanto puoi accedere
ai dati solo se hai accesso alla macchina.
Per trasformarlo in server, puoi usare DBI::Proxy.
Io non l'ho mai fatto, ma qui c'e' il resoconto di qualcuno
che l'ha fatto.
http://www.awilcox.com/geek_stuff/perl/proxy.html
Un'altra possibilita' e' quella di trasformare i dati in MSDE
http://www.microsoft.com/sql/editions/express/default.mspx
E' gratuito. Ma c'e' un limite di 2 GB di dati (4 nell'ultima versione)
e 5 utenti concorrenti.
ciao
gmax
-- 
  _  _ _  _
(_|| | |(_|><
  _|
http://gmax.oltrelinux.com

 E' possibile, ad esempio, usare DBI anche per Access?
Puoi farlo tranquillamente, utilizzando come driver DBD::ODBC oppure 
DBD::ADO (quest'ultimo soltanto se i tuoi client sono Windows).
Con questi driver puoi accedere dal tuo programma Perl al DB Access via 
DBI, esattamente come fai con MySQL (salvo l'uso di eventuali estensioni 
SQL proprietarie ovviamente).
Come ti è già stato correttamente detto, MS Access non è in realtà un 
DB-server. Ciò nonostante riesce a simulare in maniera abbastanza 
soddisfacente un vero DB-server (almeno per piccoli gruppi di lavoro che 
non abbiano esigenze di sicurezza troppo stringenti), regolando 
l'accesso condiviso al file nel quale conserva i dati (quello con 
estensione "mdb") mediante un altro file creato e gestito in maniera 
del tutto trasparente per l'applicazione Perl (che ha lo stesso nome del 
file mdb ma con estensione "ldb") che in pratica funge da dispositivo di 
locking su ogni singolo record del DB.
Alla tua applicazione client scritta in Perl gliene frega qualcosa? In 
pratica no: essa si può comportare come se stesse dialogando (via DBI) 
con un vero DB-server, che riesce a fornire livelli di isolamento 
transazionale decenti.
In pratica rimane soltanto il problema dell'accesso al DB Access nel 
caso questo risieda su una macchina remota, visto che non si tratta di 
un vero DB-server pronto a ricevere le connessioni dall'esterno su una 
porta TCP, come fa MySQL.
Per risolvere questo problema, puoi adottare la soluzione già suggerita 
da gmax, che fa ricorso a DBI::Proxy.
Altrimenti, senza adoperare DBI::Proxy, puoi semplicemente mappare su 
ogni client la directory remota sulla quale risiede il DB Access, cioè 
il file mdb (in Windows si fa da Esplora risorse mediante il menu 
"Strumenti/Connetti unità di rete...", in Linux/Unix si fa con Samba).
In questo modo ogni singolo client vedrà il file mdb esattamente come se 
fosse in locale, e il file ldb (onorato da DBD::ODBC e da DBD::ADO) si 
occuperà di gestire l'accesso condiviso da parte di tutti i client al 
DB, a livello di singolo record.
Fino ad un massimo di una cinquantina di client, se la rete è veloce 
(100 Mb/s), se il DB non è troppo grosso e se le query non sono troppo 
complicate* la soluzione funziona piuttosto bene (ne ho esperienza diretta).
Se hai particolari esigenze di sicurezza puoi limitare l'accesso alla 
directory condivisa ai soli client autorizzati e puoi considerare di 
criptare il DB Access: consulta l'help di Access per vedere come si fa 
(la soluzione DBI::Proxy suggerita da gmax è comunque preferibile a 
livello di sicurezza).
(*) Spiegare in dettaglio cos'è che mette in crisi a livello 
prestazionale un DB Access condiviso è troppo lungo ed esulerebbe dal 
topic di questo NG.
Puoi provare a dare un'occhiata a it.comp.appl.access e alla 
documentazione di Access.
Ciao,
Emanuele.

> > [...]
Grazie a entrambi.
In realtà la cosa a cui non avevo pensato era proprio il fatto che non
essendo Access un DBserver, non posso collegarmi da una macchina esterna.
Le info sulla crisi prestazionale di Access mi serviranno per altri scopi,
mentre da Perl proverò a usare DBI::Proxy.

 essendo Access un DBserver, non posso collegarmi da una macchina esterna.
Attenzione: è vero che MS Access non è un DB server, ma non è vero che 
non puoi collegarti ad un DB Access da una macchina diversa da quella 
sul quale risiede (altrimenti il mio messaggio non sarebbe servito a 
niente! ;-)
Come ho già detto, puoi tranquillamente collegarti al DB Access 
dall'esterno, purché tu "veda" il file mdb (e puoi pure collegarvi 
diversi client *simultaneamente*, esattamente come avviene con un vero 
DB-server!)
E per "vedere" il file mdb è sufficiente che esso risieda su un'unità di 
rete condivisa, mappata localmente ad ogni client (in pratica il server 
è in realtà soltanto un file server).
Non so se mi sono capito...
Ciao,
Emanuele.


Si, si, ti sei spiegato perfettamente. Intendevo dire non posso accedere al
DB come "utente di un servizio" in ascolto su una qualche porta, così come
faccio con Mysql.
La storia delle cartelle condivise fila, ma preferisco non mappare drive di
rete. Credo che tenterò la soluzione DBI::Proxy.
Grazie!