perl how to connect mssql with DBI DBD::ODBC FreeTDS unixODBC

安裝YAML

#cpan>install YAML

安裝DBI

#cpan>install DBI

安裝unixODBC(Free ODBC Driver Manager, Drivers & Tools.)

#sudo apt-get install unixODBC unixODBC-dev

安裝DBD::ODBC

#cpan>install DBD::ODBC

安裝DataBase Driver FreeTDS

#sudo apt-get install freetds-bin freetds-dev tdsodbc

檢查 tsql Compile-time settings

#tsql -C

Compile-time settings (established with the "configure" script)
                            Version: freetds v0.82
             freetds.conf directory: /etc/freetds
     MS db-lib source compatibility: no
        Sybase binary compatibility: yes
                      Thread safety: yes
                      iconv library: yes
                        TDS version: 4.2
                              iODBC: no
                           unixodbc: yes

freetds.conf上設定DSN

#vim /etc/freetds/freetds.conf

//在設定檔最下方加上兩條DSN設定,如此使用tsql就可以用DSN來連線「tsql -S ERP -U sa -P password」

[ERP]
        host = 192.168.128.253
        port = 1433
        tds version = 8.0

[SQL2008X64]
        host = 192.168.128.219
        port = 1433
        tds version = 8.0

測試MSsql連線

#sudo tsql -S 192.168.128.253 -U sa -P password

1>

如果出現上面的符號就表示已經可以連上MSsql DataBase了

查詢資料時中文無法正常顯示的設定方法

#sudo vim /etc/freetds/freetds.conf

[global]
  # TDS protocol version
  tds version = 8.0
  client charset = UTF-8

正確設定好 TDS version似乎就能正常顯示中文了,client charset有沒有設定好像沒有影響。

如何設定正確的 tds version 可以參考 「History of TDS Version」。

也可以在命令列模式下直接指定 TDSVER=X.X 的版本為何。例如:

TDSVER=7.0 tsql -H 192.168.1.100 -p 1433 -U sa

unixODBC設定/etc/odbcinst.ini、/etc/odbc.ini

建立tds.driver.template、tds.datasource.template模板

#cd ~

#vim tds.driver.template

[FreeTDS]
Description     = FreeTDS driver
Driver          = /usr/lib/odbc/libtdsodbc.so
Setup           = /usr/lib/odbc/libtdsS.so
tds version     = 8.0

#vim tds.datasource.template

[ERP]
Description         = ERP Connection
Driver              = FreeTDS
Trace               = Yes
TraceFile           = /tmp/odbc.log
Database            = A01B
Servername          = ERP

[SQL2008X64]
TDS_Version         = 8.0
Description         = SQL2008X64 Connection
Driver              = FreeTDS
Trace               = Yes
TraceFile           = /tmp/odbc.log
Server              = 192.168.128.219
Port                = 1433
Socket              =

#sudo odbcinst -i -d -f tds.driver.template
將freetds driver加入unixODBC管理,可以在/etc/odbcinst.ini看到剛在tds.driver.template上的設定。

#sudo odbcinst -i -s -l -f tds.datasource.template
將寫在tds.datasource.template上的DSN,記錄於/etc/odbc.ini上。

模板格式設定,可由man odbcinst查詢得知(說明的最下面部份)。

注意事項

出處:在Linux上配置unixODBC和FreeTDS访问MS SQL Server

unixODBC 通過freeTDS 訪問MS SQL Server 有兩種配置方式

其一是將服務器信息寫在freeTDS的配置文件/etc/freetds/freetds.conf  中, /etc/odbc.ini 中使用Servername 來指向freetds.conf中設定的DSN。如上例中的 [ERP]

另一種方式是將服務器信息也一併寫在/etc/odbc.ini 中。如上例中的[SQL2008X64]

注意,關鍵字有所不同。 例如, freetds.conf 中的tds version 在/etc/odbc.ini 中為TDS_Version。

方式(2)相對簡單,但只有少數幾個關鍵字可以控制freetds,至於freetds的其它特徵則使用freetds的預設值。

方式(1)雖然複雜一些,但對freetds可進行更細緻的控制,例如可指定客戶端的字符集。

在透過isql DSN UID PASSWD 模擬perl運行的結果,不意外的話中文顯示應該是正常的。

perl 執行MSsql資料庫查詢

#vim test_connect.pl

use strict;
use DBI;
my $dbh = DBI->connect("dbi:ODBC:ERP","sa","password")
                 or die "$DBI::errstr\n";
my $statement =<<end;
        select MV001,NAME,MV002,MV003,MV098,NEXTTIME_CHANGEPASSWD from YCMSMV
        where NEXTTIME_CHANGEPASSWD < '20110725' and MV001 not like '9%';
end

my $emps = $dbh->selectall_arrayref($statement,{ Slice => {} });
foreach my $emp ( @$emps ) {
    print "Employee: $emp->{NAME}\n";
}

my $rc = $dbh->disconnect  or warn $dbh->errstr;

#perl test_connect.pl

Employee: 陳X仁
Employee: 陳X旭
Employee: 方X治
Employee: 大X徹也
Employee: 澤X正志
Employee: 黃X菁
Employee: 小X康雄
Employee: 鄭X村
Employee: 林X龍

One thought on “perl how to connect mssql with DBI DBD::ODBC FreeTDS unixODBC

  1. 通告: perl查詢到期帳號並發送電子郵件通知 | jerry-yang work's logs

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s