`
libran
  • 浏览: 193373 次
  • 性别: Icon_minigender_1
  • 来自: 天津
文章分类
社区版块
存档分类
最新评论

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),
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);

分享到:
评论

相关推荐

    c++连接oracle数据库经典例子occi.docx

    c++连接oracle数据库经典例子occi.docx

    C++连接oracle数据库的工具类(含样例)

    使用C++连接Oracle数据库,你需要以下步骤: 1. **安装驱动**:确保系统已经安装了Oracle的客户端或者Oracle Instant Client,这是C++与Oracle通信的基础。 2. **配置环境变量**:设置`TNS_ADMIN`环境变量指向...

    C++连接oracle数据库

    本文将深入探讨如何使用C++来连接Oracle数据库,以及在这个过程中涉及的关键知识点。 首先,要实现C++与Oracle数据库的连接,我们需要一个接口库,这就是Oracle提供的OCI(Oracle Call Interface)。OCI是一个C语言...

    C++连接oracle

    在C++中连接Oracle数据库,通常有两种主要方法:一种是通过使用Visual C++提供的数据库访问技术,如ODBC(开放数据库连接)、DAO(数据存取对象)、OLE DB和ADO(ActiveX数据对象);另一种是使用Oracle提供的Pro*C/...

    C++连接Oracle之OCCI 包含 软件包,以及说明文档,测试代码

    本资源包“C++连接Oracle之OCCI”提供了所有必要的组件,包括软件包、说明文档和测试代码,以帮助开发者熟练掌握使用C++通过OCCI连接Oracle数据库的技术。 首先,让我们详细了解一下OCCI。OCCI是Oracle数据库的一个...

    C++连接Oracle数据库

    因此,掌握如何用C++连接并操作Oracle数据库是非常重要的技能。 #### 关键概念与技术 1. **OCI (Oracle Call Interface)**:这是Oracle提供的一套C语言API,用于与Oracle数据库进行交互。它提供了丰富的功能集,...

    c++ ado连接oracle

    在本文中,我们将深入探讨如何在C++程序中使用ADO连接Oracle数据库,包括两种不同的方法:配置TNS(Transparent Network Substrate)和不配置TNS。 首先,理解TNS是Oracle数据库的一种网络服务命名机制,它允许...

    Ocilib 连接Oracle数据库 C++

    Ocilib 连接Oracle数据库 C++代码编写 Ocilib 连接Oracle数据库 C++代码编写

    linux下c/c++连oracle数据库技术pro*c

    本篇文章将详细探讨Linux下使用C/C++和Pro*C连接Oracle数据库的技术细节。 1. **Pro*C介绍**: Pro*C是Oracle客户端工具集的一部分,它将PL/SQL块转换为C/C++函数,使得开发者可以在C或C++程序中直接执行Oracle...

    不必安装oracle客户端,QT成功连接oracle数据库

    总结来说,"不必安装oracle客户端,QT成功连接oracle数据库"这一技术方案,通过QT的QSqlDatabase类和Oracle的ODBC驱动,为开发者提供了一种轻量级的连接Oracle数据库的方法,减少了开发环境的维护成本,提高了工作...

    C++ 连接数据库实例

    首先,要理解C++连接Oracle数据库,你需要了解几个关键概念。Oracle数据库是一个关系型数据库管理系统(RDBMS),它提供了丰富的数据存储和管理功能。而C++作为一门强大的编程语言,可以用来编写与数据库交互的应用...

    通过OCCI连接oracle(C++)

    Oracle C++调用接口(OCCI),即Oracle的C++API,允许你使用面向对象的特性、本地类、C++语言的方法来访问Oracle数据库

    oracle 数据库,在C++中用连接池实现高速连接与访问.rar

    本话题将深入探讨如何在C++环境中利用连接池技术实现对Oracle数据库的高速连接与访问。 一、Oracle数据库基础 Oracle数据库提供了一套完整的数据管理解决方案,包括事务处理、数据仓库、网络数据库、安全性等。它的...

    C++访问oracle数据库

    C++作为一种强大的编程语言,虽然原生并不包含直接访问数据库的库,但可以通过第三方库如ocilib与Oracle数据库进行交互。本篇将详细介绍如何利用C++结合ocilib库实现对Oracle数据库的访问。 ocilib是一个开源的C/...

    OCI连接oracle数据库(c++)实现

    为了在C++中使用OCI连接Oracle数据库,你需要完成以下几个步骤: 1. **环境配置**:确保已安装Oracle客户端库,这些库包含必要的头文件和动态链接库,用于编译和运行OCI程序。此外,还需要设置环境变量,如`LD_...

    SOCI(C++连接MYSQL,ORACLE,PGSQL数据库VS2017编译好的库)

    对于MySQL,你需要确保已经安装了MySQL的C++连接器,这是SOCI与MySQL数据库通信所必需的。同样,如果你打算连接Oracle或PostgreSQL,相应的驱动程序(如Oracle Instant Client或libpq库)也必须正确配置。 在VS2017...

    c++操作oracle数据库

    首先,为了连接Oracle数据库,我们需要Oracle的客户端库——OCI(Oracle Call Interface)。在C++中,我们通过包含oci.h头文件并链接oci.lib库来使用这个接口。安装Oracle客户端后,开发者可以在C++代码中创建环境...

Global site tag (gtag.js) - Google Analytics