DB-Library/C——Sybase数据库的开发接口

DB-Library/C——Sybase数据库的开发接口

鲁东

摘要:本文叙述了DB-Library/C作为Sybase数据库的开发接口,以及与C语言紧密结合开发基于C/S体系结构系统,并给出了设计实例。
关键词:DB-Library/CSybase数据库存储过程

一、概述

  当今,随着网络的应用和数据管理层次的提高,各行各业都在建立自己的数据库。农业银行大多采用Sybase数据库。Sybase以其独特而丰富的功能扩充、明显的高性能和特别适合于运行在网络环境下等特点赢得了用户的青睐,它最大的也是获益最多的特点是多线索的Client/Server结构。这种结构中的Client向Server提出请求并处理Server的响应,Server响应请示并给出Client返回数据、参数和状态信息。Sybase提供了完善的开发环境。DB-Library/C就是一种对数据库的存取和服务器控制的接口(如右图所示)。C语言与此接口的形式不同于其它数据库(如ORACLE、INFORMIX等)与C语言的嵌入式接口。与嵌入式接口相反,这个接口与C语言的结合不需要C语言预编译器,而是普通的C例程。当然,仅有C语言与这些接口是不够的,在数据库中还有一个非常重要的概念是存储过程。它是C/S体系大力提倡的特性之一,是被赋予名字、得到编译被存储在数据库中SQL语句。一旦确定了数据库中的存储过程,应用程序就能利用上述接口按名字调用。因此,C语言就是利用DB-Library/C的丰富的例程和宏去调用有具体名字和功能的存储过程实现对数据库中数据的管理。

二、DB-Library/C基本应用技术

  DB-Library/C是Client这边的应用编程接口。它由一组例程或宏组成,包括①发送命令;②处理返回结果;③为一个应用打开多个连接;④完成数据类型转换;⑤自动完成数据从数据库到程序变量的赋值;⑥监测应用的运行,遇到错误则退出;⑦用两步法提交服务,定义分布式更新事;⑧在文件、程序变量和表之间实现块拷贝。DB-Library/C应用程序与数据库服务器的通信是通过一个或多个DBPROCESS结构实现的。DBPROCESS是一个结构型的变量类型,用来定义连接服务器的数据变量,用DB-Library/C作为接口编程常需以下几个步骤:(1)登录到一个服务器;(2)将SQL命令放进一个缓冲,并传给服务器,要求服务器执行;(3)接收并处理返回结果;(4)处理DB-Library错误和服务器的消息;(5)关闭与服务器的连接并释放缓冲。
  下面结合具体设计实例,说明DB-Library/C与C语言结合,完成与服务器中数据库通信并处理返回结果的过程。
#include
<stdlib.h>
#include<string.h>
#include<sybfront.h>
#include<sybdb.h>
#include<syberror.h>
  LOGINREC*loginrec;
  DBPROCESS*dbproc;
  RETCODEreturn_code;
  char organ_no[5],account_no[6];
  unsigned amounr;
  char cmdstr[450];
  main()
{
  strcpy(organ_no,″0301″);
  strcpy(account_no,″00802″);
  amount=888.88;
  organ_no[4]=account_no[5]=′/0′
  sprintf(cmdstr,″execss_jz/′%s/′,/′%s/′,/′%d/′″,organ_no,account_no,amount);
  conn_init();
  return_code=db_exec();
  if(return_code!=0)/*******非0:不成功******/
  {
   system(″clear″);
   printf(″/n/n/n/n/n此帐户记帐不成功!请重新记帐″);
   printf(″/n/n/n/n/n按任意键返回!″);
   getchar();
   dbexit();
   return;
  }
   system(″clear″);
   printf(″/n/n/n/n/n此帐户记帐成功!″);
  getchar();
  dbexit();
}
conn_init()
{
  if(dbinit()==FAIL)printf(″初始化失败!″);
  if((loginrec=dblogin())==NULL)printf(″注册失败!″);
  if((DBSETLUSER(loginrec,″nhuser″))==FAIL)printf(″数据库用户名错!″);
  if((DBSETLPWD(loginrec,″nhuser″))==FAIL)printf(″数据库用户口令错!″);
  if((dbproc=dbopen(loginrec,NULL))==NULL)printf(″不能与服务器建立链接!″);
  if((dbuse(dbproc,″nhdb″))==FAIL)printf(″打开指定数据库失败!″);
}
db_exec()
{
  dbfreebuf(dbproc);
  dbcmd(dbproc,cmdstr);
  dbsqlexec(dbproc);
  while((return_code=dbresults(dbproc))!=NO_MORE_RESULTS)
  {
    if(return_code==SUCCEED)
       while(dbnextrow(dbproc)!=NO_MORE_ROWS)
       printf(″goon!!″);
  }
     return(dbretstatus(dbproc));
}
  这是本人在参加开发鞍山市农行同城实时清算系统时所编贷记记帐业务程序片段,只是稍有删改,重在说明DB-Library/C作为程序接口时的运行原理。
  (1)首先在头文件sybdb.h中定义了LOGINREC和DBPROCESS数据类型,前者用来说明分配登录信息的数据变量,后者用来说明连接服务器时的数据变。
  (2)程序为调用存储过程给三个参数赋值,然后与“execss_iz”组成字符串放在cmdstr变量中,“exec”是存储过程执行命令,“ss_iz为存储过程名。
  (3)conn_init()是笔者写成的一个子函数,里面包涵了几个DB-Library/C的例程。其中dbinit()完成对DB-Library/C的初始化;dblogin()、DBSETUSER()、DBSETLPWD()用来建立登录信息,dblogin分配一个结构赋给loginrec,BSETUSER()、DBSETLPWD()分别设置要登录服务器的用户名和口令,此程序中都为nhuser;dbopen()用来建立与服务器的连接,此连接需要TCP/IP网络系统的畅通,同时需在注册用户的.profile文件中指明服务器地址文件interfaces所在路径;dbuse()用来打开要访问的数据库,这里为“nhdb”。
  (4)db_exec()也是笔者集中了一些DB-Library/C的例程。其中dbfreebuf()将命令缓冲区清空;dbcmd()将前面形成的命令串送入缓冲区;dbsqlexec()将命令缓冲区的内容提交给服务器执行,然后调用结果处理函数dbresults()将结果赋给return_code(即服务器执行命令的成功与否);dbretstatus()返回存储过程的状态字,在本例中存储过程定义的是返回结果为非“0”时分户帐记帐不成功,否则记帐成功。
  (5)dbexit()用来关闭与服务器的连接。

  三、结束语

  本文以实际应用为目的,叙述了DB-Library/C函数的基本应用技术,除此之外还有好多功能丰富的函数,根据需要可在有关DB-Library/C书籍上查阅。例举的程序是在《中国农业银行集中式对公业务系统V10》基础上,利用C语言和DB-Library/C开发出的具有C/S体系的《同城实时清算系统》片段,并且已经鞍山市人民银行科技处测试验收。□

鲁东(中国农业银行辽宁省阜新市分行信息电脑中心,辽宁 阜新 123000)

参考文献

[1]浦洲陶、李强主编,Sybase数据库技术大全,科学出版社出版,1997年9月。
[2]王振宇、黄立波编著,实用C语言接口技术与实例,电子工业出版社出版。1997年4月。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值