linux下連接MSSQL

需要的材料

說明

連接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強烈建議:程序中使用dbinitdbexit,並且在dbexit之後不能再調用任何DB-Library相關函數!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章