用C/C++访问oracle数据库,Pro C/C++因为使用简单,开发快捷一般是程序员的首选。本文将介绍如何将ProC/C++预编译工具集成到微软vs2010中,整个介绍的线索是围绕着如何将一个简单访问oracle的应用付诸于实践,如果最后这个应用运行起来了,那就证明成功了。废话少说,让我们一起来动手实践吧。
第一步:安装oracle的客户端,注意在安装过程中选择Pro C/C++开发包。
安装完检查一下几个目录和文件:
C:\oracle\product\11.1.0\client\precomp\lib
C:\oracle\product\11.1.0\client\precomp\public
第二步:在数据库创建一张表; 为了测试使用。
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))
第三步:准备好一段使用Pro C/C++访问数据库的源代码,下边这段是我在网上找到的,不知道是否侵犯版权,如果作者看到有异议,请联系我。
/* exam01.pc 开发Oracle接口程序举例 */ /* 说明:本程序介绍用PROC开发Oracle库接口的编程特点。通过向AUTHS * 表输入作家代码,查询作家姓名及工资。运行前应建表、插入数据并提交。*/ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sqlca.h> /* 包含SQL通讯区,它用于处理错误。*/ void connect(); /* 连接到Oracle Server */ void disconnect(); /* 断开到Oracle Server的连接 */ void sql_error(char *); /* 处理错误句柄 */ void select(); /* 查询子程序 */ extern "C" int sqlglm(char *,int *,int *); /* 主程序 */ void main(int argc, char* argv[]) { /* 安装错误处理句柄 */ EXEC SQL WHENEVER SQLERROR DO sql_error("Oracle错误--\n"); /* 连接到数据库 */ connect(); /* 执行查询 */ select(); /* 断开数据库连接 */ disconnect(); system("pause"); return; } /* 子程序 */ /* 连接子程序 connect() */ void connect() { EXEC SQL BEGIN DECLARE SECTION; VARCHAR username[10], password[10], server[10]; EXEC SQL END DECLARE SECTION; /* 输入用户名、口令以及服务器名 */ printf("\n输入用户名:"); gets_s((char*)username.arr, 10); username.len=(unsigned short)strlen((char *)username.arr); printf("\n输入口令:"); gets_s((char*)password.arr, 10); password.len=(unsigned short)strlen((char *)password.arr); printf("\n输入服务器名:"); gets_s((char*)server.arr, 10); 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[10]; printf("\n是否在断开连接前提交所有事务? (Y/N)"); gets_s(temp, 10); if(strcmp(temp ,"Y") == 0) { /* 回退事务,断开连接。 */ 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_s(author_code, 8); /* 查询作家姓名和工资 */ 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, (int*)&buf_len, (int*)&msg_len); printf("%.*s\n", msg_len, err_msg); /* 回退事务,断开连接,退出程序。 */ EXEC SQL ROLLBACK RELEASE; exit(EXIT_FAILURE); }
第四步:生成vs2010的工程和先关文件:
先把这段Pro C/C++代码贴到一个文件中,例如我把这段代码贴到一个叫proc.pc的文件中,然后利用vs2010生成一个windows console类型的空工程中,把proc.pc文件加入到这个工程中来,同时在该工程中生成另外一个proc.cpp的空文件,这样该工程中就包括两个文件了,一个是proc.pc,另外一个是proc.cpp文件,其中Proc.cpp文件内容是空的。这两个文件最好保持名称一致,唯一不同的仅是文件的扩张名不同,一个是
*.pc 文件,另外一个是 *.cpp文件。
第五步:配置vs2010的开发环境:
在工程中的 Solution Explorer 找到 proc.pc 文件,然后代开这个文件Property page页,如下图所示:
设置 Excluded From Build 选择 NO, Item Type 选择 Custom Build Tool,然后选择(Apply)应用,使之生效。
生效之后,就会出现如下页面,
将 Command Line 设置为: proc %(FullPath)
Outputs 设置为: %(FullName).cpp
然后确定即可,关闭该页面。
第六步:配置该工程的目录选项:
Executable Directory 包括 oracle 提供的预编译工具 proc.exe所在的目录,本人的测试环境是: C:\oracle\product\11.1.0\client\BIN;
Include Directory 包括 oralce 的 proc 头文件所在目录,本人的测试环境是:
C:\oracle\product\11.1.0\client\precomp\public
Library Directory 包括 Oralce 提供的连接库 orasql11.lib 所在的目录,本人的测试环境是:
C:\oracle\product\11.1.0\client\precomp\LIB
如下图所示:
第七步:配置该工程的连接选项:
因为最后链接的时候要使用oracle提供的链接库,所以要进行链接配置,链接的文件名称为 orasql11.lib,不同版本的oracle该文件名可能不同,请链接的时候注意.
第八步:修改proc 预编译时候的先关编译参数.
修改文件C:\oracle\product\11.1.0\client\precomp\admin\pcscfg.cfg,内容如下:
define=(WIN32_LEAN_AND_MEAN) sqlcheck=full userid=ucs/ucs@ucs code=cpp
其中userid 要修改为你自己链接数据库的连接串。最后就可以编译运行了,但愿你不怕麻烦一步一步认真执行下来,那大家一起欣赏一下我的运行界面吧。