您的位置:首页 > 其它

在VC中构造Pro*C的开发环境

2007-06-12 13:35 246 查看
用Pro*C开发Oracle数据库的应用程序,可以在源代码中同时使用SQL语句和C语句;一般这种源文件的后缀名为*.pc;要编译这种文件首先要用Pro*C的预编译器(Oracle10g的预编译器proc.exe)将pc文件编译生成C/C++代码的文件。这个过程就是把SQL语句部分转换成C语言的形式,而其它部分则不变。最后通过链接Pro*C的库文件(Oracle10g的库文件为orasql10g.lib)生成可执行程序。针对不同的Oracle数据库,最好使用相应的预编译器和链接库。要开发Pro*C应用程序,必须安装Oracle Pro*C的开发环境,一般安装好Oracle服务器或客户端后都自带了;要执行Pro*C应用程序,必须在执行机上安装好Oracle服务器或客户端,并正确配置Oracle_Home/NETWOK/ADMIN/tnsnames.ora文件,因为Pro*C应用程序执行时要到Oracle_Home目录中读取这个文件的oracle服务器IP(或机器名)、协议、数据库实例(SID)等信息。
下面以Oracle10g为例配置Pro*C的开发环境。
安装好Oracle10g后有一个Oracle工作目录叫Oracle_Home如:E:/oracle/product/10.2.0/db_1,在VC的Tools/Option/Directory中分别将Oracle_Home/Bin、Oracle_Home/ precomp/public、Oracle_Home/precomp/lib加到Excutable Files、Include Files、Library Files选项中。然后在工程中新建一个pc文件,如db.pc,在File view中选中此文件,右击/Option/Custom Buid,在Commands中输入proc DB.pc oname=DB.cpp,在Outpus中输入DB.cpp,最后将orasql10.lib添加到工程中,这样就可以在db.pc文件中编写SQL和C/C++代码,编译工程的时候,如果db.pc文件发生改变,则会重新生成DB.cpp文件,注意在DB.cpp时在db.pc内容的前面加了一段C语言的代码,如果要用C++的形式编译则要将这一段用exter “C”{}括起来

Pro*C的连接:
#include <sqlda.h>
EXEC SQL INCLUDE sqlca;
void sql_error()
{
char err_msg[128L];
int buf_len, msg_len;
EXEC SQL WHENEVER SQLERROR CONTINUE;
buf_len=sizeof(err_msg);
sqlglm(err_msg, &buf_len, &msg_len);
printf("%.*s", msg_len, err_msg);
EXEC SQL ROLLBACK RELEASE;
}

BOOL _Connect(char *pcConnectionString)
{
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR varConnectionString[64L] ;
EXEC SQL END DECLARE SECTION;

strcpy((char *)varConnectionString.arr, pcConnectionString);
varConnectionString.len = (unsigned short)strlen((char *)varConnectionString.arr);

EXEC SQL CONNECT :varConnectionString;
if (sqlca.sqlcode < 0L)
{
sql_error();
return FALSE;
}

return TRUE;
}
pcConnectionString的写法为用户名/密码@服务名如sys/123@orcl,其中服务名为tnsnames.ora文件中的服务名,如:

orcl = #此即为服务名
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.2)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl_sid)
)
)

游标的使用:
BOOL ZZZB0101(vector<CZZZB0101Fields>& vecFields)
{
CStuednts students;
EXEC SQL BEGIN DECLARE SECTION;
char acID[8L];
char acName[8L];
int nAge;
EXEC SQL END DECLARE SECTION;

EXEC SQL DECLARE cur_Student CURSOR FOR
SELECT
ID,
NAME,
Age,
FROM
Student
WHERE
ID = GM.SYOKUIN_CD
ORDER BY
ID;

EXEC SQL OPEN cur_Student;

if (sqlca.sqlcode < 0L)
{
sql_error();
return FALSE;
}

for ( ; ; )
{
EXEC SQL WHENEVER NOT FOUND DO break;
EXEC SQL FETCH cur_Student 0101 INTO
:acID,
:acName,
:nAge

CSudent student
student.ID = acID;
student. Name = acName;
student. nAge = nAge;

students.push_back(student);
}

EXEC SQL CLOSE cur_Student;

return TRUE;
}

在同一个PC文件中不能使用相同名的游标

作者: 王伟 xbdtb@163.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: