C++连接Oracle 收藏

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

公告:[意见反馈][官方博客] 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。

编程举例
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),
BIRTHDA TE 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);
发表于@ 2006年09月04日13:58:00 | 评论( loading... ) | 编辑| 举报| 收藏
旧一篇:清华梦的粉碎—写给清华大学的退学申请| 新一篇:破解WINDOWS XP登陆口令的方法
查看最新精华文章请访问博客首页相关文章
从DLL传递消息到EXEVisualFC使用- 内联函数选择,与原始代码保持一致VC下利用Pro*C开发Oracle接口vc笔记一应用程序与DLL的通信在VC++中如何封装自己的函数成库?关于预编译头VC下利用Pro*C开发Oracle接口发表评论
本文来自CSDN博客,转载请标明出处:/accp_fangjian/archive/2006/09/04/1175532.aspx。

相关文档
最新文档