2014-11-06 67 views
0
SQL Server 2012的

我有一臺Linux機器上安裝DBD::ODBC,但是當我嘗試連接到SQL Server 2012中它顯示我使用下面的代碼問題,同時連接到使用Perl從Linux的

以下錯誤

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文件是空的?還是必須手動輸入數據?

+0

你是什麼意思*「沒有SQL Driver的條目」*?你在哪裏尋找這樣的入口? – Borodin 2014-11-06 13:32:54

+2

首先讓你的odbc連接工作,然後擔心事情的Perl方面。 FreeTDS'tsql'和UnixODBC'isql'工具可以幫助解決這個問題。 – 2014-11-06 14:05:44

+0

@Borodin:我認爲在.ini文件中應該有像[PostgreSQL]和[MySQL]這樣的SQL Server驅動程序的入門.....如果我錯了,請更正我的錯誤.... – spn 2014-11-07 04:07:03

回答

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 

「設置」關鍵字標識另一個共享對象可用於提供GUI設置對話框來創建DSN,但這些對話在UNIX上很少可用,它只會節省您在/etc/odbc.ini文件中手動創建DSN。

您不需要創建DSN,但是如果您使用連接字符串,如'dbi:ODBC:mydsn'或'dbi:ODBC:DSN = mydsn'(請參閱ODBC :: ODBC, )。如果你不想創建一個DSN,你可以使用連接字符串,如'dbi:ODBC:DRIVER = {Some_SQL_Server_driver}; someattr = value; someattr2 = value',其中「someattr」等屬性定義通過驅動程序告訴它如何連接到數據庫(在線查看)。

同樣,您甚至不需要爲/etc/odbcinst.ini添加條目,因爲您可以使用'dbi:ODBC:DRIVER =/path/to/driver',但這種情況並不常見。

如果你安裝了一個新的unixODBC,你可能需要重建DBD :: ODBC - 它取決於你如何安裝它,例如通過你的軟件包管理器或自己構建(這可能需要重建DBD :: ODBC作爲您將擁有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故障和訪問衝突等各種問題。