2011-09-06 55 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没有登录要求,如果我正确阅读手册。 –