
微軟未提供 Linux 原生 SQL Server 驅動,但 SQL Server 源於 Sybase,採用 TDS 協議。開源項目 FreeTDS 實現了 TDS 協議,成為 Linux/Unix 連接 SQL Server 的事實標準方案。
wget https://ibiblio.org/pub/Linux/ALPHA/freetds/stable/freetds-stable.tgz
# 當前穩定版 0.82+
tar zxvf freetds-stable.tgz
cd freetds-*
./configure --prefix=/usr/local/freetds \
--with-tdsver=8.0 \ # TDS 8.0 對應 SQL Server 2000/2005
--enable-msdblib # 啟用 MS SQL Library 兼容模式
make && make install
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/freetds/lib/
# 建議寫入 /etc/ld.so.conf.d/freetds.conf 並執行 ldconfig 永久生效
核心邏輯基於 sybfront.h、sybdb.h(FreeTDS 提供的 DB-Library API):
dbinit() → dblogin() 獲取 LOGINREC → 設置用戶/密碼/字符集 → dbopen() 連接 → dbuse() 選庫。dbcmd() 填充命令 → dbsqlexec() 發送 → dbresults() 循環處理結果集。dbcolname/type/len 獲取元數據 → dbbind() 綁定緩衝區 → dbnextrow() 逐行提取。free() 列緩衝區 → dbclose() 關閉連接。while ((result_code = dbresults(dbproc)) != NO_MORE_RESULTS) {
if (result_code == SUCCEED) {
nCols = dbnumcols(dbproc);
columns = (Column*)calloc(nCols, sizeof(Column));
for (pCol = columns; pCol - columns < nCols; pCol++) {
int colNo = pCol - columns + 1;
pCol->colName = dbcolname(dbproc, colNo);
pCol->colType = dbcoltype(dbproc, colNo);
pCol->colSize = dbcollen(dbproc, colNo);
if (SYBCHAR != pCol->colType)
pCol->colSize = dbwillconvert(pCol->colType, SYBCHAR);
pCol->colBuffer = (char*)calloc(1, pCol->colSize + 1);
dbbind(dbproc, colNo, STRINGBIND, pCol->colSize+1, (BYTE*)pCol->colBuffer);
dbnullbind(dbproc, colNo, &pCol->colStatus);
}
while ((rowNo = dbnextrow(dbproc)) != NO_MORE_ROWS) {
// 提取行數據至 vector>
}
// 釋放列內存
}
}
| 問題 | 解決方案 |
|---|---|
| 中文亂碼 | 設置 DBSETLCHARSET(login, "UTF-8");確保數據庫列為 NVARCHAR |
| 連接超時 | 調整 freetds.conf 中 timeout 參數;檢查防火牆 1433 端口 |
| 大數據量性能 | 使用 DBSETLNATLANG 設置語言;考慮改用 ODBC (unixODBC + FreeTDS) 獲取更好連接池支持 |
| 並發安全 | 封裝類加鎖或使用連接池(如 sqlrelay) |
g++ -I/usr/local/freetds/include -L/usr/local/freetds/lib \
-o app main.cpp SybaseManager.cpp -lsybdb
FreeTDS + DB-Library 是 Linux 連接 SQL Server 的經典方案。掌握其安裝配置、API 流程、字符集處理與資源管理,即可構建穩健的跨平台數據庫應用。新項目建議評估 Microsoft ODBC Driver for Linux 或 unixODBC + FreeTDS 獲得更現代的 API 體驗。