一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫(kù)技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫(kù) - Sql Server - freetds簡(jiǎn)介、安裝、配置及使用介紹

freetds簡(jiǎn)介、安裝、配置及使用介紹

2020-04-03 16:08hebedich Sql Server

簡(jiǎn)單的說(shuō)FreeTDS是一個(gè)程序庫(kù),可以實(shí)現(xiàn)在Linux系統(tǒng)下訪問微軟的SQL數(shù)據(jù)庫(kù)! FreeTDS是一個(gè)讓SYBASE和Microsofte數(shù)據(jù)庫(kù)客戶端和其數(shù)據(jù)庫(kù)服務(wù)通信的工具,其能夠完成例如DB-Lib,CT-Lib,ODBC,JDBC和Perl DBI的工作。

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

FreeTDS的安裝
1.下載freetds

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

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

4.make & make install

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

FreeTDS測(cè)試:
FreeTDS安裝好了,接下來(lái)就可以查看下FreeTDS狀態(tài)了;

運(yùn)行./tsql  -C ,在安裝目錄的bin目錄下可以找到tsql ,查看終端打印出來(lái)信息,這個(gè)-with-tdsver=7.1:

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

 FreeTDS的配置
  freeTDS 的配置文件,F(xiàn)reeTDS也支持一個(gè)舊的配置文件interfaces,但請(qǐng)使用freetds.conf 除非你的環(huán)境必須使用interfaces。FreeTDS首先找freetds.conf文件如果沒有找到才去找 interfaces文件。 freetds.conf文件默認(rèn)在/usr/local/freetds/etc目錄下,但是可以在configure時(shí)配置 sysconfdir選項(xiàng),這個(gè)選項(xiàng)就是freetds.conf文件所存在的目錄。freetds.conf配置文件分為兩部分:一是[global]部分,另外一個(gè)是[dataserver]部分,其中 [dataserver]對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù)。在golbal中的設(shè)置是對(duì)全部數(shù)據(jù)庫(kù)起作用的,但在dataserver 部分的設(shè)置只對(duì)自己的數(shù)據(jù)庫(kù)起作用,并且可以覆蓋全局的設(shè)置。

例如: 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

  這個(gè)文件中g(shù)lobal設(shè)置所有數(shù)據(jù)庫(kù)使用tds版本為4.2,但在myserver2中使用的版本卻是5.0, 如果myserver2中沒有這一項(xiàng),那就是用4.2版本的如myserver。

其配置項(xiàng)解釋如下:

ltds version       : 指明tds協(xié)議的版本,連接數(shù)據(jù)庫(kù)時(shí)使用,如果在環(huán)境變量中沒有設(shè)置 此項(xiàng),則由此配置決定,協(xié)議版本可取4.2,5.0,7.0,8.0。

lhost                 : 數(shù)據(jù)庫(kù)服務(wù)器的主機(jī)名或者ip地址。

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

linitial block size : 此值只能取512的倍數(shù),默認(rèn)為512,指定了協(xié)議塊的最大值, 一般不要改變此默認(rèn) 配置。

ldump file          : 任何有效的文件名,指明了轉(zhuǎn)儲(chǔ)文件的路徑并且會(huì)打開日志記錄。

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

ltimeout            :設(shè)置處理的最大等待時(shí)間。

lconnect timeout: 設(shè)置連接的最大等待時(shí)間。

lemulate little endian: yes或者no,是否強(qiáng)制大端機(jī)使用小端方式與MS Server通信。

lclient charset   : 任何有效的iconv字符集。默認(rèn)值為ISO-8859-1,使FreeTDS使用 iconv在數(shù)據(jù)庫(kù)服務(wù)器和用戶程序之間轉(zhuǎn)換。

FreeTDS函數(shù)
1. Dbcmd和dbfcmd

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

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

功      能:該函數(shù)主要是構(gòu)造sql語(yǔ)句,一個(gè)是帶參數(shù)的,一個(gè)不帶參數(shù)。

2. Dbsqlexec

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

功      能:該函數(shù)負(fù)責(zé)執(zhí)行你所構(gòu)造的sql語(yǔ)句。

3. Dbresults

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

功      能:得到sql語(yǔ)句的執(zhí)行結(jié)果。返回值如果為NO_MORE_RESULTS=0,表明sql查詢?yōu)榭罩担ň褪菦]有一條滿足條件的結(jié)果),如果為(FAIL)=-1,表明查詢出錯(cuò),如果為(SUCCESS)=1,表明有結(jié)果且不為空。

4. DBROWS(全大寫)

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

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

5. Dbbind

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

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

6.    Dbnextrow

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

功      能:該函數(shù)將取出滿足sql語(yǔ)句的每一行,返回值為0,代表處理結(jié)束,返回值為-1出錯(cuò)。

7.  Dbcancel

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

功      能:清空上次查詢得到的數(shù)據(jù)集,如果是一個(gè)句柄的話,每次重新執(zhí)行select語(yǔ)句之前都要調(diào)用它清空結(jié)果,不然數(shù)據(jù)庫(kù)會(huì)報(bào)錯(cuò)的。

8. Dbclose

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

功      能:關(guān)閉句柄。當(dāng)不再使用時(shí)必須關(guān)閉句柄。

9.  Dbinit

函數(shù)原形:Dbinit()

功      能:初識(shí)化數(shù)據(jù)庫(kù)連接。返回值為-1出錯(cuò)。

10. Dblogin

函數(shù)原形:LOGINREC       *Dblogin();

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

             DBSETLPWD(login,SOFTPASS);//set password

功     能:根據(jù)用戶名和密碼連接數(shù)據(jù)庫(kù)。

11.Dbcount

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

