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

    用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
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值