使用DBI使用Perl连接到SQL Server?

使用DBI使用Perl连接到SQL Server?,sql,sql-server,perl,dbi,Sql,Sql Server,Perl,Dbi,我正在尝试使用Perl DBI模块连接到SQL server,我已经尝试了所有的连接字符串格式,但Perl仍然抛出无效的连接字符串错误 我已经尝试了perl monk网站上提供的代码片段 #!/usr/bin/perl -w use strict; use DBI; # Set up variables for the connection my $server_name = '00.120.124.1;3181'; my $database_name = 'abcd'; my $datab

我正在尝试使用Perl DBI模块连接到SQL server,我已经尝试了所有的连接字符串格式,但Perl仍然抛出无效的连接字符串错误

我已经尝试了perl monk网站上提供的代码片段

#!/usr/bin/perl -w
use strict;
use DBI;

# Set up variables for the connection
my $server_name = '00.120.124.1;3181';

my $database_name = 'abcd';
my $database_user = 'kkkk';
my $database_pass = 'password';

my $DSN = 'driver={SQL Server};server=$server_name;da
+tabase=$database_name;uid=$database_user;pwd=$database_pass;'; 
my $dbh = DBI->connect("DBI:ODBC:$DSN") || die "Couldn't open database
+: $DBI::errstr\n";
预期结果是连接到数据库


失败:[Microsoft][ODBC SQL Server驱动程序][DBNETLIB]SQL Server不存在或访问被拒绝。[Microsoft][ODBC SQL Server驱动程序][DBNETLIB]连接打开(Connect())。(SQL-01000)[状态为01000现在为01S00][Microsoft][ODBC SQL Server驱动程序]perl.pl第16行的连接字符串属性(SQL-01S00)无效。无法打开数据库+:[Microsoft][ODBC SQL Server驱动程序][DBNETLIB]SQL Server不存在或访问被拒绝。(SQL-08001)[状态是08001现在是01000]无效的连接字符串属性(SQL-01S00)

+

+tabase=$database_name;uid=$database_user;pwd=$database_pass;'; 

+: $DBI::errstr\n";
错误地从perlmonks.org复制和粘贴。前导的
+
符号是一种表示拆分了一条长线的惯例。您应该删除
+
并将该行连接到上一行,以便您的代码可以读取

my $DSN = 'driver={SQL Server};server=$server_name;database=$database_name;uid=$database_user;pwd=$database_pass;'; 
my $dbh = DBI->connect("DBI:ODBC:$DSN") || die "Couldn't open database: $DBI::errstr\n";

您的错误消息包含以下内容:

SQL Server不存在或访问被拒绝

您的设置代码包含以下内容:

'00.120.124.1;“3181”不是有效的服务器名称或IP地址。您应该更正IP地址部分(不能以“00”开头),并将端口删除到单独的参数中

您还可以将用户名和密码作为DSN的一部分。我不知道DBD::ODBC是否支持这种用法(在中没有提到),但更传统的做法是将它们作为
connect()
调用的单独参数

总而言之,我想你想要的更像这样:

my $server_name = '00.120.124.1'; # But this needs to be corrected
my $server_port = 3181;

my $database_name = 'abcd';
my $database_user = 'kkkk';
my $database_pass = 'password';

my $DSN = "driver={SQL Server};server=$server_name;port=$server_port;database=$database_name"; 

my $dbh = DBI->connect("DBI:ODBC:$DSN", $database_user, $database_pass)
  || die "Couldn't open database: $DBI::errstr\n";

还要注意,我已经将用于创建
$DSN
变量的引号字符从单引号更改为双引号。变量没有在符号引号中展开,因此您没有在DSN中获得
$server\u name
等的值。

更好的连接方式是使用DBD::Sybase模块。名称并不表示它,但SQL Server继承自Sybase。这样可以避免ODBC

仍在获取无效的字符串属性。DSN字符串中是否有文字换行符和+是您的真实代码,还是这只是一些奇怪的复制和粘贴错误?您收到的确切错误消息是什么?失败:[Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server不存在或访问被拒绝。[Microsoft][ODBC SQL Server驱动程序][DBNETLIB]连接打开(Connect())。(SQL-01000)[状态为01000现在为01S00][Microsoft][ODBC SQL Server驱动程序]perl.pl第16行的连接字符串属性(SQL-01S00)无效。无法打开数据库+:[Microsoft][ODBC SQL Server驱动程序][DBNETLIB]SQL Server不存在或访问被拒绝。(SQL-08001)[状态是08001现在是01000]应该放在帖子中的无效连接字符串属性(SQL-01S00),而不是注释,因此它有可能可读。在将DSN字符串传递到
DBI->connect()
时,还应包含该字符串的值。
my $server_name = '00.120.124.1'; # But this needs to be corrected
my $server_port = 3181;

my $database_name = 'abcd';
my $database_user = 'kkkk';
my $database_pass = 'password';

my $DSN = "driver={SQL Server};server=$server_name;port=$server_port;database=$database_name"; 

my $dbh = DBI->connect("DBI:ODBC:$DSN", $database_user, $database_pass)
  || die "Couldn't open database: $DBI::errstr\n";