乌托邦博客

You see? Even death has a heart

« DataStage 连接 Microsoft SQL ServerMySQLAdministrator Could not find settings »

Pro*c/C++访问Oracle

Oracle支持在几种高级语言中嵌入SQL去访问Oracle数据库,比如说C、PASCAL、Ada等等。如果采用C语言访问,那就叫Pro*c程序。

因为在做数据仓库实施的过程中,有用到相关的技术,其实就是Linux下的Pro*c,所以想学习一下Pro*c。用了才知道,以前学的C全部还给了我的大学老师,真有点对不住.........

费了二天时间,才把这一个小小的DEMO搞定,主要功能就是查询一条数据库的记录,并且打印出来。我用的编译环境是Microsoft Visual Studio .NET 2003,在编写代码之前,需要做一些设置,把相关的目录的库路径添加到编译环境里面。

工具-选项-项目-VC++目录,在可执行文件下面添加:E:\oracle\product\10.2.0\db_1\BIN,也就是你的Oracle的BIN目录,因为要调度Proc.exe。包含文件下面,添加:E:\oracle\product\10.2.0\db_1\OCI\include、E:\oracle\product\10.2.0\db_1\precomp\public。在库文件下面,添加:E:\oracle\product\10.2.0\db_1\OCI\lib。

然后建立工程,再把E:\oracle\product\10.2.0\db_1\precomp\LIB\orasql10.lib这个文件添加工程里面来。接着编写代码,示例代码如下:

Oracle.pc



// Oracle.cpp : 定义控制台应用程序的入口点。


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sqlca.h>
#include <sqlcpr.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);
scanf("%s",&username.arr);
username.len=(unsigned short)strlen((char *)username.arr);
printf("\n输入口令:");
//gets(password.arr);
scanf("%s",&password.arr);
password.len=(unsigned short)strlen((char *)password.arr);
printf("\n输入服务器名:");
//gets(server.arr);
scanf("%s",&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",(char *) username.arr,(char *)
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输入作家代码: ");
scanf("%s",&author_code);
fflush(stdin);
//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;
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf("\n%s\n", msg);
buf_len=sizeof(err_msg);
sqlglm(err_msg, &buf_len, &msg_len);
printf("%.*s\n", msg_len, err_msg);
EXEC SQL ROLLBACK RELEASE;
exit(EXIT_FAILURE);
}

我们需要用Oracle的Proc.exe这个工具,把Pro*c的代码转换成C++的代码。选中Oracle.pc文件文件,右击属性,工具-自定义生成工具,在生成步骤,命令行:Proc CODE=CPP Oracle.pc,输出:F:\Visual Studio Projects\Oracle\Oracle.cpp。意思就是用Proc.exe生成Oracle.cpp文件。

然后右击编译就可以生成了,接着把文件添加进来,在第一行加上#include "stdafx.h",然后再CTRL+F5就可以生成并且执行由oracle.cpp生成的EXE文件了。

真是费了好大的工夫才调试成功。最后附上所用到数据库建库脚本:

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

INSERT INTO auths(author_code,name,salary) VALUES('A00001','王达琳',1200);

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

最新评论及回复

最近发表

Powered By Z-Blog 1.8 Spirit Build 80710 Code detection by Codefense

Copyright 2005-2007 Bootad.cn. Some Rights Reserved
.粤ICP备07062332号 QQ:94424751