我想从访问中的表中检索数据。代码是
#!/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.
有人可以帮助我纠正我的错误。有没有我错过安装的驱动程序。
答案 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,并且肯定是不支持。)
因此,您的选项可以修改为:
以32位进程运行Perl脚本,或
删除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
答案 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";
}