




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Unix下数据库的通用接口函数在Unix环境下,常用的数据库开发方法有ODBC、调用层接口(CLI)、SQL内嵌C语言或利用其他特定的开发工具等。由于不同的开发方法提供给C语言访问数据库的方法及书写方式各不相同,所以如此开发出的数据库应用程序难以在不同开发环境下通用,导致移植性较差,如采用SQL内嵌C语言开发的程序要改为调用层接口(CLI)来编写时,程序中所有的C程序都得进行修改。为此,笔者设计了一套Unix环境下数据库系统的C语言通用接口函数,利用这种通用接口函数,在数据库系统的多种开发环境中移植程序也无需再修改代码,改善了程序的通用性,提高了开发效率。本文介绍这种通用接口函数的设计思想、函数原型设计和应用示例。 设计思想 利用C语言模块化编程方法,将与数据库访问有关的函数(主要是标准的SQL语句)集中于一个模块(DBADM)中,即将所有有关接口的函数“封装”在此模块中,把该模块作为数据访问的“中间件”,提供对通用接口函数的支持。这样,在别的应用模块中访问数据库时,只调用这些通用接口函数即可,避免了直接调用数据库系统提供的数据库访问函数时接口不一致的问题,将数据库应用的C语言源程序部分与数据实际访问部分(DBADM)隔离开来。 同时,采用缓存交换技术,为每个打开的表申请一块内存(全局变量),作为访问数据库的SQL语句进行数据交换的记录缓存区。当使用SQL语句读出数据库中的数据时,先把数据存放在记录缓存区(其值皆转换为字符型)。同样,当将数据写入数据库中时,也先在记录缓存区中进行更新,再利用记录缓存区组装Insert、Update等SQL语句,从而避免了直接使用SQL语句。 这样,我们可为数据库系统的常用开发环境编写相应的数据库接口模块(DBADM),如果要改变开发环境,只需改变MAKEFILE文件的数据库接口模块即可,其他模块可原封不动。函数功能的扩充、修改及完善也只需改动数据库接口模块。这样,不但提高了程序的通用性,而且把程序员从考虑不同接口的重复工作中解脱出来,把精力放在功能应用的设计开发上,从而提高了开发效率。 函数设计 数据库系统的数据访问主要是使用SQL查询语言来进行,相关的数据访问语句主要有Select(查询)、Insert(插入)、Update(更新)、Delete(删除)、RollBack(回滚),Commit(提交)等。通过对几种常用的开发环境对SQL语句调用方法的共性与特性的比较,我们可以将它们定义成一套“通用”的数据库访问函数,供其他程序调用。下面是笔者定义的两个接口函数的主要代码(其他接口函数代码略): / dbadm.ec Informixesql / include include include include include sqlca; include sqlda; include sqltypes; /最大的可打开表的数目/ define MXFILES 20 /当前打开的表句柄,表记录的长度/ int iFrx,iSQLRecordLengthMXFILES; /表记录的存储缓冲区,已打开的表/ char szSQLRecordBufferMXFILES,szSQLfhlMXFILES; /已打开表各字段类型区/ char szSQLField_lxMXFILES; /表结构/ struct sqlda uDescMXFILES; /SQL语句组装区/ char szSQLbuf1024; /打开表/ DbTableOpen(char szSelectSQL) int iIdx,iPostion; /字段变量指针/ struct sqlvar_struct uFieldVar; /参数里没有select,则按标准组装select 语句/ if (substr(szSelectSQL,“select ”)0) sprintf(szSQLbuf,“select from s”,szSelectSQL); else strcpy(szSQLbuf,szSelectSQL); /查找可打开的句柄/ for (iFrx=0;iFrxMXFILES;iFrx) if (szSQLfhliFrx=NULL) break; if (iFrx=MXFILES) printf(“ 打开的表太多n”); exit(1); /申请保留select语句区/ if (szSQLfhliFrx=(char)malloc(strlen (szSQLbuf)=NULL) return(1); strcpy(szSQLfhliFrx,szSQLbuf); / 申请表结构保留区/ uDesciFrx=(struct sqlda )malloc(sizeof(struct sqlda); /定义select语句游标,其具体实现略/ if (declaredb(iFrx)sqld1)=NULL) exit(1); /对所有字段进行处理/ for (uFieldVar=uDesciFrxsqlvar,iIdx=0;iIdxsqld;uFieldVar,iIdx) switch (uFieldVarsqltype) case SQLMONEY: /金额类型/ case SQLDECIMAL: /十进制数/ /计算出该字段的偏移/ iPostion=rtypalign(iPostion,CDECIMALTYPE); /类型定义/ uFieldVarsqltype=CDECIMALTYPE; /位置后移一个十进制数所占字节数/ iPostion=rtypmsize(CDECIMALTYPE); /字段长度/ uFieldVarsqllen=rtypmsize(CDECIMALTYPE); break; default: /计算出该字段位置/ iPostion=rtypalign(iPostion,CCHARTYPE); / 类型定义为字符型/ uFieldVarsqltype=CCHARTYPE; uFieldVarsqllen=rtypwidth(uFieldVar sqltype,uFieldVarsqllen)3; /位置后移/ iPostion=uFieldVarsqllen; iPostion; /申请表记录的存储区/ if (szSQLRecordBufferiFrx=(char )malloc (iPostion)=NULL) exit(1); iSQLRecordLengthiFrx=iPostion; /给表中各字段在记录存储缓冲区中定位/ for (uFieldVar=uDesciFrxsqlvar,iIdx=0;iIdxsqld;iIdx,uFieldVar) /计算出该字段偏移/ iPostion=rtypalign(iPostion ,uFieldVarsqltype); /字段在记录缓冲区的位置/ uFieldVarsqldata=szSQLRecordBufferiFrxiPostion ; iPostion=uFieldVarsqllen; /打开游标函数,其具体实现略/ if (opencuser(iFrx)0) exit(1); return(iFrx); /插入函数/ DbInsertRecord(int iTableNo) struct sqlvar_struct uFeildVar; int iIdx; char szTableName60; /从szSQLfhliTableNo中取得表名/ createtableName(szSQLfhliTableNo,szTableName); /组装insert 语句 / sprintf(szSQLbuf,“insert into s values (”, szTableName); for (iIdx=0; iIdxsqld; uFieldVar,iIdx) strcat(szSQLbuf,“?”); if (iIdx!=uDesciTableNosqld1) strcat(szSQLbuf,“,”); strcat(szSQLbuf,“)”); /预定义/ prepare insertid from szSQLbuf; /失败退出/ if (sqlca. sqlcode!=0) return(1); /执行 insert 语句 / execute insertid using descriptor uDesciTableNo; 失败退出/ if (sqlca.sqlcode!=0) / return(1); return(0); 应用示例 在使用通用接口函数编程时,首先调用DbsOpen(),连接数据库,成功后使用数据库接口函数,进行数据库数据的读写。退出系统时,用DbCloseBase()函数关闭数据库即可。test.c是笔者编写的一个简单的C语言应用程序,其功能是显示数据库qsxt 清算系统的lsz流水账中lb类别为02的TCHH提出交换号、TRHH提入交换号内容,并将02改为05。下面是主要代码: include /数据库函数原型头文件/ include “dbutil.h” define TRUE 1 define FALSE 0 main() /流水账表句柄/ int iLsz_no; /流水号/ long lRecord_no; char szSQL256; /连接失败,退出/ if (DbsOpen(“qsxt”,“qsuser”,“admin”)=FALSE) printf(“数据库打开失败n”); exit(1); /打开lsz表失败,退出/ if (iLsz_no= DbTableOpen(“select from lsz where lb=02”)0) /关闭数据库/ DbCloseBase(); printf(“lsz表打开失败n”); exit(1); lRecord_no=1; /表没读完/ while (DbGetRecord(iLsz_no,lRecord_no)=TRUE) /按字段名显示提出行号、提入行号/ printf(“提出行号:6s 提入行号:6sn”, DbGetColDataByName(iLsz_no,“TCHH”), DbGetColDataByName(iLsz_no,“TRHH”) ); /将类别号改为05 / strcpy(DbGetColDataByName(iLsz_no,“LB”),“05”); / 设置更改条件
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 抗菌药物临床应用知识考试试卷及答案
- 2025装饰工程个人劳务合同模板
- 2025年版施工合同规范本(建设工程)
- 2025年第四期工业废渣利用合同
- 火灾安全培训素材课件
- 2025年三支一扶之三支一扶行测真题附答案
- 2025年度企业员工技能提升培训合同
- 济南莱芜语文中考试卷及答案
- 防排烟风机检测
- 初三各科考试题型及答案
- 2025-2026学年浙美版(2024)小学美术二年级上册(全册)教学设计(附目录P168)
- 2025年时政热点考试模拟题库目及解析答案
- DB63-T 1921-2021 交通运输专业空间数据分类与编码规范
- 2025年部编版八年级道德与法治上册全册教案
- 2025年移动式压力容器充装R2作业证考试练习题库含答案
- 北师大版(2024版)三年级上册第七单元第6节《生活中的小数》教学设计
- 2025年中国银行招聘考试试题及答案
- 土石方工程的合作协议书
- 医疗质量安全专项整治行动自查清单8-患者隐私
- 字体设计字体标志与版式设计
- 2025人教版(2024)八年级上册英语教学计划
评论
0/150
提交评论