Perl ODBC连接没有密码

时间:2011-09-06 14:09:14

标签: database perl odbc connection-string

我希望我的Perl脚本使用ODBC连接字符串连接到DB。这适用于下面的代码。但我也希望它使用我输入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";
}

注意:数据库必须设置密码(消隐pwd不是选项)。

操作系统是Windows 2008 R2(64位)。 ODBC连接在系统DSN中定义为32位。 Perl版本是32位。连接到MSSQL 2008 R2。

4 个答案:

答案 0 :(得分:1)

假设您使用的是Windows,则可以使用Win32 :: ODBC模块。

use Win32::ODBC;

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

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

答案 1 :(得分: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}"
    ));

答案 2 :(得分:0)

仅使用第一个参数尝试它,而对于user / passwd没有'undef,undef'。 The DBD::ODBC FAQ似乎表明你不需要另外两个论点。

答案 3 :(得分:0)

您需要意识到,由于历史原因,如果连接字符串不包含DSN =,DBD :: ODBC会尝试在SQLDriverConnect之前调用SQLConnect。 ODBC调用SQLConnect接受3个参数dsn name,username和password。从ODBC文档中不清楚是否为用户名和密码传递NULL(在C中)意味着不使用它们。但是,如果您将DBI connect第一个参数指定为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或者在这里回答,我会考虑更改它。

更新4-Nov-11我在1.32_2开发版中向DBD :: ODBC添加了odbc_driver_complete属性。我并不是说它修复了OP的任何问题,但它增加了新的功能。