摘要 本文介绍了使用pro*c/c++在visual c++环境下开发oracle数据库接口程序的方法。
概述
在visual c++下开发oracle库接口主要有两种方法。一种方法是利用visual c++提供的多种数据库访问技术,如开放数据库连接odbc、数据存取对象dao、对象连接和嵌入数据库ole db和activex数据对象ado等。另一种方法是在visual c++中嵌入sql语句,这就是所指的pro*c/c++(本文简称proc)。前一种方法由于有mfc 强大的类库支持,熟悉vc编程时则实现方便,且可移植性强;但是,与proc 相比,应用程序需要经过两层才能和数据库通信接口建立联系,编程相对复杂,执行效率相对较低。proc支持嵌入式pl/sql 块等直接调用oracle 库,将过程化语言和非过程化语言相结合,形成一种更强的开发工具,可开发出满足各种复杂要求的优化应用程序,执行效率高。适合熟悉oracle技术的人员应用。但是用proc 开发出的应用程序无法向异构数据库平台移植。
本文详细描述实际利用proc在visual c++环境下开发oracle数据库接口程序的方法和具体操作步骤,并给出了编程实例。叙述以visual c++ 6.0版和oracle8i版为例,其他版本可根据实际情况变更。
几个特殊文件
proc在vc下开发oracle库接口时,需要用到几个特殊文件。
1、proc的可执行文件procui. exe
用oracle_home代表oracle安装后的根目录,当其以缺省方式安装在计算机的d盘时,则oracle_home位置是d: \ oracle。这时proc的可执行文件在oracle_home \ ora81 \ bin \ procui. exe,对缺省安装即在d: \ oracle \ ora81 \ bin \ procui. exe。
2、oracle支持sql在vc环境的库文件orasql8. lib
根据以上约定,orasql8. lib文件在oracle_home \ ora81 \ precomp \ lib \ msvc \ orasql8.lib,对缺省安装即在d: \ oracle \ ora81 \ precomp \ lib \ msvc \ orasql8.lib。
3、oracle支持sql在vc环境的头文件
根据以上约定,头文件 *.h在oracle_home \ ora81 \ precomp \ public \ *.h,对缺省安装即在d: \ oracle \ ora81 \ precomp \ public \ *.h。
*.h 是头文件的总称,通常有十多个,具体内容可在指定路径下查到。
将proc集成到vc环境中
为了方便完成用proc在vc下开发oracle库接口,通常将proc集成到visual c++ 6.0 环境中,直接在c / c++环境中使用proc预编译器来预编译应用程序,然后进行编译和链接,最终生成可执行程序。将proc集成到vc环境中应完成如下工作。
1、增加proc到tools菜单列表
a) 运行microsoft visual c++ 6.0;
b) 从菜单项tools中选择customize项。为表述简单起见,书写成如下格式:菜单tools/ customize 项。以下采用类似的表达方法。此时出现customize对话框;
c) 单击tools选项卡(或属性页),用鼠标移动“menu contents”框滚动条到底部区域;
d) 双击点划线矩形区域,在空白区域上输入“proc”,然后按回车键;
e) 在“command”框中,输入proc的可执行文件名。根据2.1节的说明,对缺省安装即输入d: \ oracle \ ora81 \ bin \ procui. exe;
f) 在“arguments”框中输入“$(targetname)”。其作用在从菜单tools中选择proc项时,vc会将当前项目名传递给proc,尔后proc会直接打开该项目文件目录下扩展名为 .pre的同名文件;
g) 在“initial directory”框中输入“$(wkspdir)” / 单击“close”按钮,完成将proc集成到vc环境中的工作。
2、指定头文件路径
为了确保vc顺利完成编译链接,需要将oracle提供的头文件增加到vc环境中。指定头文件路径的具体步骤如下。
a) 菜单tools / options项,出现“options”对话框;
b) 单击“directories”选项卡,从“show directories for:”列表框中选择“include files”;
c) 移动“directories”框的滚动条到底部区域;
d) 双击点划线矩形区域,在空白区域上输入包含oracle支持sql在vc环境头文件的子目录,根据2.3节的说明,对缺省安装即输入d: \ oracle \ ora81 \ precomp \ public。
vc下开发oracle接口程序过程1、创建新工程
下面叙述中,假定新建的工程名为:exam01。当运行visual c++ 6.0后,操作步骤如下:
a) 菜单file / new项 / project卡;
b) 选择win32 console application 项;
c) 由浏览选择或直接输入工程将位于的路径 / 填入创建的工程名如exam01;
d) 单击ok按钮 / 依缺省值单击finish / 单击ok,完成创建控制台应用工程框架。
2、创建预编译源文件
假定创建的预编译源文件名为:exam01.pc。在visual c++ 6.0的环境下操作步骤如下:
a) 菜单project / add to project 项 / new项;
b) files 卡 / sql script file 项;
c) files编辑框中输入exam01.pc / 单击ok;
d) 在编辑状态下输入exam01.pc源文件,或者,从其他文件中拷贝后再修改形成exam01. pc源文件;
e) 选择恰当路径,保存源文件。例如,路径为:e: \ procw \ exam01。
3、预编译
通过预编译,将预编译源文件如exam01.pc转换成为exam01.c的c程序源文件。在proc集成到vc环境下时操作步骤如下:
a) 菜单tools / proc 项;
b) 当出现没有exam01.pre 的对话框时单击ok,此时弹出proc预编译对话框;
c) 利用菜单中的加入项或单击“+”按钮,将进行预编译的源文件如exam01.pc及其路径添加到预编译对话框的input项中,即input项中出现e: \ procw \ exam01 \ exam01.pc。此时在output项中自动显示输出文件如exam01.c和路径(必要时可修改文件名和路径),即output项中出现e: \ procw \ exam01 \ exam01.c;
d) 若有需要,双击预编译对话框的options选项处,对弹出的options选项对话框,选择需要的预编译选项(一般情况下不做该步,即采用缺省预编译选项);
e) 单击工具条最右边的预编译图标,进行预编译;
f) 预编译结束,若出现询问保存exam01.pre 文件时,应选择ok进行保存,完成预编译;
g) 如果预编译结束,预编译对话框左边显示的状态图标为黄色(警告)或红色(预编译失败)时,应双击该标识观察帮助或出错信息。预编译失败,应当重做4.2节中编辑工作,修改源程序,再进行预编译,直到通过预编译。
4、编译准备
为了使工程能通过编译,需要将预编译输出的工程源文件和oracle支持sql在vc环境下的运行库文件加入到工程中,下面具体介绍增加这两个文件的步骤。
1) 将预编译的输出文件加入工程
a) 菜单project / add to project 项 / files 项;
b) 在文件对话框中选择正确路径(见4.2节和4.3节),选定预编译输出的文件如exam01.c,单击“打开”按钮,即将预编译输出的工程源文件加入工程。
2) 将运行库文件加入工程
a) 菜单project / add to project 项 / files 项;
b) 将文件对话框的文件类型改为“所有文件”;
c) 路径选为oracle_home \ ora81 \ precomp \ lib \ msvc;
d) 选择orasql8.lib文件,单击“打开”钮,完成将运行库文件加入工程。
5、编译链接
a) 按f7键或单击编译图标,对工程进行编译链接。如果没有出现错误,则通过编译链接,生成可执行文件如exam01.exe ;
b) 如果编译链接出现错误,返回到4.2节,选择相应的预编译源文件如exam01.pc进行修改并保存;然后按4.3节做预编译,预编译通过后,单击ok按钮用新的 .c文件代替原来的c源文件;此时重新按f7键进行编译链接,直到排除所有错误,生成可执行文件如exam01.exe。
6、运行工程
a) 按ctrl_f5键或单击执行图标运行工程exam01.exe。按工程中的提示,逐步正确运行;
b) 如果运行中出现错误,返回到4.2节修改相应预编译源文件,再按4.3节做预编译,按4.5节进行编译链接,生成新的可执行文件,然后重新运行工程,直到正确实现工程的规定任务。
编程举例1、程序内容
一般sql嵌入式程序主要有说明、包含头文件、子程序声明、主程序和子程序等部分组成,在主程序中调用有关子程序。必备的子程序通常有连接到数据库子程序、断开数据库子程序、错误处理子程序和完成某项具体事务(如查询、插入、修改、删除等)的工作子程序。
2、程序举例
下面是一完整的可通过预编译、编译链接和运行的示例程序。
/* exam01.pc 开发oracle接口程序举例 */
/* 说明:本程序介绍用proc开发oracle库接口的编程特点。通过向auths
* 表输入作家代码,查询作家姓名及工资。运行前应建表、插入数据并提交。*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/* 包含sql通讯区,它用于处理错误。*/
#include <sqlca.h>
void connect(); /* 连接到oracle server */
void disconnect(); /* 断开到oracle server的连接 */
void sql_error(char *); /* 处理错误句柄 */
void select(); /* 查询子程序 */
extern sqlglm(char *,int *,int *);
/* 主程序 */
void main()
{
/* 安装错误处理句柄 */
exec sql whenever sqlerror do sql_error("oracle错误--\n");
/* 连接到数据库 */
connect();
/* 执行查询 */
select();
/* 断开数据库连接 */
disconnect();
}
/* 子程序 */
/* 连接子程序 connect() */
void connect()
{
exec sql begin declare section;
varchar username[10], password[10], server[10];
exec sql end declare section;
/* 输入用户名、口令以及服务器名 */
printf("\n输入用户名:");
gets(username.arr);
username.len=(unsigned short)strlen((char *)username.arr);
printf("\n输入口令:");
gets(password.arr);
password.len=(unsigned short)strlen((char *)password.arr);
printf("\n输入服务器名:");
gets(server.arr);
server.len=(unsigned short)strlen((char *)server.arr);
/* 连接到oracle服务器上 */
exec sql connect :username identified by :password using :server;
printf("\n以用户%s成功地连接到了服务器%s上!\n", username.arr, server.arr);
}
/* 断开连接子程序 disconnect() */
void disconnect()
{
char temp;
printf("\n是否在断开连接前提交所有事务? (y/n)");
scanf("%c", &temp);
fflush(stdin);
if(temp !='y' && temp != 'y')
{
/* 回退事务,断开连接。 */
exec sql rollback work release;
printf("\n回退事务,断开连接,退出程序!\n\n");
}
else
{
/* 提交事务,断开连接。 */
exec sql commit work release;
printf("\n提交事务,断开连接,退出程序!\n\n");
exit(1);
}
}
/* 查询子程序 select()
* 首先输入作家代码,然后查询作家姓名和工资。*/
void select()
{
exec sql begin declare section;
char author_code[8], name[10];
float salary;
short salary_ind;
exec sql end declare section;
printf("\n输入作家代码: ");
gets(author_code);
/* 查询作家姓名和工资 */
exec sql select name, salary into :name, :salary:salary_ind
from auths
where author_code = :author_code;
/* 根据指示变量的值来确定该作家的工资是否为空。*/
if (salary_ind ==0)
{
printf("\n作家代码\t作家姓名\t作家工资\n");
printf("--------\t--------\t--------\n");
printf("%8s\t%8s\t%8.2f\n", author_code, name, salary);
}
else
{
printf("作家%s的工资未录入,为空值!\n", name);
}
}
/* 错误处理子程序 sql_error() */
void sql_error(char *msg)
{
char err_msg[128];
size_t buf_len, msg_len;
/* 出现sql错误,继续往下执行。 */
exec sql whenever sqlerror continue;
printf("\n%s\n", msg);
buf_len=sizeof(err_msg);
/* 调用函数sqlglm()获得错误消息。 */
sqlglm(err_msg, &buf_len, &msg_len);
printf("%.*s\n", msg_len, err_msg);
/* 回退事务,断开连接,退出程序。 */
exec sql rollback release;
exit(exit_failure);
}
3、建表和插入数据记录
上述示例程序如要正确运行,还需以oracle库的合法用户登录,并创建auths表和插入一些数据记录。建表文件、建表命令和插入数据记录的示例命令如下所述。这里叙述的工作完成后,上节生成的可执行文件才能正确运行。
rem 以下为建表文件auths.sql
drop table auths cascade constraints
/
create table auths(
author_code varchar2(8) not null,
name varchar2(10),
birthdate date,
entry_date_time date,
salary number(7,2),
remark varchar2(255))
/
rem 下一行为在pl/sql环境中运行建表文件的命令
rem @ e: \ procw \ exam01 \ auths.sql
rem 下一行为在pl/sql环境中向auths表插入数据的命令,插入后应提交(commit)!
rem insert into auths(author_code,name,salary) values('a00001','王达琳',1200);
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器