我该如何使用Perl连接到MS Access数据库?

4

我在本地机器上有一个.accdb文件,想要连接并从DB中的三个表读取一些数据。我该如何使用Perl建立连接?

到目前为止,我已经为MS Access拼凑了这么多代码,但是却收到了错误提示:我没有使用正确的驱动程序。有什么建议吗?

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

谢谢!

编辑:为了澄清,我这里没有实际的要求。我只需要从这个MS Access数据库中做2或3次选择,然后我就完成了。所以任何有关连接和选择的帮助都将是很好的。再次感谢。


使用ODBC和OLEDB有什么要求上的区别吗? - David-W-Fenton
没有任何要求,我只需要弄清楚如何从这个愚蠢的MS Access数据库中获取一些数据。 - samandmoore
4个回答

4

根据您的连接字符串,看起来您是在Win32上,并连接到本地计算机上的数据库。如果我是正确的,为什么要使用ODBC,而不直接使用Jet进行连接呢?请参考以下内容:

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

这就是为什么在注释行上说“选择适当的版本”的原因。 - heferav
好的,这似乎可以工作,现在我的问题是如何使用这种方法将选择保存到数组中? - samandmoore

3

我猜测驱动程序与您的DSN不匹配,或者引起问题的另一个原因是如果您将64位Perl与32位ODBC驱动程序混合使用,或者将32位Perl与64位驱动程序混合使用。真正的问题是这个错误消息,它非常模糊 - 你是否认为他们可以告诉你数据源还是驱动程序有问题?在一个完美的世界里...

无论如何,如果您的DSN正确,并且您的Perl和ODBC驱动程序属于相同的位系列,则您尝试的方法确实有效。

DSN中的驱动程序引用必须完全匹配“管理员工具”>“数据源(ODBC)”>“驱动程序”选项卡下列出的内容。我的列为Microsoft Access Driver (.mdb, .accdb),所以与您的略有不同。在Perl中,连接行为如下:

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

这里有关于在Windows 7上使用Perl和MS Access的更多信息,请点击此处


2

DBI->connect("dbi:ODBC:$连接字符串"); - spoulson
我的 $MSACCESS_DSN ='Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\path\to\database\databasefile.accdb;Persist Security Info=False;'; 我的 $msaccess_dbh = DBI->connect("dbi:ODBC:$MSACCESS_DSN");因为它报错说找不到数据源名称,也没有指定默认驱动程序。抱歉,我有点像 MS 数据库新手。 - samandmoore

1

我以前成功地使用过那种格式的连接字符串,但那是针对旧的*.mdb格式的。有可能你的ODBC驱动程序不支持Access 2007中较新的*.accdb格式。


我将它转换为*.mdb格式,但是仍然无法工作。我可能需要考虑获取不同的驱动程序。 - samandmoore

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