vc环境下C连接oracle

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

概述
在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 开发出的应用程序无法向异构数据库平台移植。

-fX
qmfL [转贴于我的学习网IT认证ORACLE/CIW认证)-fX
qmfL
本文详细描述实际利用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;
8%7Rir.ly[本_文_来_源_于_我_的_学_习_网IT认证ORACLE/CIW认证 ]8%7Rir.ly
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);。

相关文档
最新文档