繁体   English   中英

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

[英]Connecting to SQL Server using Perl using DBI?

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

我已经尝试过Perl僧侣网站上提供的代码段。

#!/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] ConnectionOpen(Connect())。 (SQL-01000)[状态现在是01000 01S00] [Microsoft] [ODBC SQL Server驱动程序] perl.pl第16行处的连接字符串属性(SQL-01S00)无效。无法打开数据库+:[Microsoft] [ODBC SQL服务器驱动程序] [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不存在或访问被拒绝

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

 my $server_name = '00.120.124.1;3181'; 

'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_name等的值。

更好的连接方法是使用DBD :: Sybase模块。 该名称不建议使用,但SQL Server从Sybase继承。 这样就可以避免ODBC。 http://metacpan.org/pod/DBD::Sybase#Using-DBD::Sybase-with-MS-SQL

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM