Sql server 使用DBI和DBD抑制连接错误:ODBC SQL Server本机客户端10.0

Sql server 使用DBI和DBD抑制连接错误:ODBC SQL Server本机客户端10.0,sql-server,perl,odbc,dbi,dbd,Sql Server,Perl,Odbc,Dbi,Dbd,编写一个脚本以从表中获取SQL Server实例名称,然后尝试连接到这些实例中的每个实例以提取数据库配置信息。所有涉及的数据库实例都是某些版本的SQL Server。如果连接失败(由于密码错误、实例关闭等原因),则需要打印一条用户定义的错误消息(“无法连接到$inst,跳过”),然后继续浏览列表。抑制来自ODBC(SQL Server本机客户端10.0)的默认错误消息时遇到问题 尝试以下方式进行连接: eval { my $dbh = DBI->connect( "dbi:OD

编写一个脚本以从表中获取SQL Server实例名称,然后尝试连接到这些实例中的每个实例以提取数据库配置信息。所有涉及的数据库实例都是某些版本的SQL Server。如果连接失败(由于密码错误、实例关闭等原因),则需要打印一条用户定义的错误消息(“无法连接到$inst,跳过”),然后继续浏览列表。抑制来自ODBC(SQL Server本机客户端10.0)的默认错误消息时遇到问题

尝试以下方式进行连接:

eval {
  my $dbh = DBI->connect(
    "dbi:ODBC:Driver={SQL Server Native Client 10.0};Server=<instance_name>;Uid=<user_name>;Pwd=<password>;",
    { PrintError => 0, RaiseError => 1, AutoCommit => 1 }
  );
};
eval{
my$dbh=DBI->connect(
“dbi:ODBC:Driver={SQL Server本机客户端10.0};Server=;Uid=;Pwd=;”,
{PrintError=>0,RaiseError=>1,自动提交=>1}
);
};
我(可能不正确)的理解是,PrintError=>0应该抑制错误消息,如果connect方法失败,RaiseError=>1将导致DBI死亡,此时我可以检查$@是否存在错误并打印用户定义的消息。我也看过HandleError属性,但没有任何成功

这是一个完全不现实的场景,还是我正在使用的ODBC驱动程序的结果

根据bohica的建议,工作代码如下所示:

eval {
  my $dbh = DBI->connect(
    "dbi:ODBC:Driver={SQL Server Native Client 10.0};Server=<instance_name>;",
    "Username",
    "Password",
    { PrintError => 0, RaiseError => 1, AutoCommit => 1 }
  );
};
eval{
my$dbh=DBI->connect(
“dbi:ODBC:Driver={SQL Server本机客户端10.0};Server=;”,
“用户名”,
“密码”,
{PrintError=>0,RaiseError=>1,自动提交=>1}
);
};

用户名和密码已从连接字符串中移出,并作为单独的参数传递给DBI connect方法。

connect
是一种类方法;用
DBI->connect
调用它,它返回一个db句柄(
$dbh
);您使用
DBI->connect
调用它,它返回一个db句柄(
$dbh

假设您解决了Pedro当时提到的问题,PrintError=>0会抑制错误,您可能还需要查看PrintWarn。如果连接失败,RaiseError=>1将导致连接失效,在您的示例中,错误将出现在$@。

假设您解决了Pedro提到的问题,PrintError=>0将抑制错误,您可能还需要查看PrintWarn。如果连接失败,RaiseError=>1将导致连接失效,在您的示例中,错误将出现在$@。

对,这在我的代码中是正确的,但在文章中不是。谢谢对,这在我的代码中是正确的,但在帖子中不是。谢谢谢谢,PrintError设置为0。同时将PrintWarn设置为0,不进行更改。RaiseError设置为1,但是当连接失败并且我在eval块之外检查$@时,它是未定义的;我的$dbh;eval{$dbh=DBI->connect(“DBI:ODBC:baugi”、“sa”、“错误密码”{PrintError=>0,PrintWarn=>0,RaiseError=>1});};打印“错误为$@\n”;'错误是DBI连接('baugi','sa',…)失败:[unixODBC][Easysoft][SQL Server驱动程序][SQL Server]用户'sa]登录失败。(SQL-28000)在-e第1行,PrintError设置为0。同时将PrintWarn设置为0,不进行更改。RaiseError设置为1,但是当连接失败并且我在eval块之外检查$@时,它是未定义的;我的$dbh;eval{$dbh=DBI->connect(“DBI:ODBC:baugi”、“sa”、“错误密码”{PrintError=>0,PrintWarn=>0,RaiseError=>1});};打印“错误为$@\n”;'错误是DBI连接('baugi','sa',…)失败:[unixODBC][Easysoft][SQL Server驱动程序][SQL Server]用户'sa]登录失败。(SQL-28000)在-e行1中,示例中缺少用户名/密码参数,因此DBI属性的hashref将被视为用户名。在连接字符串中添加UID/PWD并不意味着可以忽略DBI的第2个和第3个参数。进行此更改会产生预期的结果,错误消息将被抑制。示例中缺少用户名/密码参数,因此DBI属性的hashref将被视为用户名。将UID/PWD放在连接字符串中并不意味着可以忽略DBI的第2个和第3个参数。进行此更改会产生预期的结果,错误消息将被抑制。