Newsgroup: it.comp.lang.perl
Titolo: Moduli DBI, DBD::ODBC e Access

Buongiorno a tutti,
nella speranza che qualcuno mi sappia dare un suggerimento, espongo il mio
problema:
devo acquisire dati da un database Access. Sto utilizzando i moduli DBI e
DBD::ODBC. Per quanto riguarda Microsoft, sto utilizzando MDAC Microsoft:
ADO 2.8 e Microsoft Jet 4.0 Service Pack 8. Questo database contiene dati di
tutte le giocate del lotto dal 1939 ad oggi (credo). La tabella che mi
interessa si chiama STORICO e contiene le seguenti colonne:
data estrazione
Ruota
1°estratto
2°estratto
3°estratto
4°estratto
5°estratto
Se mi dovessi limitare a selezionare solo la colonna Ruota, non avrei alcun
problema:
$Main::dbh->prepare("SELECT Ruota FROM STORICO");
Se invece, comincio ad utilizzare o nella parte SELECT o nella parte WHERE
una delle restanti stringhe, mi viene costantemente restituito un errore:
Missing Operator (anche eseguendo un tracing). Sono certo che i problemi
siano il carattere speciale " ° " e lo spazio di "data estrazione", tanto e'
vero che nella guida in linea di Access ho letto questa felice precisazione:
per i nomi degli oggetti possono essere usati tutti i caratteri
alfanumerici, i caratteri speciali e gli spazi bianchi. Si raccomanda
tuttavia di non utilizzare gli spazi bianchi ;-))
Ho provato anche a prelevare le stringhe direttamente dal database, per
essere certo (almeno io) della loro identita':
my $column = $Main::dbh->column_info();
        while (my @columns = $column->fetchrow_array())      {
                for (my $d = 0; $d <= $#columns; $d++)      {
                        if ($columns[$d] && $columns[$d] =~ /estrazione/)
{
                                $data = $columns[$d
                                }
                        }
                }
        exit if (!$data);
        $statement = sprintf "SELECT %s FROM STORICO", $data;
        my $sth = $Main::dbh->prepare($statement);
ma il risultato e' sempre lo stesso: missing operator. Ho provato ad
eseguire un quote() sulle stringhe: in questo modo, il prepare() viene
eseguito, l'execute() apparentemente anche, ma mi viene restituito sempre lo
stesso valore di campo, cioe' la stringa quotata: 'data estrazione' (ma
prepare() non dovrebbe restituirmi un errore?!).
Credo che le soluzioni possano essere:
1) trovare la sintassi esatta da utilizzare per inviare quelle stringhe
2) inserire, nello statement SELECT il numero di colonna e non il nome.
Esiste la possibilita' di chiamare il numero della colonna? Si puo'
utilizzare in qualche modo, all'interno di SELECT,  il valore
ORDINAL_POSITION contenuto nell'array restituito da column_info() ?
Un grazie a tutti ;-)
Ciao.
Andrea


Io ho avuto un sacco di problemi con Access, quando ho fatto migrazione 
di dati, e ti dico che i problemi di questo tipo sarebbe meglio 
aggirarli che prenderli di petto. Pertanto:
1) Hai provato "SELECT * FROM STORICO" ? Forse questo aggira il problema.
2) Hai provato a modificare i nomi dei campi in Access (fai un backup 
prima!)? Oppure a copiare la tabella in un'altra tabella con nomi 
accessibili?
3) Hai provato a mettere il nome delle colonne fra parentesi quadre? 
Questo e' il modo natico di Access di delimitare i nomi di colonne.
Facci sapere.
Ciao
gmax
-- 
   ____ ____  _____ _   _
  / _  |    \(____ ( \ / )
( (_| | | | / ___ |) X (
  \___ |_|_|_\_____(_/ \_)
(_____|
MySQL Certified Professional
Sapere, saper fare, fare, far sapere
http://gmax.oltrelinux.com

Questo e' il modo natico di Access di delimitare i nomi di colonne.
Confermo che in questo modo spazi e caratteri speciali nel nome dei campi
non sono un problema (il nome dei campi non puņ contenere parentesi
quadre), almeno utilizzando direttamente i metodi della libreria ADO, non
so se l'interfaccia DBI introduca altre limitazioni (ma non credo). Non
sono altresģ in grado di garantire che il problema sia effettivamente nei
nome dei campi.
Ciao.

 ORDINAL_POSITION contenuto nell'array restituito da column_info() ?
Ringraziando il cielo, no. E' possibile usare un numero come indice del
campo, se si accede alla tabella con un oggetto Recordset.
Ciao.

 Questo e' il modo natico di Access di delimitare i nomi di colonne.
Ecco cio' che mi mancava!!
E' stato sufficiente inserire le stringhe tra parentesi quadre.
Un grazie di cuore, gmax.
Andrea

 Questo e' il modo natico di Access di delimitare i nomi di colonne.
Lapsus tastierae.
s/natico/nativo/
Just in case ... :-)
