国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

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
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 巴南区| 海南省| 满洲里市| 新巴尔虎右旗| 红原县| 柳河县| 富顺县| 广水市| 四子王旗| 镇赉县| 武乡县| 甘孜县| 花垣县| 东源县| 焦作市| 翼城县| 平武县| 平原县| 巴马| 铅山县| 饶阳县| 神农架林区| 娱乐| 特克斯县| 婺源县| 化德县| 高平市| 务川| 九寨沟县| 西峡县| 深水埗区| 西丰县| 喀喇沁旗| 金阳县| 南皮县| 平阳县| 东乌珠穆沁旗| 来宾市| 江川县| 资兴市| 海林市|