2009-10-30 4 views
4

J'ai un fichier .accdb sur ma machine locale et j'essaie de me connecter et de lire quelques données de 3 tables dans la base de données. Comment puis-je établir la connexion en utilisant Perl? Jusqu'à présent, j'ai raté autant pour MS Access, mais je reçois des erreurs disant que je n'utilise pas le bon pilote. Des idées?Comment me connecter à une base de données MS Access à l'aide de Perl?

my $msaccess_dbh = DBI->connect(
    'dbi:ODBC:driver=microsoft access driver (*.accdb);' . 
    'dbq=C:\path\to\database\databasefile.accdb' 
); 

Merci!

EDIT: Juste pour clarifier, je n'ai aucune exigence réelle ici. J'ai juste besoin de faire 2 ou 3 sélections de cette DB MS Access, et j'en aurai fini avec. Donc, toute aide avec la connexion et la sélection serait géniale. Merci encore.

+0

''dbi: ADO: ....' peut-être? –

+0

Existe-t-il une exigence pour utiliser ODBC par opposition à OLEDB? –

+0

pas d'exigences, j'ai juste besoin de comprendre comment obtenir des données de cette stupide MS Access DB. – samandmoore

Répondre

4

En fonction de votre chaîne de connexion, il semble que vous soyez (a) sur Win32 et (b) vous connectez à une base de données locale machine. Si je suis correct pourquoi s'embêter avec ODBC quand vous pouvez vous connecter directement avec Jet? Reportez-vous ci-dessous:

#!/usr/bin/perl 
use strict;use warnings; 

use Win32::OLE; 

my $DBFile = qw(X:\Path\To\Your\Database.mdb); # 
#Choose appropriate version of Jet for your system 
my $Jet = Win32::OLE->CreateObject('DAO.DBEngine.36') or die "Can't create Jet database engine."; 
my $DB = $Jet->OpenDatabase($DBFile); 

my $SQLquery = "DELETE * FROM Test_Table"; 
$DB->Execute($SQLquery, 128); #128=DBFailOnError 
+0

DAO version 3.6 ne peut pas lire ACCDB. –

+0

C'est wby il dit "choisir la version appropriée" sur la ligne de commentaire. – heferav

+0

D'accord, cela semble fonctionner, ma question est de savoir comment sauvegarder une sélection dans un tableau en utilisant cette méthode? – samandmoore

2

Vous devez connection strings

+0

DBI-> connect ("dbi: ODBC: $ connection_string"); – spoulson

+0

donc quelque chose comme: my $ MSACCESS_DSN = 'Provider = Microsoft.ACE.OLEDB.12.0; Source de données = C: \ chemin \ vers \ base de données \ databasefile.accdb; Persist Security Info = False;'; my $ msaccess_dbh = DBI-> connect ("dbi: ODBC: $ MSACCESS_DSN"); Parce que cela génère une erreur indiquant que le nom de la source de données n'a pas été trouvé et qu'aucun pilote par défaut n'a été spécifié. Désolé je suis un peu un MS db noob. – samandmoore

1

J'ai des chaînes de connexion utilisé avec succès avec ce format dans le passé, mais qui était pour l'ancien format * .mdb. Il est possible que votre pilote ODBC ne prenne pas en charge le nouveau format * .accdb dans Access 2007.

+0

Je l'ai converti en * .mdb mais il refuse toujours de travailler. Je devrais chercher à obtenir un conducteur différent. – samandmoore

3

Je devine que le conducteur ne correspondait pas à ce que vous aviez pour le DSN, ou l'autre chose qui cause des problèmes est si vous mixez 64 bits Perl avec ODBC 32 bits pilote, ou Perl 32 bits avec un pilote 64 bits. Le vrai problème est ce message d'erreur, c'est terriblement vague - vous pensez peut-être qu'ils pourraient vous dire si la source de données OU le pilote était le problème? Dans un monde parfait ...

Quoi qu'il en soit, cette méthode que vous essayiez fonctionne si votre DSN est correct, & si votre pilote ODBC Perl & appartient à la même famille de bits.

La référence du pilote dans le DSN doit correspondre exactement à ce qui est répertorié sous Outils d'administration>Sources de données (ODBC)>Pilotes onglet. Le mien est répertorié comme Microsoft Access Driver ( .mdb, .accdb) donc c'est légèrement différent de ce que vous aviez. Dans Perl la ligne de se connecter est:

my $dbh = DBI->connect('dbi:ODBC:driver=Microsoft Access Driver (*.mdb, *.accdb);dbq=X:\Path\To\Your\Database.mdb') 

Plus d'info sur MS Access with Perl on Windows 7 is here.

+1

Excellent point sur les problèmes de 32 et 64 bits! –

Questions connexes