歡迎您光臨本站 註冊首頁

Sybase DB-Library For Linux

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  DB-Library是應用程序與Sql-server之間的通信庫。

一. Sybase DB-Library For Linux 基礎

1.版本

在ASE(Adapative Server Enterprise)11.0.3.3 for Linux中,

附帶Sybase DB-Library For Linux

10.0.1.你可以查看$SYBASE/include/sybdb.h來獲得它的版本號。

2.數據類型

Sybase DB-Library的C語言數據類型與ASE數據類型之間的對應

關係如下表所示:

DB-Library(C) ASE

DBTINYINT tinyint (1 byte integer)

DBSMALLINT smallint (2 bytes integer)

DBINT int (4 bytes integer)

DBCHAR char (less than 255 chars)

DBBINARY binary (less than 255 bytes)

DBVARBIN varbinary (less than 255 bytes)

DBBIT bit (0 or 1)

DBFLT8 float (8 bytes float type)

DBREAL real (4 bytes float type)

DBNUMERIC numeric (2-17 bytes)

DBDECIMAL decimal (2-17 bytes)

DBMONEY money (8 bytes money type)

DBMONEY4 smallmoney (4 bytes money type)

DBDATETIME datetime (8 bytes datetime type)

DBDATETIME4 smalldatetime(4 bytes datetime type)

3.常用數據結構

DBPROCESS

LOGINREC

4.DB-Library 的資料庫訪問過程

1).連接SQL-Server.

首先調用dbinit來初始化DB-Library環境,再調用dblogin等函數分配

LOGINREC結構

DBPROCESS *dbproc;

LOGINREC *login;

dbinit(); /* 初始化DB-Library環境 */

login=dblogin(); /* 分配LOGINREC結構 */

DBSETUSER(login,"sa"); /* 設置登錄帳號 */

DBSERTPWD(login,"passwd"); /* 設置登錄口令 */

dbproc=dbopen(login,"mydbname") /* 建立資料庫連接,

返回DBPROCESS結構指針 */

2).命令處理

(1)命令添加函數dbcmd

dbcmd(dbproc,"select * from user");

dbcmd(dbproc," where name=glzhang\");

dbcmd將sql command添加到命令緩衝區中。

(2) 命令執行函數dbsqlexec,dbsqlsend

dbsqlexec(dbproc);

若執行失敗則阻塞。若成功則調用dbresults函數來處理結果,

見後續章節。

dbsqlsend(dbproc);

傳遞sql后立即返回,可以使用dbsqlok(dbproc)來檢查成功與否。

3) 結果集的處理

DB-Library 將select獲得的數據集分成常規行和計算行兩類。

一般的處理方法有下面幾種:

(a). 使用變數讀取結果數據。

(b). 使用行緩衝方式處理結果行數據。

(c). 使用指針存取結果行數據。

由於篇幅所限,下面僅介紹使用變數讀取結果數據的方法。

使用變數讀取結果行數據的時候,應該首先檢查dbresultes的返回值

是否為SUCCEED。如果返回成功,

則應該依次使用dbbind將常規結果列綁定到應用程序變數上,

用dbaltbind將計算結果列綁定到應用

程序變數上。然後再用dbnextrow來讀取數據。

(1).綁定常規結果列。

RETCODE dbbind(

PDBPROCESS dbproc,

INT column, /* 變數所綁定結果列的列號 */

INT vartype, /* 應用程序變數的數據類型 */

DBINT varlen, /* varaddr緩衝區的長度 */

LPBYTE varaddr /* 應用程序變數地址 */

)

其中,vartype的取值為下表:

DB-Library(C) vartype

DBTINYINT TINYBIND

DBSMALLINT SMALLBIND

DBINT INTBIND

DBCHAR CHARBIND,STRINGBIND,NTBSTRINGBIND

DBBINARY BINARYBIND

DBVARBIN VARBINBIND

DBBIT BITBIND

DBFLT8 FLT8BIND

DBREAL FLT4BIND

DBNUMERIC NUMERICBIND,SRCNUMERICBIND

DBDECIMAL DECIMALBIND,SRCDECIMALBIND

DBMONEY MONEYBIND

DBMONEY4 SMALLMONEYBIND

DBDATETIME DATETIMEBIND

DBDATETIME4 SMALLDATETIBIND

 

(2).綁定計算結果列。

RETCODE dbaltbind (

PDBPROCESS dbproc,

INT computeid, /* COMPUTE 子句id號*/

INT column,

INT vartype,

DBINT varlen,

LPCBYTE varaddr

)

(3).讀取數據。

STATUS dbnextrow(PDBPROCESS dbproc)

4) 關閉連接

dbclose(dbproc); /* 關閉dbproc連接 */

dbexit(); /* 關閉所有連接 */

5) 應用舉例

查詢資料庫sql中的表author的所有的password.

(a).示常式序。(test.c)

#include

#include

#include

#include

#include

