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(""
The password is:"");
while (dbnextrow(dbproc) != NO_MORE_ROWS)
{
printf(""%s
"",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 列数据.
其他的深入使用方法我没有时间往下研究了, 有兴趣的朋友
可以去研究一下, 再把心得贴出来大家共享.