2017-07-06 124 views
0

我使用的是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"; 
} 

任何人都可以指出什麼可能這裏是什麼問題?

+0

首先使用'strict strict;'和'use warnings'',因爲那些會遇到一堆錯誤。並且不要直接使用DBD :: '。 'DBI'將爲您處理驅動程序。 – dgw

+0

我想'database = $ database'必須是'ENG = $ database'。請參閱源代碼中的評論:'#如果dbname以某種看起來不像 \t#a連接字符串參數('label = value;'格式)開頭,則 \t#'ENG ='是前綴。 ' – Jens

+0

相關:https://stackoverflow.com/q/44906829 – PerlDuck

回答

3

注意在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; 

還要注意以下幾點:

  • 始終使用strictwarnings
  • 您不需要use DBD::SQLAnywhere;DBI將根據您在連接字符串中指定的內容選擇驅動程序。
  • 您在連接選項中指定了{RaiseError => 1}。這意味着,不需要or die。如果connect失敗,DBI會發聲。
  • 您可能想要AutoCommit => 0去那RaiseError => 1
  • 連接嘗試後不需要if ($dbh)。除非connect成功,否則你不會到那裏。

鑑於固定在連接字符串沒有解決的問題,我沒有SQLAnywhere的數據庫來測試的東西的情況下,我會建議你補充:

DBI->trace(5); 

connect前調用並使用跟蹤信息更新您的問題。另見TRACING

+0

我跑了你建議的代碼。它仍然給出了相同的錯誤 **在另一個SimplePerl.pl行12 DBI連接('ENG = vms','DBA',...)失敗:(無錯誤字符串)** – Prateek

+0

我假設確實有名爲'vms'的數據庫,您可以通過其他方式進行連接。這個假設是否正確? –

+0

是的,有一個名爲vms的數據庫。 – Prateek

相關問題