在工做中須要在Linux服務器上訪問MS SQL Server數據庫,我立刻就想到了適用ODBC接口進行實現,畢竟它的移植性更好。 數據庫
首先須要選一種支持MS SQL Server的ODBC驅動,商業的不能考慮,只能考慮開源的,因而,FreeTDS進入了視野,從官網(http://www.freetds.org/)上下載了它的0.91版本的包,在安裝它以前須要安裝libiconv,這個庫用於進行編碼轉換。 服務器
開始安裝! 網站
1,從unixODBC官網(www.unixodbc.org)下載2.3.2版本 ui
./configure --enable-gui=no ; make ; sudo make install this
2,安裝libiconv,./configure ; make ; sudo make install 編碼
3,安裝freetds,./configure --with-tdsver=7.0 --with-unixodbc=/usr/local --with-libiconv-prefix=/usr/local --enable-msdblib spa
說明,with-tdsver用於指定TDS協議版本,7.0就能支持目前新版本的MS SQL Server,with-unixodbc用於指定 unixODBC的安裝路徑前綴。 .net
開始配置! 設計
在/usr/local/etc下有三個關鍵的配置文件,freetds.conf,odbcinst.ini,odbc.ini,分別先說明了三個配置文件的做用,freetds.conf是用於定義具體的驅動信息,包括數據庫地址、端口、協議版本、編碼等,odbcinst.ini用於定義ODBC驅動,odbc.ini用於定義ODBC數據源。 unix
freetds.conf中定義以下:
[FTDSMSSQLDB]
host = 192.168.0.1
port = 1433
tds version = 7.0
instance = TKVSDB
client charset = GBK ;客戶端的編碼,即你的程序中實際使用的字符編碼,freetds在提交數據時候會自動轉換爲服務器編碼
initial block size = 1024
connect timeout = 60
timeout = 60
odbcinst.ini中定義以下:
[SQLServer]
Description = v0.91 with protocol v7.0
Driver = /usr/local/lib/libtdsodbc.so
Setup = /usr/local/lib/libtds.so
UsageCount = 1
CPTimeout = 5
CPReuse = 5
FileUsage = 1
odbc.ini中定義以下:
[TESTDSN]
Driver = SQLServer
Description = MS SQL Server
Servername = FTDSMSSQLDB
Database = TOMDB ;數據庫名
顏色標註關聯。
在程序中,就能夠使用下面的鏈接串進行訪問,以下:UID=sa;PWD=12345678;DSN=TESTDSN。
在實際使用中,我採用OTL(對ODBC的訪問接口進行了封裝)的API,這樣能使代碼更加簡單一些,在引用otlv4.h頭文件前須要加入下面幾個宏,
#define OTL_ODBC_MSSQL_2008 // Compile OTL 4/ODBC, MS SQL 2005
#define OTL_FREETDS_ODBC_WORKAROUNDS // Enable the FreeTDS / ODBC workarounds for MS SQL
#define OTL_ODBC // Compile OTL 4/ODBC. Uncomment this when used with MS SQL 7.0/ 2000
#define OTL_ODBC_UNIX // Compile OTL 4 / ODBC. Uncomment this when used in Linux / Unix
#define OTL_STL // Turn on STL features
這樣,就能夠在代碼中使用otl_connect進行訪問了,簡單的實例代碼以下:
const char * dsn_string("UID=sa;PWD=12345678;DSN=TESTDSN");
otl_connect m_conn;
m_conn.rlogon(dsn_string,1);
後面就能夠進行各類數據庫操做了,詳細請參見OTL的網站http://otl.sourceforge.net/。(固然,你須要設計一個本身的鏈接池,頻繁的打開關閉鏈接是很耗時的)
但願對你們有幫助!