歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> Linux文化

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 xxx.xxx.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 生成密碼文件。

//////////////////////////////////////////

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

以 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 列數據.


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

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

//////////////////////////////////////////////

為了得到簡單的教程, type info in command line,

then type h, follow it step by step, you can learn

how to use info:


Space 下一頁

b 上一頁

p 前一節點

n 下一節點

^L 刷新屏幕 (Ctrl+L)

^G 取消某個需要參數的命令

m 到某個子菜單中去

Tab 當輸入參數時, 會自動匹配

u 上一層節點

l 上一次到的節點

d 到達目錄節點

f 到達一個交叉引用節點

當按下 f後要求輸入節點名稱時, 輸入? 可以看到可以到達的

交叉引用節點

g 當你知道一個節點的名字時, 可以直接跳到該節點

s 從整個文件中找字符串

################################################
#本文檔目前由[email protected]維護。 #
#如果有什麼問題和建議請mailto:[email protected] #
# 上次修改時間: 99/7/20            #
################################################

- Zhang GuangLong 供稿


Copyright © Linux教程網 All Rights Reserved