分享
 
 
 

用VC开发基于ORACLE数据库应用程序的两种方法

王朝oracle·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

ORACLE 公司自1979 年推出基于SQL 标准的关系数据库产品到1997 年版本8 的推出,ORACLE 数据库以其支持大数据库、多用户的高性能事务处理,对业界各项工业标准的支持,完整的安全和完整性控制,支持分布式数据库和分布处理,具有可移植性、可兼容性和可连接性等突出优点倍受用户喜爱,根据IDG1992 年全球UNIX 数据库的市场报告,ORACLE 占市场销售量的50%。而在客户端的开发工具方面,Visual C++ 也因其强大的功能和高度的灵活性等特点深受广大程序员的喜爱,因此本文旨在介绍使用Visual C++ 开发基于ORACLE 数据库应用程序的两种方法。

2. 使用PRO*C 开发数据库应用

2.1 PRO*C 工作原理

PRO 系列是ORACLE 公司提供的在第三代高级程序设计语言中嵌入SQL 语句来访问数据库的一套预编译程序,包括PRO*Ada、PRO*C、PRO*COBOL、PRO*Fortran、PRO*Pascal 和PRO*PL/I 六种。程序员用相应的高级语言编写嵌入SQL 语句的PRO 源程序(若用C 语言则称为PRO*C 源程序)后运行相应的预编译程序,把嵌入的SQL 语句转换为标准的ORACLE 调用并生成目标源程序,即纯高级语言格式的源程序,然后就可以将这些源程序加入用户的程序中调用,其处理过程如下图。

ORACLE 预编译程序提供如下功能:

⑴能用六种通用的高级程序设计语言中的任何一种编写应用程序。

⑵遵循ANSI 标准,在高级语言中嵌入SQL 语句。

⑶可采用动态SQL 方法,让程序在运行时接受或构造一个有效的SQL 语句。

⑷实现ORACLE 内部数据类型和高级语言数据类型之间的自动转换。

⑸可通过在应用程序中嵌入PL/SQL 事物处理块来改进性能。

⑹能在程序行和命令行上指定所需要的预编译可选项,并可在预编译的过程中改变它们的值。

⑺能全面检查嵌入的SQL 数据操纵语句和PL/SQL 块的文法和语义。

⑻可用SQL*Net 并行存取多个地点的ORACLE 数据库。

⑼可把数组作为输入和输出程序变量使用。

⑽能对应用程序中的代码段进行条件预编译。

⑾提供了较强的异常处理功能。

由此可见,通过预编译程序与其它高级语言的结合,既可以利用SQL 强有力的功能和灵活性为数据库应用系统的开发提供强有力的手段,又可以充分利用高级语言自身在系统开发方面的优势,从而提供一个完备的基于ORACLE 数据库应用程序的开发解决方案。

2.2 在VC 中使用PRO*C

每个PRO*C 源文件一般由程序头和程序体两部分组成。程序头包含宿主变量(SQL 语句中所包含的变量)说明、通讯区定义和C 外部表示符的说明等。程序体一般是由若干函数组成,这些函数内含有SQL 语句(以EXEC SQL 起头的语句)。

PRO*C 支持的数据类型包括VARCHAR2( 变长字符串)、NUMBER( 二进制数)、INTGER( 有符号整数)、FLOAT( 浮点数)、STRING( 以NULL 结尾的字符串)、VARNUM( 变长二进制数)、LONG( 变长字符串)、VARCHAR( 变长字符串)、ROWID( 二进制值)、DATE( 定长日期/ 时间值)、VARRAW( 变长二进制数据)、RAW( 定长二进制数据) 、LONGRAW( 变长二进制数据)、UNSIGNED( 无符号整数)、LONGVARCHAR( 变长字符串)、LONGVARRAW( 变长二进制数据)、CHAR( 定长字符串)、CHARZ(C 中定长以NULL 结尾的字符串)、MLSLABEL( 变长二进制数据)。

在PRO*C 中不能使用'l' 或'u' 作词尾或Ɔx' 作词头修饰常量;在SQL 语句中使用单引号来定义字符串,用双引号来定义特殊的或小写字符的标识符( 如表名等);SQL 语句中不允许使用C 中的寻址、间接、位逻辑、复合赋值、?=、-、++、%、 操作符并且用NOT、AND、OR、= 代替!、&&、||、==。

下面的程序是一个联结数据库的PRO*C 源程序例子。

#include //声明SQL通讯区

#include

#include EXEC SQL BEGIN DECLARE SECTION;VARCHAR username[20]; //声明宿主变量VARCHAR password[20];VARCHAR dbname[20];EXEC SQL END DECLARE SECTION;void db_connect(){strcpy((char *)username.arr,"SCOTT");username.len = strlen((char *)username.arr);strcpy((char *)password.arr,"TIGER");password.len = strlen((char *)password.arr);strcpy((char *)dbname.arr,"SUNDB");dbname.len = strlen((char *)dbname.arr);EXEC SQL WHENEVER SQLERROR STOP; //隐式异常处理EXEC SQL CONNECT :usernameIDENTIFIED BY :password USING :dbname;/*if (sqlca.sqlcode != 0) //显式异常处理{AfxMessageBox("\n与Oracle数据库连接失败!");return;}*/}在VC 中使用PRO*C 时,先用PRO*C 编写所需的操作数据库的子程序,再运行PRO*C 预编译程序把PRO*C 源程序转成相应的CPP 源程序,将该程序插入到用户工程文件中并在需要对插入函数进行调用的模块中说明函数,然后就可以在此模块中调用所需的函数。3. 使用ODBC 中间件访问数据库3.1 ODBC 工作原理ODBC 是Open Database Connect 即开放数据库互连的简称,它是由Microsoft 公司于1991 年提出的一个用于访问数据库的统一界面标准,是应用程序和数据库系统之间的中间件。它通过使用相应应用平台上和所需数据库对应的驱动程序与应用程序的交互来实现对数据库的操作,避免了在应用程序中直接调用与数据库相关的操作,从而提供了数据库的独立性。ODBC 主要由驱动程序和驱动程序管理器组成。驱动程序是一个用以支持ODBC 函数调用的模块(在WIN95 下通常是一个DLL),每个驱动程序对应于相应的数据库,当应用程序从基于一个数据库系统移植到另一个时,只需更改应用程序中由ODBC 管理程序设定的与相应数据库系统对应的别名即可。驱动程序管理器(包含在ODBC32.DLL 中)可链接到所有ODBC 应用程序中,它负责管理应用程序中ODBC 函数与DLL 中函数的绑定。ODBC 使用层次的方法来管理数据库,在数据库通信结构的每一层,对可能出现依赖数据库产品自身特性的地方,ODBC 都引入一个公共接口以解决潜在的不一致性,从而很好地解决了基于数据库系统应用程序的相对独立性,这也是ODBC 一经推出就获得巨大成功的重要原因之一。从结构上分,ODBC 分为单束式和多束式两类。⑴单束式驱动程序单束式驱动程序介于应用程序和数据库之间,像中介驱动程序一样数据提供一个统一的数据访问方式。当用户进行数据库操作时,应用程序传递一个ODBC 函数调用给ODBC 驱动程序管理器,由ODBC API 判断该调用是由它直接处理并将结果返回还是送交驱动程序执行并将结果返回。由上可见,单束式驱动程序本身是一个数据库引擎,由它直接可完成对数据库的操作,尽管该数据库可能位于网络的任何地方。⑵多束式驱动程序多束式驱动程序负责在数据库引擎和客户应用程序之间传送命令和数据,它本身并不执行数据处理操作而用于远程操作的网络通信协议的一个界面。前端应用程序提出对数据库处理的请求,该请求转给ODBC 驱动程序管理器,驱动程序管理器依据请求的情况,就地完成或传给多束驱动程序,多束式驱动程序将请求翻译为特定厂家的数据库通信接口(如Oracle 的SQLNet)所能理解的形式并交于接口去处理,接口把请求经网络传送给服务器上的数据引擎,服务器处理完后把结果发回给数据库通信接口,数据库接口将结果传给多束式ODBC 驱动程序,再由驱动程序将结果传给应用程序。3.2 在VC 中使用ODBCVisual C++ 中提供了CDatabase、CRecordset、CRecordView、CDBException 和CFieldExchange 五个类,这些类封装了ODBC SDK 函数,从而使用户可以无需了解SDK 函数就可以很方便地操作支持ODBC 的数据库。CDatabase 类:封装了与数据库建立连接,控制事务的提交和回滚及执行SQL 语句的方法。CRecordset 类:封装了大部分操纵数据库的方法,包括浏览、修改记录,控制游标移动,排序等操作。CRecordView 类:提供了与recordset 对象相连接的视,可以建立视中的控件与数据库数据的对应,同时支持移动游标,修改记录等操作。CDBException 类:提供了对数据库操作的异常处理,可以获得操作异常的相关返回代码。CFieldExchange 类:提供了用户变量与数据库字段之间的数据交换,如果不需要使用自定义类型,你将不用直接调用该类的函数,MFC Wizard 将自动为程序员建立连接。4. 两种方法的比较综上所述,使用这两种方法在Visual C++ 中都可以很方便地开发出基于ORACLE 数据库的应用程序,同时,这两种方法又各有其优缺点。ODBC 由于有MFC 强大的类库支持而使得编程实现非常方便,同时可移植性也很强,在异构的数据库之间移植也只需

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有