在perl中使用DBI驱动器时出错

Lea*_*Cpp 0 perl dbm dbi

下面是代码

 #!/usr/bin/perl
 use warnings;
 use strict;
 use DBI;
 my $dbh = DBI->connect('dbi:DBM:sid=upr18;host=abd-up3db1',"user", "pass");
 my $sth = $dbh->prepare("SELECT count(*) FROM temp_table");
 $sth->execute();
Run Code Online (Sandbox Code Playgroud)

虽然connnect和prepare语句实际上不会抛出错误,并且执行语句错误输出.以下是错误

DBD :: DBM :: st执行失败:无法打开./temp_table.lck:/usr/perl5/vendor_perl/5.8.4/i86pc-solaris-64int/DBD/File.pm第574行没有此类文件或目录.[ for Test.pl第8行的语句"SELECT count(*)FROM temp_table"].

我出错的任何建议.

Dav*_*oss 5

如果您尝试连接到不存在的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;
Run Code Online (Sandbox Code Playgroud)

运行这个,我有文件叫user.paguser.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();
Run Code Online (Sandbox Code Playgroud)

更新:我还想补充说,阅读文档将告诉您哪些选项对DBD :: DBM有效.它看起来对我来说,sidhost这里没有做什么有用的东西.此外,基于文件的DBD不太可能需要用户名和密码.

更新2:您在这里使用正确的数据库驱动程序吗?DBD :: DBM用于访问位于本地系统上的DBM文件.一个DBM文件是一个非常简单的,单表,基于文件的数据文件.这不是真正的"数据库",因为我们现在理解这个词.这是一项非常古老的技术,现在很少使用.

您在下面的评论使您看起来像是在尝试连接到真正的关系数据库系统.在这种情况下,DBD :: DBM完全是错误的数据库驱动程序.您需要与您正在使用的系统匹配的数据库驱动程序.你使用术语"SID"让我觉得你在使用Oracle - 所以你需要DBD :: Oracle.