将perl连接到ms访问

时间:2014-02-10 10:53:13

标签: perl ms-access-2007

我想从访问中的表中检索数据。代码是

#!/usr/bin/perl  
use strict;  
use warnings;  
use DBI;  
my $DBFile  = qw(C:test\INSTRUCTIONS.mdb );   
my $dbh = DBI->connect("dbi:ODBC:driver=microsoft access driver (*.mdb);dbq=$DBFile",'','') or die("cannot connect to DB");  
my $SQLquery = "select * FROM IndemDate";  
$dbh->Execute($SQLquery);  

这是我收到的错误

DBI connect('driver=microsoft access driver (*.mdb);dbq=C:test\INSTRUCTIONS.mdb','',...) failed: [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (SQL-IM002) at C:/Test/connectaccess.pl line 9.
cannot connect to DB at C:/Test/connectaccess.pl line 9.

有人可以帮助我纠正我的错误。有没有我错过安装的驱动程序。

3 个答案:

答案 0 :(得分:3)

正如对问题的评论中所指出的,Perl脚本最初是作为64位进程运行的。因此较旧的Microsoft“Jet”ODBC驱动程序

Microsoft Access Driver (*.mdb)

无法使用。只有32位进程才能使用旧的Jet驱动程序。如果必须以64位进程运行Perl脚本,则必须从{{3>下载并安装较新的Microsoft Access数据库引擎(又名“ACE”)的64位版本然后使用驱动程序名称

Microsoft Access Driver (*.mdb, *.accdb)

或者,您可以将Perl脚本作为32位进程运行并使用旧的Jet驱动程序。

编辑重新评论

由于您安装了32位Access 2007,因此您已在计算机上安装了32位版本的ACE驱动程序。这有效地消除了安装64位版本ACE驱动程序的选项,因为如果在计算机上找到32位Office组件,64位ACE安装程序将中止。 (显然有一种方法可以强制进行第二次安装,但据报道在某些情况下会破坏Office,并且肯定是支持。)

因此,您的选项可以修改为:

  1. 以32位进程运行Perl脚本,或

  2. 删除32位Access 2007并安装64位版本的Access,然后使用64位ACE驱动程序将Perl脚本作为64位进程运行。

答案 1 :(得分:0)

尝试使用Jet

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

use Win32::OLE;

my $DBFile  = qw( C:\test\INSTRUCTIONS.mdb );

# choose the appropriate versione 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 = "select * FROM IndemDate";
$DB->Execute($SQLquery, 128); #128=DBFailOnError

[来源:here,也看看here]

答案 2 :(得分:0)

对于以32位进程运行的脚本(在我的例子中,32位Strawberry Perl),以下代码适用于我:

#!perl  
use strict;  
use warnings;  
use DBI;  
print 'bits: ' . (8 * (length pack 'P', -1)) . "\n\n";
my $DBFile = q(C:\Users\Public\mdbTest.mdb);   
my $dbh = DBI->connect("dbi:ODBC:Driver={Microsoft Access Driver (*.mdb)};DBQ=$DBFile",'','') or die("cannot connect to DB");  
my $SQLquery = "SELECT * FROM Members";  
my $sth = $dbh->prepare($SQLquery);
my $rc = $sth->execute;
while (my $href = $sth->fetchrow_hashref) {
    print "memberID: " . $$href{"memberID"} . "\n";
    print "memberName: " . $$href{"memberName"} . "\n";
    print "\n";
}