亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

freetds簡介、安裝、配置及使用介紹

2024-08-31 01:02:18
字體:
來源:轉載
供稿:網友
簡單的說FreeTDS是一個程序庫,可以實現在Linux系統下訪問微軟的SQL數據庫! FreeTDS是一個讓SYBASE和Microsofte數據庫客戶端和其數據庫服務通信的工具,其能夠完成例如DB-Lib,CT-Lib,ODBC,JDBC和Perl DBI的工作。
 
 

什么是FreeTDS 
  簡單的說FreeTDS是一個程序庫,可以實現在Linux系統下訪問微軟的SQL數據庫! FreeTDS 是一個開源(如果你喜歡可以稱為自由)的程序庫,是TDS(表列數據流 )協議的再次實現。它可以被用在Sybase的db-lib或者ct-lib庫。它也包含一個ODBC的庫。允許許多開源的應用軟件比如Perl和PHP(或者你自己的c或C++程序)去連接到Sybase或 Microsoft SQL服務器。FreeTDS 以源碼的形式被發布,幾乎可以在任何操作系統上編譯。意味著Unix和類Unix系統(包括著名的分支如Interix和QNX),還有Win32,VMS,和OSX。

FreeTDS的安裝 
1.下載freetds

2.將其解壓到任意目錄,進入到解壓后的文件夾里。

3.切換到root,配置: ./configure –prefix=/usr/local/freetds –with-tdsver=8.0 –enable-msdblib 解釋:–prefix為設置FreeTDS的安裝目錄,–with-tdsver是設置TDS版本, –enable-msdblib為是否允許Microsoft數據庫函數庫

4.make & make install

5.配置環境變量:vim ~/.bashrc向此文件中加入: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/freetds/lib/

FreeTDS測試:
FreeTDS安裝好了,接下來就可以查看下FreeTDS狀態了;

運行./tsql  -C ,在安裝目錄的bin目錄下可以找到tsql ,查看終端打印出來信息,這個-with-tdsver=7.1:

關于安裝參考
http://linux.chinaunix.net/techdoc/database/2008/10/31/1042291.shtml 或者:http://www.linuxdiyf.com/viewarticle.php?id=109086

 FreeTDS的配置
  freeTDS 的配置文件,FreeTDS也支持一個舊的配置文件interfaces,但請使用freetds.conf 除非你的環境必須使用interfaces。FreeTDS首先找freetds.conf文件如果沒有找到才去找 interfaces文件。 freetds.conf文件默認在/usr/local/freetds/etc目錄下,但是可以在configure時配置 sysconfdir選項,這個選項就是freetds.conf文件所存在的目錄。freetds.conf配置文件分為兩部分:一是[global]部分,另外一個是[dataserver]部分,其中 [dataserver]對應一個數據庫。在golbal中的設置是對全部數據庫起作用的,但在dataserver 部分的設置只對自己的數據庫起作用,并且可以覆蓋全局的設置。

例如: freetds.conf文件:

[global] 
tds version = 4.2 
[myserver] 
host = ntbox.mydomain.com 
port = 1433 
[myserver2] 
host = unixbox.mydomain.com 
port = 4000 
tds version = 5.0

  這個文件中global設置所有數據庫使用tds版本為4.2,但在myserver2中使用的版本卻是5.0, 如果myserver2中沒有這一項,那就是用4.2版本的如myserver。

其配置項解釋如下:

ltds version       : 指明tds協議的版本,連接數據庫時使用,如果在環境變量中沒有設置 此項,則由此配置決定,協議版本可取4.2,5.0,7.0,8.0。

lhost                 : 數據庫服務器的主機名或者ip地址。

lport                 : 數據庫服務器的監聽端口,可以取任何有效的端口值,一般而言Sybase SQL10以前為 1433,10以上用5000,而Sybase SQLAnywhere 7是2638,Microsoft SQL server則用 1433。此配置可以被環境變量中的TDSPORT改寫。

linitial block size : 此值只能取512的倍數,默認為512,指定了協議塊的最大值, 一般不要改變此默認 配置。

ldump file          : 任何有效的文件名,指明了轉儲文件的路徑并且會打開日志記錄。

ldump file append: yes或者no,決定是否追加保存到dump file文件中。

ltimeout            :設置處理的最大等待時間。

lconnect timeout: 設置連接的最大等待時間。

lemulate little endian: yes或者no,是否強制大端機使用小端方式與MS Server通信。

lclient charset   : 任何有效的iconv字符集。默認值為ISO-8859-1,使FreeTDS使用 iconv在數據庫服務器和用戶程序之間轉換。

FreeTDS函數 
1. Dbcmd和dbfcmd

