【发布时间】:2011-05-12 06:15:36
【问题描述】:
编写脚本以从表中获取 SQL Server 实例名称,然后尝试连接到每个实例以获取数据库配置信息。涉及的所有数据库实例都是 SQL Server 的某个版本。如果连接失败(由于密码错误、实例关闭等),目的是打印用户定义的错误消息(“无法连接到 $inst,正在跳过。”)并继续浏览列表。我无法抑制来自 ODBC (SQL Server Native Client 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 }
);
};
我(可能不正确)理解 PrintError => 0 应该抑制错误消息,如果连接方法失败,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 }
);
};
用户名和密码已从连接字符串中移出,并作为单独的参数传递给 DBI 连接方法。
【问题讨论】:
-
您的示例中缺少用户名/密码参数,因此您的 DBI 属性的 hashref 将被视为用户名。仅仅因为您将 UID/PWD 放在连接字符串中并不意味着您可以省略 DBI 的第二个和第三个参数。
-
进行此更改产生了预期的结果,错误消息被抑制。
标签: sql-server perl odbc dbi dbd