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

首頁 > 開發 > 綜合 > 正文

freetds相關

2024-07-21 02:49:32
字體:
來源:轉載
供稿:網友
freetds相關什么是FreeTDS

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

FreeTDS的安裝

1.下載freetds,點此下載http://www.ibiblio.org/pub/Linux/ALPHA/freetds/old/0.63/freetds-0.63.tar.gz

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

3.切換到root,配置:./configure–PRefix=/usr/local/freetds–with-tdsver=7.1–enable-msdblib

 解釋:–prefix為設置FreeTDS的安裝目錄,–with-tdsver是設置TDS版本,–enable-msdblib為是否允許Microsoft數據庫函數庫

4.make&makeinstall

5.配置環境變量:vim~/.bashrc向此文件中加入:exportLD_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。

其配置項解釋如下:

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

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

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

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

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

ldumpfileappend:yes或者no,決定是否追加保存到dumpfile文件中。

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

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

lemulatelittleendian:yes或者no,是否強制大端機使用小端方式與MSServer通信。

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

FreeTDS函數

詳細解釋:http://technet.microsoft.com/en-us/library/aa937082(v=sql.80).aspx

1.dbcmd和dbfcmd

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

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

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

2.dbsqlexec

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

功 能:This function sends Transact-SQL statements, stored in the command buffer of the DBPROCESS, to SQL Server。

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,intcolmn,

功 能:將sql查詢出來的結果綁定到一個變量。第一個參數為從數據庫那里拿的句柄,第二個參數是對應你的select語句中查詢需要的字段(注:必須是按照select順序綁定的,例如selectuser,passWordfromhist1,如果值為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);//setthedatabaseuser

DBSETLPWD(login,SOFTPASS);//setpassword

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

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(dbpro
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
性亚洲最疯狂xxxx高清| 国产日韩精品一区二区| 欧美性猛交xxxx免费看漫画| 欧美电影在线免费观看网站| 亚洲字幕一区二区| 亚洲欧美日韩一区二区在线| 欧美激情精品久久久久| 日本乱人伦a精品| 日本久久精品视频| 欧美第一淫aaasss性| 欧美日韩国产限制| 亚洲高清不卡av| 亚洲xxx自由成熟| 国产日韩欧美在线看| 国产精品免费小视频| 亚洲男人7777| 日韩电影中文字幕在线观看| 中文欧美日本在线资源| 中文字幕免费精品一区| 亚洲偷欧美偷国内偷| 日韩黄色av网站| 国产欧亚日韩视频| 一区二区在线视频| 国产在线视频91| 日韩中文在线中文网三级| 亚洲人成在线免费观看| 91久热免费在线视频| 午夜精品在线视频| 成年无码av片在线| 欧美成在线视频| 日韩av影片在线观看| 亚洲网站在线观看| 日韩av在线最新| 亚洲国产成人在线播放| 欧美成人一区二区三区电影| 亚洲精品视频免费在线观看| 国产精品电影久久久久电影网| 欧美巨猛xxxx猛交黑人97人| 久久亚洲综合国产精品99麻豆精品福利| 欧美性在线观看| 精品视频久久久| 精品久久久香蕉免费精品视频| 日韩在线视频免费观看高清中文| 激情久久av一区av二区av三区| 免费av在线一区| 国产精品jvid在线观看蜜臀| 国产精品久久久久久久久久久久久| 亚洲国产精品va在线观看黑人| 国产伦精品一区二区三区精品视频| 日日狠狠久久偷偷四色综合免费| 色综合色综合久久综合频道88| 成人免费视频网址| 国产网站欧美日韩免费精品在线观看| 色偷偷91综合久久噜噜| 亚洲综合小说区| 久久激情五月丁香伊人| 亚洲韩国青草视频| 91精品国产色综合久久不卡98| 97色伦亚洲国产| 欧美日韩在线第一页| 欧美日韩第一页| 亚洲国产日韩一区| 欧美网站在线观看| 日韩不卡中文字幕| 欧美夫妻性生活视频| 久久99久久久久久久噜噜| 91国语精品自产拍在线观看性色| 久久99精品久久久久久琪琪| 亚洲国产成人久久综合| 九色精品美女在线| 中文字幕亚洲二区| 国产日韩换脸av一区在线观看| 91在线高清视频| 亚洲精品第一国产综合精品| 欧美精品www在线观看| 蜜臀久久99精品久久久久久宅男| 亚洲综合色激情五月| 韩剧1988免费观看全集| 尤物九九久久国产精品的分类| 国产日产欧美精品| 久久夜色精品亚洲噜噜国产mv| 欧美电影免费播放| 欧美性生交xxxxx久久久| 欧美噜噜久久久xxx| 成人妇女淫片aaaa视频| 久久久视频在线| 欧美精品国产精品日韩精品| 久久久久久久999| 国产精品久久久久久av下载红粉| 日韩有码在线播放| 日韩在线观看网址| 欧美最顶级的aⅴ艳星| 久久久久久网站| 亚洲人成绝费网站色www| 91精品国产综合久久香蕉922| 欧美伊久线香蕉线新在线| 91色在线观看| 在线丨暗呦小u女国产精品| 亚洲国产成人精品女人久久久| 97视频在线观看免费高清完整版在线观看| 久久亚洲精品毛片| 美女啪啪无遮挡免费久久网站| 日韩成人高清在线| 92看片淫黄大片看国产片| 国产精品福利网站| 4388成人网| 国模精品系列视频| 97国产在线观看| 欧美小视频在线观看| 中文字幕在线看视频国产欧美在线看完整| 国产精品久久久久久久久粉嫩av| 日本乱人伦a精品| 51午夜精品视频| 91国产美女在线观看| 97超级碰在线看视频免费在线看| 欧美日韩精品二区| 欧美极品少妇xxxxⅹ免费视频| 亚洲**2019国产| 久久精品国产亚洲一区二区| 欧美另类暴力丝袜| 欧美国产日韩一区二区三区| 欧美性精品220| 97视频色精品| 九九精品在线播放| 国产成人一区二区三区| 欧美资源在线观看| 欧美风情在线观看| 色一情一乱一区二区| 精品国产一区二区三区久久久狼| 黑人精品xxx一区| 久久中文久久字幕| 亚洲伦理中文字幕| 欧美精品成人91久久久久久久| 欧美丝袜一区二区| 亚洲午夜精品久久久久久性色| 日韩欧美成人免费视频| 91国语精品自产拍在线观看性色| 欧美一区二区影院| 欧美影院在线播放| 成人美女免费网站视频| 精品一区二区三区电影| 国产精品视频久| 国产精品一区二区三区久久久| 欧美色播在线播放| 国产精品欧美日韩一区二区| 欧美一级免费看| 一本一本久久a久久精品牛牛影视| 亚洲а∨天堂久久精品9966| 久久久久久91香蕉国产| 欧美成人午夜剧场免费观看| 欧美大尺度电影在线观看| 中文字幕亚洲精品| 国产成人精品免费久久久久| 欧美风情在线观看| 91久久久在线| 57pao国产精品一区| 亚洲欧美中文字幕| 日本久久精品视频| 91av在线不卡| 欧美激情18p| 91九色国产在线| 久久久久久久网站| 2019中文字幕在线免费观看| 欧美性xxxxxx|