2011-09-06 74 views
1

我想讓我的Perl腳本使用ODBC連接字符串連接到數據庫。這適用於下面的代碼。但我也希望它使用我已經輸入到ODBC連接的用戶名和密碼。我不想在腳本中提供這些內容。Perl沒有密碼的ODBC連接

任何人都知道如何做到這一點?

use DBI; 

my $strConn = "dbi:ODBC:MyDB"; 
my $username = "username"; 
my $password = "password"; 

# Does work 
$dbh = DBI->connect($strConn, $username, $password, { PrintError => 1, RaiseError => 1 }); 

# Does not work 
#$dbh = DBI->connect($strConn, undef, undef, { PrintError => 1, RaiseError => 1 }); 

if ($dbh) 
{ 
    print "OK\n"; 
} else { 
    print "FAIL\n"; 
} 

注意:DB必須設置密碼(消隱pwd不是選項)。

操作系統是Windows 2008 R2(64位)。 ODBC連接在系統DSN中定義爲32位。 Perl版本是32位。連接已完成到MSSQL 2008 R2。

+0

你連接了哪個數據庫? –

+0

該數據庫是MSSQL 2008 –

回答

0

您需要認識到,由於歷史原因,如果連接字符串不包含DSN =,DBD :: ODBC會嘗試在SQLDriverConnect之前調用SQLConnect。 ODBC調用SQLConnect需要3個參數dsn名稱,用戶名和密碼。從ODBC文檔中不清楚是否傳遞NULL(用C表示)用戶名和密碼意味着它們不被使用或不被使用。但是,如果您將DBI連接第一個參數指定爲dbi:ODBC:DSN = mydsn並省略用於連接的用戶名/密碼參數(或將它們作爲undef傳遞)DBD :: ODBC調用SQLDriverConnect並且ODBC驅動程序可以從其他DSN詳細信息你的DSN。然而,我沒有嘗試過這一點,我略微擔心DBD :: ODBC中的SQLDriverConnect調用傳遞SQL_DRIVER_NOPROMPT作爲唯一參數,並且不包含SQL_DRIVER_COMPLETE。如果您嘗試上述操作並且無法正常工作,請嘗試將對SQLDriverConnect的調用更改爲SQL_DRIVER_NOPROMPT | SQL_DRIVER_COMPLETE並重新編譯DBD :: ODBC。如果它們在rt.cpan.org上運行RT,或者在這裏回答,我會考慮改變它。

UPDATE 4-Nov-11在1.32_2 dev版本中,我在DBD :: ODBC中添加了odbc_driver_complete屬性。我並不是建議它修復OP的任何問題,但它增加了新功能。

+0

我試過沒有undef,也沒有運氣。那麼這是我們現在最接近的答案。這是一個小小的任務,所以不能花太多時間。 –

+0

我不明白「我也試過沒有undef」。這是一種遺憾,你沒有嘗試使用dbi:ODBC:DSN = mydsn,並且沒有用戶名/密碼,因爲我不知道在DBD :: ODBC中添加SQL_DRIVER_COMPLETE是否有用。 – bohica

0

您希望傳入的用戶名和密碼如何?

這是一個命令行版本。

use 5.010; 
use strict; 
use warnings; 
use Getopt::Long qw<GetOptions>; 

GetOptions(\my %options, qw<user|u password|pwd|p>); 
# Non-option arguments will be left on @ARGV 
# this script also accepts script.pl [USER] [PASSWORD] 
usage('User not set!')  unless ($options{user} //= shift); 
usage('Password not set!') unless ($options{password} //= shift); 

$dbh 
    = DBI->connect( 
     $strConn 
    , @options{ qw<user password> } 
    , { PrintError => 1, RaiseError => 1 } 
    ); 

或者

$dbh 
    = DBI->connect(join( 
     ';' 
    , 'DBI:ODBC:driver={SQL Server}' 
    , "Server=$SQL_SERVER" 
    , "Database=$SQL_DATABASE" 
    , "UID=$option{user}" 
    , "PWD=$option{password}" 
    )); 
+0

它使用在控制面板中的ODBC連接中輸入的用戶名/密碼(因此密碼不是以明文形式存儲的)。 –

1

假設你使用的是Windows,你可以使用Win32 :: ODBC模塊。

use Win32::ODBC; 

my $dbh = new Win32::ODBC("odbc_connection_name");  

if ($dbh) 
{ 
    print "OK\n"; 
} else { 
    print "FAIL\n"; 
} 
+0

沒有骰子。 ODBC跟蹤日誌顯示「用戶登錄失敗」。用戶未與可信的SQL Server連接相關聯。 (18452)'。 –

+0

它在Windows 7機器上使用System DSN ODBC連接來連接到本地SQL Server 2008 R2數據庫。連接使用SQL Server身份驗證,並使用保存在ODBC中的用戶名和密碼。您是否能夠使用其他程序在沒有用戶名/密碼的情況下使用ODBC連接? – Narthring

0

嘗試僅使用第一個參數,並且不爲user/passwd使用'undef,undef'。 The DBD::ODBC FAQ似乎表明您不需要其他兩個參數。

+0

同樣的結果。如果你需要第四個參數,undef只是一個placefiller。當沒有用戶/ pwd給出時,假設db沒有登錄要求,如果我正確閱讀手冊。 –