用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 要修改为你自己链接数据库的连接串。最后就可以编译运行了,但愿你不怕麻烦一步一步认真执行下来,那大家一起欣赏一下我的运行界面吧。