在Perl脚本中建立数据库连接时出错?
问题描述:
我使用的是perl 5.24。我正在学习Perl。在Perl脚本中建立数据库连接时出错?
我写了一个简单的Perl代码连接到数据库。但给人错误,说明
DBI connect('database=vms','DBA',...) failed: (no error string) at simpleperl.pl line 13.
的代码是
#!/usr/bin/perl
use DBI;
use DBD::SQLAnywhere;
my $driver = "SQLAnywhere";
my $database = "vms";
my $dsn = "DBI:$driver:database=$database";
my $userid = "DBA";
my $password = "admin";
my $dbh = DBI->connect($dsn, $userid, $password,{RaiseError => 1}) or die ("died connection:$DBI::errstr");
if($dbh)
{
print "Connection Established";
}
任何人都可以指出什么可能这里是什么问题?
答
注意在DBD::SQLAnywhere文档以下几点:
$dbh = DBI->connect('dbi:SQLAnywhere:ENG=demo', $userid, $passwd);
#!/usr/bin/perl
use strict;
use warnings;
use DBI;
my $driver = "SQLAnywhere";
my $database = "vms";
my $dsn = "DBI:$driver:ENG=$database";
my $userid = "DBA";
my $password = "admin";
my $dbh = DBI->connect($dsn, $userid, $password, {RaiseError => 1});
print "Connection established\n";
$dbh->disconnect;
还要注意以下几点:
- 始终使用
strict
和warnings
。 - 您不需要
use DBD::SQLAnywhere;
。DBI
将根据您在连接字符串中指定的内容选择驱动程序。 - 您在连接选项中指定了
{RaiseError => 1}
。这意味着,不需要or die
。如果connect
失败,DBI
会发声。 - 您可能想要
AutoCommit => 0
去那RaiseError => 1
。 - 连接尝试后不需要
if ($dbh)
。除非connect
成功,否则你不会到那里。
鉴于固定在连接字符串没有解决的问题,我没有SQLAnywhere的数据库来测试的东西的情况下,我会建议你补充:
DBI->trace(5);
的connect
前调用并使用跟踪信息更新您的问题。另见TRACING。
首先使用'strict strict;'和'use warnings'',因为那些会遇到一堆错误。并且不要直接使用DBD ::'。 'DBI'将为您处理驱动程序。 –
dgw
我想'database = $ database'必须是'ENG = $ database'。请参阅源代码中的评论:'#如果dbname以某种看起来不像 \t#a连接字符串参数('label = value;'格式)开头,则 \t#'ENG ='是前缀。 ' – Jens
相关:https://stackoverflow.com/q/44906829 – PerlDuck