首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

Linux 下以 FreeTDS 連接 SQL Server:從安裝到 C/C++ 開發完整指南

     編輯:關於SqlServer

Microsoft 官方未提供 Linux 原生 SQL Server 驅動 (早期版本),FreeTDS 成為開源社群事實標準。本文涵蓋 FreeTDS 0.64 版編譯安裝、配置驗證、C/C++ 兩種開發模式 (官方範例 / 直接呼叫 DB-Library API),助你在 Linux 上穩健連接 SQL Server / Sybase。

1. 編譯安裝 FreeTDS

# 下載與解壓
wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-stable.tgz
tar -zxvf freetds-stable.tgz
cd freetds-0.64

# 配置安裝路徑 (建議 /usr/local/freetds)
./configure --prefix=/usr/local/freetds
make
sudo make install

2. 連線測試 (tsql)

/usr/local/freetds/bin/tsql -H 2.2.2.2 -p 1433 -U test -P test
# 參數說明:
# -H  Server IP
# -p  Port (預設 1433)
# -U  Username
# -P  Password

成功進入 `1>` 提示符即表示網路層、驅動層、認證層全通。

3. C/C++ 開發兩條路徑

路徑 A:編譯官方範例程式 (apps 目錄)

cd /path/to/freetds-0.64/src/apps
make clean && make
# 產出可執行檔,可直接測試連線、查詢流程

路徑 B:直接連結 DB-Library 靜態庫開發 (生產專案推薦)

testSybase.c 完整範例:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sybfront.h>
#include <sybdb.h>

int main(void) {
    char szUsername[32] = "test";
    char szPassWord[32] = "test";
    char szDBName[32] = "test";
    char szServer[32] = "2.2.2.2:1433";

    // 1. 初始化 DB-Library
    dbinit();

    // 2. 建立登入記錄
    LOGINREC *loginrec = dblogin();
    DBSETLUSER(loginrec, szUsername);
    DBSETLPWD(loginrec, szPassWord);

    // 3. 開啟連線
    DBPROCESS *dbprocess = dbopen(loginrec, szServer);
    if (dbprocess == FAIL) {
        printf("Connect MSSQL SERVER fail\n");
        return 0;
    }
    printf("Connect MSSQL SERVER success\n");

    // 4. 選擇資料庫
    if (dbuse(dbprocess, szDBName) == FAIL) {
        printf("Open database fail\n");
    } else {
        printf("Open database success\n");
    }

    // 5. 送出查詢
    dbcmd(dbprocess, "SELECT ID, BeginTime, Description FROM Alarms");
    if (dbsqlexec(dbprocess) == FAIL) {
        printf("Query Alarms table error\n");
    }

    // 6. 綁定結果欄位
    DBINT result_code;
    char szID[1024], szBeginTime[1024], szDescription[1024];
    int rows = 0;
    while ((result_code = dbresults(dbprocess)) != NO_MORE_RESULTS) {
        if (result_code == SUCCEED) {
            dbbind(dbprocess, 1, CHARBIND, (DBINT)0, (BYTE*)szID);
            dbbind(dbprocess, 2, CHARBIND, (DBCHAR)0, (BYTE*)szBeginTime);
            dbbind(dbprocess, 3, CHARBIND, (DBCHAR)0, (BYTE*)szDescription);

            while (dbnextrow(dbprocess) != NO_MORE_ROWS) {
                printf("ID=%s\n", szID);
                printf("BeginTime=%s\n", szBeginTime);
                printf("Description=%s\n", szDescription);
            }
        }
    }

    // 7. 關閉連線
    dbclose(dbprocess);
    return 0;
}

編譯指令:

gcc -o testSybase testSybase.c /usr/local/freetds/lib/libsybdb.a -I/usr/local/freetds/include

4. 常見坑與解法

現象原因解決
tsql 連線成功,但 C 程式 `dbopen` 失敗freetds.conf 未設定 server 區塊、或 TDS 版本不匹配編輯 /usr/local/freetds/etc/freetds.conf,加入 `[global] tds version = 7.3` (SQL 2008+) 或 `8.0` (SQL 2012+),並定義 server 區塊
中文亂碼字元集轉換錯誤freetds.conf 設定 `client charset = UTF-8`;確認資料庫欄位排序規則支援 Unicode (如 `Chinese_PRC_CI_AS`)
大量資料查詢記憶體暴增`dbnextrow` 預設緩衝全結果集使用 `dbsetopt(dbprocess, DBBUFFER, "0")` 關閉緩衝,逐列處理
連線閒置被防火牆/Proxy 斷開TCP Keepalive 未生效啟用 OS 層 `tcp_keepalive_time`,或應用層定期發送 `SELECT 1` 心跳

5. 生產環境建議

  • 連線池: FreeTDS 本身無連線池,應用層需自行實作 (如 `libpq` 風格 pool) 或使用上層框架 (unixODBC + FreeTDS ODBC 驅動 + 應用框架連線池)。
  • 參數化查詢: DB-Library API 支援 `dbcmd` + `dbfcmd` 格式化,但無原生 PreparedStatement。建議封裝參數化介面,防止注入。
  • 監控: 開啟 FreeTDS 日誌 (`dump file` 設定) 排查疑難雜症;生產關閉以免磁碟寫滿。
  • 替代方案: SQL Server 2017+ 官方提供 Microsoft ODBC Driver for SQL Server on Linux,效能、功能完整度優於 FreeTDS,新專案優先評估官方驅動。

FreeTDS 是 Linux 連接 SQL Server 的開源基石,掌握其安裝、配置、API 呼叫細節,能在遷移、異構整合、舊系統維護等場景游刃有餘。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved