将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的几个主要函数,下面概述处理办法,具体的实现参照源代码:

  1. dbinit():该函数仅仅将针对数据库操作的一些变量进行初始化。
  2. 一些用户名、密码的设置,没有太多可说的。比较简单。
  3. dbopen():该函数实际进行数据库的连接,在连接过程中,我设置了全局变量AllOpenProcess用于保存所有的连接指针,并产生了一个连接串用于标识该连接。保存于全局变量中是因为Sybase函数dbexit没有输入参数。
  4. dbcmd():该函数进行sql语句的分析,以便进一步进行判断。
  5. dbexec():该函数进行命令的执行(不太清楚为什么Sybase将该函数与dbcmd分开)。对无返回结果集的命令(insert、update、delete)直接通过EXEC SQL AT EXECUTE IMMEDIATE的语法执行。对与存在返回结果集的select,采用oracle动态sql4的方法进行处理。因为时间以及老的程序的关系,本函数的实现仅仅针对了传入完整sql语句的字符串。
  6. dbresults():判断返回结果。
  7. dbbind():绑定存储值的地址,并判断传入的类型是否正确。因为老程序仅仅使用了NTBSTRINGBIND类型,所以示例中也仅仅处理了此种类型。
  8. dbnumcols():返回数据列数目,在语句类型为select时有效。
  9. dbnextrow():取得下一条数据值,并填写到dbbind所绑定的地址空间内。此处需要根据源类型select_dp->T[]以及目标类型进行相关的数据转换。
  10. dbdead():判断数据库连接是否正常。采用从DUAL表中取值的方式来测试。
  11. dbexit():退出数据库连接。

还有其他很多函数,但是因为我没有使用到,嘿嘿,就不作实现了。

四.移植

移植的方法很简单,将原来c/c++文件中#include "Sybfront.h" #include "sybdb.h"等引用Sybase头文件的地方去掉,更换为附件中的#include "database_op.h",同时将附件中database_op.cxx加入到工程中,加上适当的编译语句(PROC),然后去除原来连接sybase的lib,加入oracle的lib:orasql9.lib。就可以在基本不修改源程序的情况下完成程序的移植!当然,如果你的sybase程序采用了非NTBSTRINGBIND类型的话,自己在cxx文件中加入相关的处理方式吧!祝好运!欢迎探讨。

五、技巧

下面我总结一些开发过程中使用到的一些小的技巧,各位见笑。如何充分利用 Visual C++ 的开发环境进行 Pro*C 程序开发:

相信各位对 Visual C++ 的集成开发环境使用比较熟吧,别告诉我你开发 Unix 下的 C/C++ 程序还在使用 vi、UltraEdit、EditPlus 吧!当然了,如果你坚持我也不反对,不过您老此时就不用浪费时间向下翻页了。

oracle 的 Pro*C 程序一般以 PC 结尾。而以 PC 结尾的程序,没法按照 C/C++ 的语法在 Visual C++ 的集成开发环境下显示!只是白纸黑字一片。不像 UltraEdit,可以定制使得 PC 文件按照 C/C++ 的语法显示(在 UltraEdit 安装目录下的 WORDFILE.TXT 文件中包含 "C CPP CC CXX H HPP AWK" 内容的后面加上 "PC" 就可以了)(也许VC有这个功能,不过我没找到)。怎么办呢?简单,修改PC文件后缀为CXX,此时,文件就按照C/C++语法进行显示了!此时,设置该文件属性页(在VC开发环境的WORKSPACE中选中该文件,按 ALT+F7 )中 General 下的 Always use custom build step 为选中状态,Curstom Build 页下的 Commands/Outputs 下参考 oracle 的 example 输入相应的编译选项。记得将对应的PC后缀修改为 cxx 后缀。

时间: 2024-10-03 13:20:33

将Sybase C程序快速移植到Oracle Pro*C程序的相关文章

Oracle商业智能应用程序(第一部分)

OBI EE(Siebel Analytics)是一个强大的企业级商业智能/报表/分析工具,它快速地占据市场份额和 认可.尽管Siebel的Oracle市场份额所占甚低(而且可能会变得更低),但是它是个纯粹的显示平台.他们 的确是希望能够卖给你,但是这不是他们所关注的. 如果是这样的话,那么他们关注的是什么呢?答案是商业智能应用程序. 无论你是否相信,商业智能应用程序是数据仓库和商业智能的未来.就像过去中型和大型企业采用大 型ERP.CRM.Billing 和人力资源应用程序一样,他们也将采用商

