需要的材料
說明
連接MSSQL爲什麼要涉及這兩個東西呢,原來MSSQL和sybase這兩個數據庫的通訊架構是類似的,是服務器/客戶端模式;而freeTDS是一款開源的用來實現TDS(Tabular Data Stream)通訊的軟件,它實現了一些基本的訪問數據庫的接口(參照MSSQL和sybase),所以在linux下,我們可以通過freeTDS提供的接口來實現對MSSQL的訪問,而sybase在這裏的作用就是給我們提供參考,即如何調用這些函數去訪問數據庫。
注
我使用的環境是virtualbox的Ubuntu14.04的虛擬機,網路是通過橋接的方式連接到筆記本的無線網卡上,Ubuntu系統的網絡配置是通過修改/etc/network/interfaces
文件,指定靜態ip的方式來設定的:
freeTDS
freeTDS源碼獲取
https://github.com/FreeTDS/freetds,通過git或瀏覽器直接下載。
freeTDS編譯、安裝
(推薦)參考官方說明https://github.com/FreeTDS/freetds/blob/master/INSTALL.GIT.md,或網上找教程
執行./autogen.sh過程中可能會報錯,缺少某個程序,在線或離線安裝下再重新運行autogen.sh即可,否則生成不了makefile文件,無法make編譯!
freeTDS測試
假設freeTDS的安裝目錄爲:/usr/local/freetds/
,則以下目錄分別爲:
/usr/local/freetds/bin/
:一些工具(測試功能時會用到)/usr/local/freetds/etc/
:配置文件(運行工具可能會用到)/usr/local/freetds/include/
:頭文件(編寫用戶程序會用到)/usr/local/freetds/lib/
:庫文件(編寫用戶程序會用到)
我們切換到/usr/local/freetds/bin/
目錄下,可以看到有好幾個可執行文件:
我們這裏測試只用到tsql
,首先確保Ubuntu能ping通數據庫電腦(我是用自己電腦上的數據庫測試的),接下來我們執行:
如果是這樣子,說明我們沒有指定數據庫的端口,軟件也沒能自動掃描到,所以這時候需要我們通過(小p)-p port
手動指定下。
這樣子說明我們成功連接到數據庫了,進入了交互界面,其他錯誤,可以自己嘗試下。接下來我們測試sql語句查詢:
好啦,至此,說明freetds是可以正常使用了,具體的使用說明去看資料吧。
freeTDS庫使用
參考官網的UserGuide,上面有example
sybase網站
但是官網這裏對每個函數的形參和返回值的說明不是很清晰,所以這時候我們就需要參考sybase網站的函數說明啦:
很詳細有木有,所以說freeTDS是提供了一套可以在(包括但不限於)linux下訪問(包括但不限於)MSSQL、SYBASE數據庫的接口,而這些接口的命名不是獨立的,而是“兼容”數據庫官網接口的,這樣我們就只要對照着官方的教程就也可以一步一步的實現同樣功能啦,而SYBASE網站則是我們的參考。
目前已經實現的函數可以到這裏查看。
函數記錄
可以先通過這個帖子大概看一下,具體的最好還是對照官網原文看。
dbbind
RETCODE dbbind(dbproc, column, vartype, varlen,
varaddr)
/*句柄*/
DBPROCESS *dbproc;
/*綁定第幾列數據,從1開始*/
int column;
/*服務器(對應列的字段的)數據類型,如char、varchar、int等,
可以通過xxxBIND中的xxx瞭解該使用哪個,如CHARBIND對應char,VARCHARBIND對應varchar,
INTBIND對應int*/
int vartype;
/*The length of the program variable in bytes.
For values of vartype that represent a fixed-length type,
such as MONEYBIND or FLT8BIND, this length is ignored.
指明程序中變量的長度,對於可變長度類型,length是被忽略的,如MONEYBIND和FLT8BIND,
如果varlen爲0,這一列數據的總長度將被全部複製到程序變量中(對於char和binary,總長度是服務器上定義的對應列大小;對於varchar、varbinary、text、和image data,總長度是當前列的實際數據長度),因此,將varlen設爲0時,你得確保你的程序變量有足夠大的空間能確保所有數據都能被放得下!*/
DBINT varlen;
/*程序中用來存放綁定結果的變量地址,其中BYTE是unsigned char的重定義*/
BYTE *varaddr;
服務器類型nchar和nvarchar在內部轉換爲char和varchar類型,它們對應於DB-Library類型常量SYBCHAR。
字符和文本數據的可用表示如下所示。根據數據是空白填充還是以空字符結尾,它們有所不同。請注意,如果varlen爲0,則不會進行填充,並且“ \ 0”是空終止符:
如果在將整數或浮點數據轉換爲字符/文本綁定類型時發生溢出,則結果值的第一個字符將包含一個星號(“ *”)用來表示錯誤。
某些情況下,DB-Library會給出一個信息來表明數據結果轉換髮生了溢出,這可能就是指定的varlen對於服務器數據來說太小了!
一個列只能綁定到一個程序變量上,否則只有最後綁定的那個程序變量會起作用。
dbsetnull
設置對於服務器返回的null的定義。
RETCODE dbsetnull(dbproc, bindtype, bindlen, bindval)
DBPROCESS *dbproc;
int bindtype;
int bindlen;
BYTE *bindval;
對於不同服務器數據類型,對應的null的替代值
Binding type | Null substitution value |
---|---|
TINYBIND | 0 |
SMALLBIND | 0 |
INTBIND | 0 |
CHARBIND | Empty string (padded with blanks) |
STRINGBIND | Empty string (padded with blanks, null-terminated) |
NTBSTRINGBIND | Empty string (null-terminated) |
VARYCHARBIND | Empty string |
BINARYBIND | Empty array (padded with zeros) |
VARYBINBIND | Empty array |
DATETIMEBIND | 8 bytes of zeros |
SMALLDATETIMEBIND | 8 bytes of zeros |
MONEYBIND | $0.00 |
SMALLMONEYBIND | $0.00 |
FLT8BIND | 0.0 |
REALBIND | 0.0 |
DECIMALBIND | 0.0 (with default scale and precision) |
NUMERICBIND | 0.0 (with default scale and precision) |
BOUNDARYBIND | Empty string (null-terminated) |
SENSITIVITYBIND | Empty string (null-terminated) |
dbclose和dbexit
dbclose
是關閉並釋放一個指定的DBPROCESS,而dbexit
是關閉並釋放所有的DBPROCESS。
Sybase強烈建議:程序中使用dbinit
和dbexit
,並且在dbexit
之後不能再調用任何DB-Library相關函數!