freetds簡介、裝置、設置裝備擺設及應用引見。本站提示廣大學習愛好者:(freetds簡介、裝置、設置裝備擺設及應用引見)文章只能為提供參考,不一定能成為您想要的結果。以下是freetds簡介、裝置、設置裝備擺設及應用引見正文
甚麼是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,點此下載 http://www.jb51.net/database/201983.html
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();
}