将Perl连接到MS Access

4

我正在尝试从Access表中检索数据。 代码如下:

#!/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.

请问有人能帮我纠正错误吗?是否有我遗漏需要安装的驱动程序?


尝试使用 my $DBFile = 'C:/test/INSTRUCTIONS.mdb'; die "文件路径有问题" if not -e $DBFile; 来检查是否存在问题。也许在传递该参数时有问题...您可以使用这些行来检查是否像我所写的那样。 - Filippo Lauria
你尝试通过控制面板设置ODBC连接以确保那一方面没问题了吗? - Richard Huxton
@FilippoLauria 这种方式也不起作用。 - Programmer
@RichardHuxton 如果我用 q() 替换 qw(),我仍然会收到相同的错误。 - Programmer
你的 Perl 脚本是否作为 64 位进程运行? - Gord Thompson
显示剩余4条评论
3个回答

4
正如在问题的评论中所示,Perl脚本最初是以64位进程运行的。因此,旧的Microsoft“Jet”ODBC驱动程序
Microsoft Access Driver (*.mdb)

驱动程序不可用。只有32位进程可以使用旧版Jet驱动程序。如果您必须将Perl脚本作为64位进程运行,则需要从此处下载并安装更新的Microsoft Access数据库引擎(也称为“ACE”)的64位版本,然后使用驱动程序名称。

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

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

关于评论的编辑

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

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

  1. 将Perl脚本作为32位进程运行,或

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


但是我正在使用 MS Access 2007。 - Programmer
@程序员,Access 2007是32位的吗?(老实说,我不记得是否有64位版本的Access 2007了。) - Gord Thompson
我正在64位操作系统上运行的是32位的MS Access。 - Programmer
是的,但如果我执行程序,它会返回错误...我的程序出了什么问题? - Programmer
@程序员 你是说你现在将Perl脚本作为32位进程运行,但仍然出现错误? - Gord Thompson
是的,这就是我提到是否错过安装任何驱动程序的原因。 - Programmer

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

[来源:这里,还可以看看这里]


Win32::OLE(0.1709) 错误 0x80040154: "类未注册" 位于 C:/test/connectaccess.pl 第 10 行。在 C:/test/connectaccess.pl 第 10 行无法创建 Jet 数据库引擎。 - Programmer

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";
}

我仍然收到错误消息:DBI connect('Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\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 6. cannot connect to DB at C:/test/connectaccess.pl line 6. - Programmer
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 7. cannot connect to DB at C:/test/connectaccess.pl line 7. - Programmer
@程序员,当您添加了额外的语句后,脚本在错误消息之前没有输出任何内容吗? - Gord Thompson
@程序员...看起来你的脚本仍在以64位进程运行。请参考我的其他答案。 - Gord Thompson
@程序员 您可能需要安装32位版本的Perl解释器,然后使用它来执行您的脚本。最好先进行一些搜索,看看ActivePerl是否有一种方法可以在您现在的设置中执行该操作。(也许64位的ActivePerl也安装了32位组件...我不知道。) - Gord Thompson
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接