我希望我的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。
答案 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的任何问题,但它增加了新的功能。