使用Linux中的Perl连接到SQL Server 2012时出现问题

时间:2014-11-06 13:07:53

标签: sql-server linux perl odbc

我在Linux机器上安装了DBD::ODBC,但是当我尝试连接到SQL Server 2012时,它显示以下错误

DBI connect('Driver={SQL Server};Server=<SERVER_NAME>;Database=<DATABASE_NAME>','<USER_NAME>',...) failed: [unixODBC][Driver Manager]Data source name not found, and no default driver specified (SQL-IM002) at script.pl line 47.

我正在使用以下代码

my $dsn = "dbi:ODBC:Driver={SQL Server};Server=$host;Database=$database";
my $dbh = DBI->connect($dsn, $user, $auth, { RaiseError => 1 });

/etc/odbcinst.ini文件包含以下条目:

# Example driver definitions

# Driver from the postgresql-odbc package
# Setup from the unixODBC package
[PostgreSQL]
Description     = ODBC for PostgreSQL
Driver          = /usr/lib/psqlodbc.so
Setup           = /usr/lib/libodbcpsqlS.so
Driver64        = /usr/lib64/psqlodbc.so
Setup64         = /usr/lib64/libodbcpsqlS.so
FileUsage       = 1

# Driver from the mysql-connector-odbc package
# Setup from the unixODBC package
[MySQL]
Description     = ODBC for MySQL
Driver          = /usr/lib/libmyodbc5.so
Setup           = /usr/lib/libodbcmyS.so
Driver64        = /usr/lib64/libmyodbc5.so
Setup64         = /usr/lib64/libodbcmyS.so
FileUsage       = 1

/etc/odbc.ini文件为空。

即使我安装了DBD::ODBC模块,也没有SQL Driver的条目。我错过了什么吗?为什么/etc/odbc.ini文件为空?或者我是否必须手动输入数据?

1 个答案:

答案 0 :(得分:0)

您需要首先为MS SQL Server安装ODBC驱动程序。您可以从Microsoft,Easysoft和其他供应商处获得一个,或者您可以使用freeTDS。一旦你安装了你的驱动程序,你需要在/etc/odbcinst.ini中添加条目,就像你已经拥有的Postgres和MySQL一样,至少有:

[Some_SQL_Server_driver]
Driver = /path/to/shared/object/of/odbc/driver.so

&#34;设置&#34; keyword标识另一个可用于提供GUI设置对话框以创建DSN的共享对象,但这些对象在unix上很少可用,它只会保存您在/etc/odbc.ini文件中手动创建DSN。

您不需要创建DSN,但是如果您使用连接字符串,例如&#39; dbi:ODBC:mydsn&#39;或者&#39; dbi:ODBC:DSN = mydsn&#39; (请参阅ODBC :: ODBC了解为何这些略有不同)。如果您不想创建DSN,则可以使用DSN较少的连接,使用连接字符串,例如&#39; dbi:ODBC:DRIVER = {Some_SQL_Server_driver}; someattr = value; someattr2 = value&#39;在哪里&#34; someattr&#34;等等是您的驱动程序定义的属性,告诉它如何连接到数据库(在线查看)。

同样,您甚至不需要在/etc/odbcinst.ini中添加条目,因为您可以使用&#; dbi:ODBC:DRIVER = / path / to / driver&#39;但那不常见。

如果你安装一个新的unixODBC,你可能需要重建DBD :: ODBC - 它取决于你如何安装它,例如,通过你的包管理器或自己构建(这可能需要重建DBD :: ODBC,因为你& #39; ll有DBD :: ODBC从unixODBC使用的新头文件。如果您使用unixODBC软件包但仍想重建DBD :: ODBC,则需要确保安装unixodbc-dev软件包以及unixodbc。

unixODBC的新问题是,我相信这个版本在某个时候更改为2并且创建的符号链接有时是错误的。在/ usr / lib及其下面查找名为libodbc *的文件,并检查符号链接是否指向现有的.so文件。

当然,由于您似乎使用的是64位Perl,因此您需要64位unixODBC和ODBC驱动程序 - 它们都必须匹配。

祝你好运。

更新:我省略了重建DBD :: ODBC的原因。如果你有一个版本1 unixODBC但是内置64位,则SQLLEN类型是32位。如果您针对此进行构建,然后升级到版本2 unixODBC,则SQLLEN类型将更改为64位。如果您不重建DBD :: ODBC,您可能会遇到各种问题,例如seg故障和访问冲突。