背景
我正在开展一个项目,而不是从两个差异数据库中检索数据 . 其中一个数据库使用Microsoft SQL数据库引擎,另一个正在运行MySQL引擎 . 我需要一种从配置角度指定数据源名称(DSN)的简单方法,但由于DSN命名约定不一致, DBI
模块(根据我的经验)无法做到这一点 .
MySQL
请考虑以下连接:
my $dsn = "dbi:mysql:host=$host;database=$db_name";
my $dbh = DBI->connect($dsn, $user, $pass);
假设主机上存在提供的数据库名称,则此连接将成功 . 我已经多次测试过了 . 请随意自行验证 .
MS SQL
现在,我尝试使用相同的DSN连接字符串格式连接到Microsoft SQL服务器,但数据库驱动程序类型除外 .
my $dsn = "dbi:odbc:host=$host;database=$db_name";
my $dbh = DBI->connect($dsn, $user, $pass);
即使数据库存在于提供的主机上,此连接也会失败,并且错误消息如下所示:
DBI connect('host=$host;database=$db_name','$user',...) failed: (mtodbc): Fetching info: [unixODBC][Driver Manager]Connnection does not exist (SQLSTATE:08003) (CODE:0) (SEVERITY:SQLException) DBD: [dbd_db_login6/checkOutConnectionW(login)] RetCode=[-1] at perl_script.pl line X
DBI模块是 Perl
的数据库独立接口,但显然这个问题依赖于数据库..这似乎是一个糟糕的设计决策 . 我错过了什么吗?如果是这样,请提供一些理由说明为什么这种设计是以这种方式完成的 .
2 回答
在Windows中,您可以使用:
哪里:
server是mssql server的ip地址
instance是实例名称
catalog是数据库名称
在linux / unix中我建议freetds
来自DBI documentation:
Connect
$ data_source值的示例是:
驾驶员所需的参数因驾驶员而异 . DBD :: ODBC文档中的示例是
根据评论中发布的链接,似乎可以将上述内容缩短为
没有关于其他参数被接受的可能性的信息(例如,指定文件DSN或内联DSN的方法) .