2012-11-20 22 views
6

Sono riuscito a leggere i dati del file di Microsoft Access (.accdb) su Windows usando PDO, ma sto avendo problemi a lavorare su Linux (CentOS). Posso vedere i moduli sono installati:DOP: come accedere al file di Microsoft Access su Linux?

[[email protected] host]# php -m | grep PDO 
PDO 
PDO_ODBC 
[[email protected] host]# php -m | grep odbc 
odbc 

codice:

<?php 
    try{ 
     $dbhAccess = new PDO("odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=/root/access/data.accdb;Uid=Admin"); 
    } 
    catch(PDOException $e){ 
     echo $e->getMessage(); 
     exit(); 
    } 

ricevo un erro quando eseguo (CLI) file PHP:

[[email protected] host]# php access.php 
SQLSTATE[IM002] SQLDriverConnect: 0 [unixODBC][Driver Manager]Data source name not found, and no default driver specified 

risposta

1

Non ho mai lavorato con un Database di Microsoft Access ma mi collego regolarmente a DB2 (su IBM AS/400) e server MS SQL da server Linux (Ubuntu). Il tuo errore sembra indicare che non hai installato un driver MS Access: l'unico a cui sono a conoscenza è: http://www.easysoft.com/products/data_access/odbc-access-driver/index.html

Il tuo messaggio di errore dice anche "Nome sorgente dati non trovato" - per farmi connettersi a DB2 o MSSQL Devo aggiungere alcune informazioni a /etc/odbc.ini e /etc/odbcinst.ini.

/etc/odbcinst.ini - questo è dove si descrive dove trovare i driver per ODBC. Ecco un esempio di quello che io uso per DB2 e MSSQL:

[iseries] 
Description  = iSeries Access for Linux ODBC Driver 
Driver   = /usr/lib/libcwbodbc.so 
Setup   = /usr/lib/libcwbodbcs.so 
NOTE1   = If using unixODBC 2.2.11 or later and you want the 32 and 64-bit ODBC drivers to share DSN's, 
NOTE2   = the following Driver64/Setup64 keywords will provide that support. 
Driver64  = /usr/lib/lib64/libcwbodbc.so 
Setup64   = /usr/lib/lib64/libcwbodbcs.so 
Threading  = 2 
DontDLClose  = 1 
UsageCount  = 1 

# Define where to find the driver for the Free TDS connections. 
[freetds] 
Description  = MS SQL database access with Free TDS 
Driver   = /usr/lib/i386-linux-gnu/odbc/libtdsodbc.so 
Setup   = /usr/lib/i386-linux-gnu/odbc/libtdsS.so 
UsageCount  = 1 

[ODBC] 
Trace   = no 
TraceFile  = /tmp/odbc.log 

In questo ultimo tratto ([ODBC]) Al momento ho Trace = no - se si cambia che per tracciare = yes otterrete alcune informazioni di debug utili nel file /tmp/odbc.log.

/etc/odbc.ini - qui si definiscono le origini dati. Ecco un esempio di quello che io uso per DB2 e MSSQL:

[primary] 
Description    = primary 
Driver     = iseries 
System     = XXX.XXX.XXX.XXX 
UserID     = XXXXXXXXXX 
Password    = XXXXXXXXXX 
Naming     = 0 
DefaultLibraries  = QGPL 
Database    = MYLIB 
ConnectionType   = 0 
CommitMode    = 2 
ExtendedDynamic   = 0 
DefaultPkgLibrary  = QGPL 
DefaultPackage   = A/DEFAULT(IBM),2,0,1,0,512 
AllowDataCompression = 1 
LibraryView    = 0 
AllowUnsupportedChar = 0 
ForceTranslation  = 0 
Trace     = 0 

# Define a connection to the MSSQL server. 
# The Description can be whatever we want it to be. 
# The Driver value must match what we have defined in /etc/odbcinst.ini 
# The Database name must be the name of the database this connection will connect to. 
# The ServerName is the name we defined in /etc/freetds/freetds.conf 
# The TDS_Version should match what we defined in /etc/freetds/freetds.conf 
[mssql] 
Description    = MSSQL Server 
Driver     = freetds 
Database    = MyDatabase 
ServerName    = mssql 
TDS_Version    = 8.0 

Ho visto una serie di domande qui su StackOverflow parlando utilizzando database di Access MSFT da una macchina Linux - e ci sembra non essere mai un lieto fine. Se esiste un modo per trasferire i dati su un sistema di database diverso, meglio supportato (come MySQL), penso che risparmierai qualche mal di testa. In bocca al lupo!

2

è necessario installare il driver MDB.

Non ho modo di provarlo ora, ma penso che MDB Tools (in particolare lo ODBC driver) possa fare ciò che ti interessa.

1

Non è possibile utilizzare {Driver Microsoft Access (* .mdb, * .accdb)} come parte dell'origine dati perché Microsoft non crea un driver ODBC per MS Access per Linux. Ci sono 2 driver ODBC per MS Access per quanto ne so. MDB Tools e Easysoft ODBC-Access Driver.

Se si installa un driver, è possibile utilizzare un DSN che è stato impostato nel file odbc.ini o come si preferisce una connessione DSN-Less. Ecco un esempio della connessione Easysoft DSN-Less a un database MS Access

PDO ("odbc: Driver = {Driver = Easysoft ODBC-ACCESS}; Dbq =/root/access/data.accdb");

Ulteriori informazioni sul collegamento e recupero dei dati utilizzando PDO-ODBC sono disponibili su Easysoft PHP guide C'è una sezione a metà circa che parla di PDO-ODBC.

+0

per chiunque altro abbia problemi di connessione alla sintassi di cui sopra non funziona sulla versione più recente - utilizzare invece '$ nomefile = "/path/to/database.mdb";' ' $ DOP = new PDO ("odbc: DRIVER = {Easysoft ODBC-ACCESS}; MDBFILE = {$ nomefile};"); ' nota che DRIVER e MDBFILE sono entrambi i cap di blocco e DBQ è ora MDBFILE – Kev

+0

Ciao, infatti, funziona con Easysoft Driver ODBC-ACCESS. Ma non è gratuito e piuttosto costoso. Conoscete driver ODBC Access per Linux, diversi da MDB Tools (supporto SQL molto limitato)? – Franck

+0

Trovato una buona alternativa ai driver commerciali ODBC-Access: mdb-SQLite https://code.google.com/p/mdb-sqlite/ – Franck

Problemi correlati