如果您尝试连接到不存在的 DBM 文件,您似乎会收到此错误(并且,我同意这不是一个特别有用的错误)。
为了使此代码正常工作,您需要创建一个名为 DBM 的文件temp_table.pag
,其中包含您要使用的数据。
与往常一样,最好阅读您尝试使用的模块的文档。DBD::DBM 文档包含一个示例程序,我必须对其稍作调整才能使其正常工作:
#!/usr/bin/perl
use warnings;
use strict;
use feature 'say';
use DBI;
my $dbh = DBI->connect('dbi:DBM:');
$dbh->{RaiseError} = 1;
for my $sql( split /;\n+/,"
CREATE TABLE user ( user_name TEXT, phone TEXT );
INSERT INTO user VALUES ('Fred Bloggs','233-7777');
INSERT INTO user VALUES ('Sanjay Patel','777-3333');
INSERT INTO user VALUES ('Junk','xxx-xxxx');
DELETE FROM user WHERE user_name = 'Junk';
UPDATE user SET phone = '999-4444' WHERE user_name = 'Sanjay Patel';
SELECT * FROM user
"){
say $sql;
my $sth = $dbh->prepare($sql);
$sth->execute;
# It was the "if" clause that I had to change.
# Previously it was: if $sth->{NUM_OF_FIELDS}.
# I wonder if the behaviour of NUM_OF_FIELDS has changed.
$sth->dump_results if $sql =~ /\bselect\b/i;
}
$dbh->disconnect;
运行此程序后,我有名为user.pag
and的文件user.dir
。然后我可以成功运行一个非常像你的程序。
#!/usr/bin/perl
use warnings;
use strict;
use DBI;
my $dbh = DBI->connect('dbi:DBM:');
my $sth = $dbh->prepare('SELECT user_name FROM user');
$sth->execute;
while (my $row = $sth->fetch) {
print "$row->[0]\n";
}
$sth->execute();
更新:我还想补充一点,阅读文档会告诉您哪些选项对 DBD::DBM 有效。在我看来,它sid
在host
这里没有做任何有用的事情。此外,基于文件的 DBD 不太可能需要用户名和密码。
更新 2:您在这里使用正确的数据库驱动程序吗?DBD::DBM 用于访问位于本地系统上的 DBM 文件。DBM 文件是一个非常简单的、单表的、基于文件的数据文件。它不是真正的“数据库”,因为我们现在会理解这个术语。这是非常古老的技术,现在很少使用。
您在下面的评论使您看起来像是在尝试连接到真正的关系数据库系统。在这种情况下,DBD::DBM 是完全错误的数据库驱动程序。您需要与您正在使用的系统相匹配的数据库驱动程序。您对“SID”一词的使用让我认为您正在使用 Oracle - 所以您需要DBD::Oracle。