#include "sybdbex.h"

#define DATELEN 26

#define TYPELEN 2

main(argc, argv)

int argc;

char *argv[];

{

DBPROCESS *dbproc; /* Our connection with SQL Server. *

LOGINREC *login; /* Our login information. */

DBCHAR password[20];

RETCODE result_code;

fflush(stdout);

/* Initialize DB-Library. */

if (dbinit() == FAIL)

exit(ERREXIT);

login = dblogin();

DBSETLUSER(login, "sa");

DBSETLPWD(login,"passwd");

dbproc = dbopen(login, "sql");

dbcmd(dbproc, "select password from author order by authorid");

dbsqlexec(dbproc);

while ((result_code = dbresults(dbproc)) != NO_MORE_RESULTS)

{

if (result_code == SUCCEED)

{

dbbind(dbproc, 1,NTBSTRINGBIND, (DBINT)0, (BYTE *)password);

printf("\n The password is:");

while (dbnextrow(dbproc) != NO_MORE_ROWS)

{

printf("%s\n",password);

}

}

}

dbexit();

exit(STDEXIT);

}

(b). MakeFile

# Make the DB-Library programs.

# Change the following definitions as appropriate for your site:

INCDIR = $(SYBASE)/include

LIBDIR = $(SYBASE)/lib

HEADERS = $(INCDIR)/sybfront.h \

$(INCDIR)/sybdb.h

DBLIBS = $(LIBDIR)/libsybdb.a

INCLUDE = -I. -I$(INCDIR)

DSYS = BSD42

DVERSION =

CC = gcc

CFLAGS = -O2

all: test \

test: $(HEADERS) test.

$(CC) $(INCLUDE) test.c $(CFLAGS) $(DBLIBS) -lnsl -lm -o test

 

(c). Interface

## SYBASE on localhost

## Services:

## query tcp (1543)

## master tcp (1543)

mydb

query tcp ether 192.168.0.10 5000

master tcp ether 192.168.0.10 5000

## SYB_BACKUP on bbs.seedchina.com

## Services:

## query tcp (1544)

## master tcp (1544)

sql

query tcp ether 192.168.0.88 1433

master tcp ether 192.168.0.88 1433

大家可以看到,mydb是本地sybase資料庫,而sql則是異地MS_SQL :),所以

一般的Linux ==> MS-SQL應用通過DB-Library還是很容易實現的。還有很多

例子,在$SYBASE/sample/dblibrary/下面。大家可以參考。

1. 首先使用rpm 將 postgres*.rpm 安裝上: rpm -i postgres*.rpm

2. 以 root 身份將 postgres的密碼改掉,用 postgres 登錄。

3. 增加文件 .bash_profile 如下:

PGLIB=/usr/lib/pgsql/

PGDATA=/var/lib/pgsql/

export PATH MANPATH PGLIB PGDATA

然後執行 . .bash_profile

個人感覺,postgres 對用戶許可權支持的不是很好。預設的情況是所有

用戶從所有主機都可以訪問資料庫,沒有密碼的說法。可以修改 $PGDATA

目錄下的 pg_hba.conf,將最後兩行中的USERAUTH 方式改成 password

後面再加上密碼文件名。用 pg_passwd file 生成密碼文件。

By Simon Lei, May.30,1999, All Rights Reserved.

注: 這些只是我當時安裝時的記錄, 至於編程時的記錄還沒有整理出來,

以 postgres 執行 createuser 建立用戶,而使用 createdb 為之創建

一個資料庫,當然也可以通過 grant 來進行授權. 因為關於它的用戶

管理我也不是很熟悉, 所以我只是讓我的一個用戶能夠訪問一個數據

庫就停手了, 而進入了編程階段. 因此下面只介紹編程方面的問題:

先說說如何編譯和連接:

編譯時加入這個參數: -I/usr/include/pgsql

連接時加入這個參數: -L/usr/local/pgsql/lib -lpq

上面的路徑也許需要改變 .

在源程序中需要加入: #include

首先是連接資料庫:

PGconn *search;

search = PQsetdbLogin( NULL, NULL, NULL, NULL, "databasename",

"username", "password");

if ( search == NULL) {

perror( "Connect database Error:");

return NULL;

}

return search;

而斷開與資料庫的連接使用:

PQfinish( search);

讓資料庫執行一條SQL 語句可以使用函數:

PGresult *result;

result = PQexec( search, command);

其中 command 是一個字元串, 如 :

sprintf( command, "select * from %s", tablename);

當結果不需要再使用時,用 PQclear( result) 釋放之.

使用 PQgetvalue( result, i, j)

來獲得 result 中的第 i 條紀錄的第 j 列數據.

其他的深入使用方法我沒有時間往下研究了, 有興趣的朋友

可以去研究一下, 再把心得貼出來大家共享.


[火星人 ] Sybase DB-Library For Linux已經有759次圍觀

http://coctec.com/docs/linux/show-post-74237.html