功      能:該函數(shù)將得到sql結(jié)果集被處理的行數(shù),可以用它來(lái)判斷你的select語(yǔ)句是否得到正確的處理。

12.Dbopen

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

功      能:返回一個(gè)操作數(shù)據(jù)庫(kù)的句柄。

另外再介紹兩個(gè)關(guān)于數(shù)據(jù)庫(kù)的出錯(cuò)信息的函數(shù):

dberrhandle(int *err);

dbmsghandle(int* err);

實(shí)例代碼

#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數(shù)據(jù)庫(kù)服務(wù)器IP
#define SQLDBPORT " " //SQL數(shù)據(jù)庫(kù)服務(wù)器端口
#define SQLDBNAME " " //SQL數(shù)據(jù)庫(kù)服務(wù)器數(shù)據(jù)庫(kù)名
#define SQLDBUSER " " //SQL數(shù)據(jù)庫(kù)服務(wù)器數(shù)據(jù)庫(kù)用戶名
#define SQLDBPASSWD " " //SQL數(shù)據(jù)庫(kù)服務(wù)器用戶密碼
#define SQLDBSERVER SQLDBIP":"SQLDBPORT
#define DBSQLCMD "select * from yancao"
int main(int argc, char *argv[])
{
    int i, ch;
    LOGINREC *login; //描述客戶端的結(jié)構(gòu)體,在連接時(shí)被傳遞到服務(wù)器.
    DBPROCESS *dbproc; //描述連接的結(jié)構(gòu)體,被dbopen()函數(shù)返回
    RETCODE erc; //庫(kù)函數(shù)中最普遍的返回類型.
/*************************************************************/
//在開始調(diào)用本庫(kù)函數(shù)前常常要先調(diào)用dbinit()函數(shù)
    if (dbinit() == FAIL) {
        fprintf(stderr, "%s:%d: dbinit() failed\n",argv[0], __LINE__);
        exit(1);
     }
//dblogin()函數(shù)申請(qǐng) LOGINREC 結(jié)構(gòu)體,此結(jié)構(gòu)體被傳遞給dbopen()函數(shù),用來(lái)創(chuàng)建一個(gè)連接。
//雖然基本上不會(huì)調(diào)用失敗,但是檢查它!.
    if ((login = dblogin()) == NULL) {
        fprintf(stderr, "%s:%d: unable to allocate login structure\n",argv[0],__LINE__);
        exit(1);
    }
//LOGINREC結(jié)構(gòu)體不能被直接訪問,要通過以下宏設(shè)置,下面設(shè)置兩個(gè)必不可少的域
    DBSETLUSER(login, SQLDBUSER);
    DBSETLPWD(login, SQLDBPASSWD);
/*************************************************************/
//dbopen()與服務(wù)器建立一個(gè)連接. 傳遞 LOGINREC 指針和服務(wù)器名字
     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);
    }
// 可以調(diào)用dbuser()函數(shù)選擇我們使用的數(shù)據(jù)庫(kù)名,可以省略,省略后使用用戶默認(rèn)數(shù)據(jù)庫(kù).
     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語(yǔ)句填充到命令緩沖區(qū)
     printf("\n");
    if ((erc = dbsqlexec(dbproc)) == FAIL) {
        fprintf(stderr, "%s:%d: dbsqlexec() failed\n", argv[0], __LINE__);
        exit(1); //等待服務(wù)器執(zhí)行SQL語(yǔ)句,等待時(shí)間取決于查詢的復(fù)雜度。
    }
/*************************************************************/
//在調(diào)用dbsqlexec()、dbsqlok()、dbrpcsend()返回成功之后調(diào)用dbresults()函數(shù)
    printf("then fetch results:\n");
    int count = 0;
    while ((erc = dbresults(dbproc)) != NO_MORE_RESULTS) {
        struct col { //保存列的所有信息
        char *name; //列名字
        char *buffer; //存放列數(shù)據(jù)指針
        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);//返回執(zhí)行結(jié)果的列數(shù)目
    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");
/* 打印數(shù)據(jù) */
    while ((row_code = dbnextrow(dbproc)) != NO_MORE_ROWS) {//讀取行數(shù)據(jù)
    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語(yǔ)句影響的行數(shù) */
fprintf(stderr, "%d rows affected\n", DBCOUNT(dbproc))
}
dbclose(dbproc);
dbexit();
}   

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久久久久久久女黄 | 操碰97| 99亚洲自拍 | 男人网站视频 | 久久精品一区二区三区资源网 | 国产精品亚洲精品观看不卡 | 精品精品国产自在久久高清 | 日本午夜vr影院新入口 | 国产短视频精品一区二区三区 | 亚洲男人第一天堂 | 天天色天| 男人都懂www深夜免费网站 | 国产综合亚洲欧美日韩一区二区 | 99国产精品免费视频 | 精品播放 | 九九九国产视频 | 亚洲社区在线观看 | 91嫩草私人成人亚洲影院 | 亚州一区二区 | 欧美日韩精 | 国产v在线在线观看羞羞答答 | 国产伦精品一区二区三区免 | 国产一区风间由美在线观看 | 精品久久综合一区二区 | 亚洲精品国产精品精 | 国产成人精品午夜免费 | 1024免费观看完整版在线播放 | 免费看男女污污完整版 | 欧美同性猛男野外gay免费 | 日本高清在线精品一区二区三区 | 成人免费播放器 | 亚洲欧洲色图 | 久久成人a毛片免费观看网站 | 国产一区二区三区久久小说 | 精品国产日韩亚洲一区在线 | 日韩一级欧美一级一级国产 | 欧美国产精品久久 | 91精品啪在线观看国产线免费 | 亚洲国产成人精品无码区99 | 国产精品99久久免费观看 | 波多野结衣178部中文字幕 |