函數原形: Dbcmd(DBPROCESS *proc,char * sql);

        Dbcmd(DBPROCESS *proc, char * format,char *args);

功      能:該函數主要是構造sql語句,一個是帶參數的,一個不帶參數。

2. Dbsqlexec

函數原形:Dbsqlexec(DBPROCESS *proc);

功      能:該函數負責執行你所構造的sql語句。

3. Dbresults

函數原形:Dbrerults(DBPROCESS *proc);

功      能:得到sql語句的執行結果。返回值如果為NO_MORE_RESULTS=0,表明sql查詢為空值(就是沒有一條滿足條件的結果),如果為(FAIL)=-1,表明查詢出錯,如果為(SUCCESS)=1,表明有結果且不為空。

4. DBROWS(全大寫)

函數原形:DBROWS(DBPROCESS *proc);

功      能:取出一行記錄的信息。

5. Dbbind

函數原形:Dbbind(DBPROCESS *proc,int colmn,

功      能:將sql查詢出來的結果綁定到一個變量。第一個參數為從數據庫那里拿的句柄,第二個參數是對應你的select語句中查詢需要的字段(注:必須是按照select順序綁定的,例如select user,password from hist1 ,如果值為1,就是綁定的user),第三個參數是綁定字段的類型,最后一個參數是綁定的變量。

6.    Dbnextrow

函數原形:Dbnextrow(DBPROCESS *proc);

功      能:該函數將取出滿足sql語句的每一行,返回值為0,代表處理結束,返回值為-1出錯。

7.  Dbcancel

函數原形:Dbcancel(DBPROCESS *proc);

功      能:清空上次查詢得到的數據集,如果是一個句柄的話,每次重新執行select語句之前都要調用它清空結果,不然數據庫會報錯的。

8. Dbclose

函數原形:Dbclose(DBPROCESS *proc);

功      能:關閉句柄。當不再使用時必須關閉句柄。

9.  Dbinit

函數原形:Dbinit()

功      能:初識化數據庫連接。返回值為-1出錯。

10. Dblogin

函數原形:LOGINREC       *Dblogin();

             DBSETLUSER(login,SOFT);  //set the database user 

             DBSETLPWD(login,SOFTPASS);//set password

功     能:根據用戶名和密碼連接數據庫。

11.Dbcount

函數原形:Dbcount(DBPROCESS *proc);

功      能:該函數將得到sql結果集被處理的行數,可以用它來判斷你的select語句是否得到正確的處理。

12.Dbopen

函數原形:DBPROCESS * Dbopen(LOGINREC     *login,NULL);

功      能:返回一個操作數據庫的句柄。

另外再介紹兩個關于數據庫的出錯信息的函數:

dberrhandle(int *err);

dbmsghandle(int* err);

實例代碼

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sqlfront.h> /* sqlfront.h always comes first */
#include <sybdb.h> /* sybdb.h is the only other file you need */
#define SQLDBIP " " //SQL數據庫服務器IP
#define SQLDBPORT " " //SQL數據庫服務器端口
#define SQLDBNAME " " //SQL數據庫服務器數據庫名
#define SQLDBUSER " " //SQL數據庫服務器數據庫用戶名
#define SQLDBPASSWD " " //SQL數據庫服務器用戶密碼
#define SQLDBSERVER SQLDBIP":"SQLDBPORT
#define DBSQLCMD "select * from yancao"
int main(int argc, char *argv[])
{
    int i, ch;
    LOGINREC *login; //描述客戶端的結構體,在連接時被傳遞到服務器.
    DBPROCESS *dbproc; //描述連接的結構體,被dbopen()函數返回
    RETCODE erc; //庫函數中最普遍的返回類型.
/*************************************************************/
//在開始調用本庫函數前常常要先調用dbinit()函數
    if (dbinit() == FAIL) {
        fprintf(stderr, "%s:%d: dbinit() failed/n",argv[0], __LINE__);
        exit(1);
     }
//dblogin()函數申請 LOGINREC 結構體,此結構體被傳遞給dbopen()函數,用來創建一個連接。
//雖然基本上不會調用失敗,但是檢查它!.
    if ((login = dblogin()) == NULL) {
        fprintf(stderr, "%s:%d: unable to allocate login structure/n",argv[0],__LINE__);
        exit(1);
    }
//LOGINREC結構體不能被直接訪問,要通過以下宏設置,下面設置兩個必不可少的域
    DBSETLUSER(login, SQLDBUSER);
    DBSETLPWD(login, SQLDBPASSWD); 
/*************************************************************/
//dbopen()與服務器建立一個連接. 傳遞 LOGINREC 指針和服務器名字
     if ((dbproc = dbopen(login, SQLDBSERVER)) == NULL) {
        fprintf(stderr, "%s:%d: unable to connect to %s as %s/n",
 argv[0], __LINE__,
        SQLDBSERVER, SQLDBUSER);
        exit(1);
    }
// 可以調用dbuser()函數選擇我們使用的數據庫名,可以省略,省略后使用用戶默認數據庫.
     if (SQLDBNAME && (erc = dbuse(dbproc, SQLDBNAME)) == FAIL) {
        fprintf(stderr, "%s:%d: unable to use to database %s/n",
argv[0], __LINE__, SQLDBNAME);
         exit(1);
     }
/*************************************************************/
    dbcmd(dbproc, DBSQLCMD);//將SQL語句填充到命令緩沖區
     printf("/n");
    if ((erc = dbsqlexec(dbproc)) == FAIL) {
        fprintf(stderr, "%s:%d: dbsqlexec() failed/n", argv[0], __LINE__);
        exit(1); //等待服務器執行SQL語句,等待時間取決于查詢的復雜度。
    }
/*************************************************************/
//在調用dbsqlexec()、dbsqlok()、dbrpcsend()返回成功之后調用dbresults()函數
    printf("then fetch results:/n");
    int count = 0;
    while ((erc = dbresults(dbproc)) != NO_MORE_RESULTS) {
        struct col { //保存列的所有信息
        char *name; //列名字
        char *buffer; //存放列數據指針
        int type, size, status;
    } *columns, *pcol;
    int ncols;
    int row_code; 
    if (erc == FAIL) {
        fprintf(stderr, "%s:%d: dbresults failed/n",
argv[0], __LINE__);
        exit(1);
     } 
    ncols = dbnumcols(dbproc);//返回執行結果的列數目 
    if ((columns = calloc(ncols, sizeof(struct col))) == NULL) {
        perror(NULL);
        exit(1);
     }
 /* read metadata and bind. */
    for (pcol = columns; pcol - columns < ncols; pcol++) {
        int c = pcol - columns + 1;
         pcol->name = dbcolname(dbproc, c); //返回指定列的列名
        pcol->type = dbcoltype(dbproc, c);
        pcol->size = dbcollen(dbproc, c); 
         printf("%*s(%d)", 20, pcol->name, pcol->size);
        if ((pcol->buffer = calloc(1, 20)) == NULL) {
        perror(NULL);
         exit(1);
    }
    erc = dbbind(dbproc, c, NTBSTRINGBIND, 20, (BYTE*)pcol->buffer);
    if (erc == FAIL) {
        fprintf(stderr, "%s:%d: dbbind(%d) failed/n",
argv[0], __LINE__, c);
        exit(1);
    }
    erc = dbnullbind(dbproc, c, &pcol->status); //(5)
     if (erc == FAIL) {
        fprintf(stderr, "%s:%d: dbnullbind(%d) failed/n",
argv[0], __LINE__, c);
        exit(1);
    }
 }
    printf("/n");
/* 打印數據 */
    while ((row_code = dbnextrow(dbproc)) != NO_MORE_ROWS) {//讀取行數據
    switch (row_code) {
    case REG_ROW:
     for (pcol=columns; pcol - columns < ncols; pcol++) {
    char *buffer = pcol->status == -1?
"null" : pcol->buffer;
    printf("%*s ", 20, buffer);
    }
    printf("/n"); break;
    case BUF_FULL: break;
    case FAIL:
     fprintf(stderr, "%s:%d: dbresults failed/n",
     argv[0], __LINE__);
exit(1); break;
 default: // (7)
 printf("data for computeid %d ignored/n", row_code);
}
 }
 /* free metadata and data buffers */
 for (pcol=columns; pcol - columns < ncols; pcol++) {
free(pcol->buffer);
}
 free(columns);
if (DBCOUNT(dbproc) > -1) /* 得到SQL語句影響的行數 */
fprintf(stderr, "%d rows affected/n", DBCOUNT(dbproc))
}
dbclose(dbproc);
dbexit();
}   


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲成avwww人| 欧美一区二粉嫩精品国产一线天| 国产91色在线播放| 国产视频福利一区| 欧美性生交xxxxxdddd| 性欧美长视频免费观看不卡| 欧美wwwxxxx| 欧美激情高清视频| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产精品久久97| 俺也去精品视频在线观看| 91久久综合亚洲鲁鲁五月天| 日韩精品免费在线视频观看| 亚洲第一黄色网| 国产69精品久久久久久| 国产精品香蕉国产| 国产欧美va欧美va香蕉在线| 日韩精品中文字幕在线播放| 欧美日韩国产中文字幕| 久热国产精品视频| 久久在线免费观看视频| 亚洲qvod图片区电影| 一区二区三区视频免费在线观看| 日韩精品视频在线免费观看| 国产精品国产三级国产aⅴ浪潮| 伊人久久久久久久久久久| 亚洲精品久久久久久久久久久久| 午夜精品久久久久久久白皮肤| 日韩美女激情视频| 亚洲精品日韩久久久| 欧美成aaa人片在线观看蜜臀| 成人免费网站在线| 亚洲人成五月天| 亚洲国产精品久久| 国产精品久久久久久久av电影| 日韩在线欧美在线| 亚洲国产成人久久综合一区| 亚洲乱码国产乱码精品精| 日韩精品免费在线视频观看| 亚洲图片在线综合| 国产成人免费av电影| 欧美大片大片在线播放| www.日韩av.com| 伊人青青综合网站| 亚洲www永久成人夜色| 国产自摸综合网| 日韩在线免费观看视频| 国产精品jizz在线观看麻豆| 中文字幕亚洲一区在线观看| 日韩电影中文字幕在线观看| 国产高清视频一区三区| 日韩av一区在线| 91av中文字幕| 中文字幕在线看视频国产欧美在线看完整| 亚洲第一精品夜夜躁人人躁| 欧美在线一级va免费观看| 欧美亚洲成人免费| 国产视频精品自拍| 国精产品一区一区三区有限在线| 欧美日本黄视频| 国产精品综合不卡av| 日韩在线视频二区| 在线播放国产精品| 另类天堂视频在线观看| 欧美大人香蕉在线| 人人爽久久涩噜噜噜网站| 亚洲精品福利免费在线观看| 精品日本高清在线播放| 69久久夜色精品国产7777| 久久久久久美女| 国产精品免费看久久久香蕉| 亚洲自拍欧美色图| 欧美日韩在线另类| 日韩中文字幕在线观看| 精品福利在线观看| 91久久国产综合久久91精品网站| 久久久精品国产| 51色欧美片视频在线观看| 日韩av免费在线观看| 欧美激情日韩图片| 91亚洲国产成人精品性色| 18一19gay欧美视频网站| 欧美日韩午夜激情| 久久精品国产成人精品| 欧美成人精品一区| 日韩精品在线观看一区| 91高潮精品免费porn| 欧美在线影院在线视频| 国产亚洲日本欧美韩国| 18一19gay欧美视频网站| 伊人男人综合视频网| 久久人人爽人人| 欧美精品激情blacked18| 欧美性猛交xxxx黑人猛交| 久久精品99无色码中文字幕| 97国产成人精品视频| 日韩av三级在线观看| 久久亚洲精品国产亚洲老地址| 亚洲伊人一本大道中文字幕| 亚洲一区二区免费在线| 亚洲国产一区二区三区在线观看| 亚洲欧美日韩一区二区在线| 日本在线精品视频| 不卡毛片在线看| 亚洲福利精品在线| 777精品视频| 欧美日韩国产成人在线| 国产福利精品av综合导导航| 91精品久久久久久久| 在线成人激情黄色| 播播国产欧美激情| 国产精品视频区1| 国产精品6699| 欧美老女人性生活| 国产精品亚洲一区二区三区| 一区二区国产精品视频| 亚洲精品乱码久久久久久按摩观| 亚洲色图日韩av| 黑人精品xxx一区一二区| 久久久久久97| 欧美日韩999| 高清欧美性猛交xxxx黑人猛交| 日韩中文有码在线视频| 亚洲第五色综合网| 久久成人这里只有精品| 亚洲精品98久久久久久中文字幕| 亚洲日韩第一页| 中文字幕国内精品| 亚洲第一精品福利| 57pao国产精品一区| 久久九九国产精品怡红院| 国产精品第七十二页| 91久久精品美女| 国产精品91在线观看| 国产一区二区丝袜高跟鞋图片| 亚洲第一区在线观看| 国产精品18久久久久久首页狼| 狠狠干狠狠久久| 国产精品igao视频| 96精品视频在线| 97在线看福利| 国产精品久久久久久久天堂| 欧美成人亚洲成人日韩成人| 大桥未久av一区二区三区| 国产精品91久久| 91黑丝在线观看| 九九精品在线观看| 国产不卡在线观看| 91精品国产色综合久久不卡98口| 久久久av电影| 在线观看日韩av| 97视频在线观看亚洲| 亚洲大胆人体av| 一区二区三区亚洲| 成人国产在线视频| 少妇av一区二区三区| 精品亚洲夜色av98在线观看| 国内成人精品视频| 日韩中文字幕网站| 亚洲国产高清福利视频| 亚州欧美日韩中文视频| 亚洲激情久久久| 久久久中文字幕| 日韩av不卡在线|