将Sybase C程序快速移植到Oracle Pro*C程序
2006-07-23 11:17:13 来源:WEB开发网核心提示:本文示例源代码或素材下载 一、前言当前不少单位在进行系统改造升级时,面临着如何将各个独立部门开发的应用所采用的数据库统一,将Sybase C程序快速移植到Oracle Pro*C程序,以便适应数据大集中的需求,方便将来进行数据挖掘等更高层次的应用,但是因为我没有使用到,嘿嘿,在数据库统一的过程中,如何快速、高效
本文示例源代码或素材下载
一、前言
当前不少单位在进行系统改造升级时,面临着如何将各个独立部门开发的应用所采用的数据库统一,以便适应数据大集中的需求,方便将来进行数据挖掘等更高层次的应用。在数据库统一的过程中,如何快速、高效的将已有的基于异种数据库的程序,特别是采用C/C++开发的运行于linux/unix下的程序转换到现有数据库下,成为不少单位面临的问题。当然了,基于RAD开发的程序,基本上不需要进行修改,就能达到目的。
针对如何快速地将Sybase C程序移植为Oracle Pro*C程序,本文将指出一个方向,并给出一个粗糙的框架。仅以此文抛砖引玉,希望各位指导。(计划编写一个转换系列,看看各位反应如何吧)
二、原理
Sybase的C程序转换到Oracle的Pro*C程序,相对于其他类型的转换有很多优势(原谅我挑了可能是最简单的一种转换):
- Sybase程序采用的是C函数调用的方式,这给将Sybase程序转换到其他任意一种数据库程序带来了很大的方便!仅仅需要使用目的数据库的语法,实现老程序使用到的Sybase函数就可以了!并且不需要对原来的C程序进行任何逻辑方面的修改!
- Oracle的Pro*C提供了动态sql的开发方式,这给移植带来了极大的方便。
- Oracle Pro*C与Sybase同样提供进程多连接方式。
- Oracle 9采用parse=full的编译选项时,C的定义变量可以直接在EXEC SQL中使用,这给程序的编写方便了不少。
还有其他优势,不再一一列举。
三、实现
废话少说,下面转入正题:
针对Sybase的几个主要函数,下面概述处理办法,具体的实现参照源代码:
- dbinit():该函数仅仅将针对数据库操作的一些变量进行初始化。
- 一些用户名、密码的设置,没有太多可说的。比较简单。
- dbopen():该函数实际进行数据库的连接,在连接过程中,我设置了全局变量AllOpenProcess用于保存所有的连接指针,并产生了一个连接串用于标识该连接。保存于全局变量中是因为Sybase函数dbexit没有输入参数。
- dbcmd():该函数进行sql语句的分析,以便进一步进行判断。
- dbexec():该函数进行命令的执行(不太清楚为什么Sybase将该函数与dbcmd分开)。对无返回结果集的命令(insert、update、delete)直接通过EXEC SQL AT EXECUTE IMMEDIATE的语法执行。对与存在返回结果集的select,采用oracle动态sql4的方法进行处理。因为时间以及老的程序的关系,本函数的实现仅仅针对了传入完整sql语句的字符串。
- dbresults():判断返回结果。
- dbbind():绑定存储值的地址,并判断传入的类型是否正确。因为老程序仅仅使用了NTBSTRINGBIND类型,所以示例中也仅仅处理了此种类型。
- dbnumcols():返回数据列数目,在语句类型为select时有效。
- dbnextrow():取得下一条数据值,并填写到dbbind所绑定的地址空间内。此处需要根据源类型select_dp->T[]以及目标类型进行相关的数据转换。
- dbdead():判断数据库连接是否正常。采用从DUAL表中取值的方式来测试。
- dbexit():退出数据库连接。
还有其他很多函数,但是因为我没有使用到,嘿嘿,就不作实现了。
更多精彩
赞助商链接