sql-我要写一个java程序,去链接oracle数据库,如果获取链接的时间超过1分钟,就抛出异常,请问怎么实现?

问题描述 我要写一个java程序,去链接oracle数据库,如果获取链接的时间超过1分钟,就抛出异常,请问怎么实现? 我要写一个java程序,去链接oracle数据库,如果获取链接的时间超过1分钟,就抛出异常,请问怎么实现? 解决方案 http://blog.chinaunix.net/uid-20752328-id-3451931.html 这里有一篇文章可以解决你的问题你可以点击进去看看; 如果回答对您有帮助请采纳 解决方案二: 说明数据整理不合理吧 解决方案三: 你应该优化数据库结构,或你

安卓应用开发-Java程序能移植修改为安卓app吗?

问题描述 Java程序能移植修改为安卓app吗? 我们写了一个Java的小软件,希望能改编为安卓的app,但不知道能不能做,怎么做.如果能够移植,修改会很多吗? 解决方案 你需要把里面的逻辑抽出来,搭配上Android的界面布局 解决方案二: 看你的软件复杂程度了,学一下Android开发相关的知识吧

Oracle数据库小程序

oracle|程序|数据|数据库 http://61.144.28.245/hjc/web/doc/wangyou/tanggang/OraTools.html 本站首页设为首页收藏本站联系本站 一个Oracle数据库小程序作者:唐纲 程序说明 这是一个从oracle数据库中取函数.存储过程.包的源代码的小程序.程序采用多线程处理,并且考虑到程序的通用性,连接数据库采用JDBC-ODBC网桥.因此,在运行程序之前,必须先建立一个ODBC数据源(DSN),该DSN指向一个oracle数据库实例.程

Oracle商业智能应用程序(第二部分)

在第一部分中,我们讨论了什么是商业智能应用程序以及为什么需要它.在第二部分中,我们将更多 地专注于你与商业智能应用程序的一些密切关系. 普遍的误解 在开始介绍购买决策的一些反对意见之前,我想讨论一些普遍的误解. 它只作用于预先建立的数据源: Oracle商业智能应用程序完全设计为用比一个开发场景中少得多的工作量就可以添加新的数据源到商 业智能应用程序.使用一个发布--订阅模型,数据可以从任何与商业智能应用程序中的已有对象相匹配 的源应用程序中提取.在提取之后,一个叫做Universal Adap

ORACLE监听程序打开后自动关闭,一个很常见却很棘手的问题

问题描述 ORACLE监听程序打开后自动关闭,一个很常见却很棘手的问题 这个是打开监听时候报的错误. 命令行启动报错 现在主机名 listener.ora tnsnames.ora 问题出在哪里了? 我自己也在找办法解决,c币有限,只是希望遇到过类似问题的朋友分享下自己的经验.问题解决之后希望可以给大家带来便利

visual studio 2010-64位系统编写MFC程序通过ado连接Oracle在项目属性设置为win32平台时调试出错

问题描述 64位系统编写MFC程序通过ado连接Oracle在项目属性设置为win32平台时调试出错 我64位的系统用VS2010编写MFC程序,通过ADO方式连接Oracle数据库,在项目属性中设置为x64平台时,程序调试可以正常的连接数据库并对数据库进行增删改查等操作:但是将项目属性设置为win32平台时,程序调试就停在连接数据库那一语句并报有未经处理的异常,请问到底是什么原因啊?应该如何解决? 解决方案 数据库引擎是否支持32bit程序访问.你的ADO等方式配置是否有平台依赖性的地方

Delphi 程序错误写法造成Oracle数据库负载异常

本文讲的是Delphi 程序错误写法造成Oracle数据库负载异常 作者介绍 张洪涛 富士康 DBA 注意:本文涉及的问题在9i的环境中测试的,经验证,同样适用于11g. 在用Toad的SGA Trace工具监控我们的Oracle 9.2.0.8 Patch 31古董数据库时发现一条奇怪的SQL,它占到数据库整体逻辑读50%以上,SQL如下: 这条SQL单次执行逻辑读不到900,但执行非常频繁,它本意想查询HRM.ORGANIZATION表的表与索引信息. 程序员应该不会特意写这种SQL,那它到

fpga-MATLAB程序可以移植到FPGA么

问题描述 MATLAB程序可以移植到FPGA么 还不太清楚FPGA,想要做一个积分程序,可不可以用MATLAB写完,移植进去? 解决方案 感觉不可以,没这么做过.要能这么做就简单了吧 解决方案二: 貌似用MATLAB的simulink工具箱是可以实现的