0

编写脚本从表中获取 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 连接方法。

4

2 回答 2

3

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

于 2010-11-19T09:53:19.053 回答
0

connect是一个类方法;你用 调用它DBI->connect,它返回一个数据库句柄($dbh在你的情况下)。

于 2010-11-19T06:19:06.673 回答