服务器 频道

VC下利用Pro*C开发Oracle接口

  VC下开发Oracle接口程序过程

  1、创建新工程

  下面叙述中,假定新建的工程名为:Exam01。当运行Visual C++ 6.0后,操作步骤如下:

  a) 菜单File / New项 / Project卡;

  b) 选择Win32 console Application 项;

  c) 由浏览选择或直接输入工程将位于的路径 / 填入创建的工程名如Exam01;

  d) 单击OK按钮 / 依缺省值单击Finish / 单击OK,完成创建控制台应用工程框架。

  2、创建预编译源文件

  假定创建的预编译源文件名为:Exam01.pc。在Visual C++ 6.0的环境下操作步骤如下:

  a) 菜单Project / Add To Project 项 / New项;

  b) Files 卡 / SQL script File 项;

  c) Files编辑框中输入Exam01.pc / 单击OK;

  d) 在编辑状态下输入Exam01.pc源文件,或者,从其他文件中拷贝后再修改形成Exam01. pc源文件;

  e) 选择恰当路径,保存源文件。例如,路径为:E: \ PROCW \ Exam01。

  3、预编译

  通过预编译,将预编译源文件如Exam01.pc转换成为Exam01.c的C程序源文件。在PROC集成到VC环境下时操作步骤如下:

  a) 菜单Tools / PROC 项;

  b) 当出现没有Exam01.pre 的对话框时单击OK,此时弹出PROC预编译对话框;

  c) 利用菜单中的加入项或单击“+”按钮,将进行预编译的源文件如Exam01.pc及其路径添加到预编译对话框的Input项中,即Input项中出现E: \ PROCW \ Exam01 \ Exam01.pc。此时在Output项中自动显示输出文件如Exam01.c和路径(必要时可修改文件名和路径),即Output项中出现E: \ PROCW \ Exam01 \ Exam01.c;

  d) 若有需要,双击预编译对话框的Options选项处,对弹出的Options选项对话框,选择需要的预编译选项(一般情况下不做该步,即采用缺省预编译选项);

  e) 单击工具条最右边的预编译图标,进行预编译;

  f) 预编译结束,若出现询问保存Exam01.pre 文件时,应选择OK进行保存,完成预编译;

  g) 如果预编译结束,预编译对话框左边显示的状态图标为黄色(警告)或红色(预编译失败)时,应双击该标识观察帮助或出错信息。预编译失败,应当重做4.2节中编辑工作,修改源程序,再进行预编译,直到通过预编译。

  4、编译准备

  为了使工程能通过编译,需要将预编译输出的工程源文件和Oracle支持SQL在VC环境下的运行库文件加入到工程中,下面具体介绍增加这两个文件的步骤。

  1) 将预编译的输出文件加入工程

  a) 菜单Project / Add To Project 项 / Files 项;

  b) 在文件对话框中选择正确路径(见4.2节和4.3节),选定预编译输出的文件如Exam01.c,单击“打开”按钮,即将预编译输出的工程源文件加入工程。

  2) 将运行库文件加入工程

  a) 菜单Project / Add To Project 项 / Files 项;

  b) 将文件对话框的文件类型改为“所有文件”;

  c) 路径选为Oracle_HOME \ Ora81 \ PRECOMP \ LIB \ MSVC;

  d) 选择OraSQL8.LIB文件,单击“打开”钮,完成将运行库文件加入工程。

  5、编译链接

  a) 按F7键或单击编译图标,对工程进行编译链接。如果没有出现错误,则通过编译链接,生成可执行文件如Exam01.exe ;

  b) 如果编译链接出现错误,返回到4.2节,选择相应的预编译源文件如Exam01.pc进行修改并保存;然后按4.3节做预编译,预编译通过后,单击OK按钮用新的 .c文件代替原来的C源文件;此时重新按F7键进行编译链接,直到排除所有错误,生成可执行文件如Exam01.exe。

  6、运行工程

  a) 按Ctrl_F5键或单击执行图标运行工程Exam01.exe。按工程中的提示,逐步正确运行;

  b) 如果运行中出现错误,返回到4.2节修改相应预编译源文件,再按4.3节做预编译,按4.5节进行编译链接,生成新的可执行文件,然后重新运行工程,直到正确实现工程的规定任务。

  编程举例

  1、程序内容

  一般SQL嵌入式程序主要有说明、包含头文件、子程序声明、主程序和子程序等部分组成,在主程序中调用有关子程序。必备的子程序通常有连接到数据库子程序、断开数据库子程序、错误处理子程序和完成某项具体事务(如查询、插入、修改、删除等)的工作子程序。

  2、程序举例

  下面是一完整的可通过预编译、编译链接和运行的示例程序。

  /* exam01.pc 开发Oracle接口程序举例 */

  /* 说明:本程序介绍用PROC开发Oracle库接口的编程特点。通过向AUTHS

  * 表输入作家代码,查询作家姓名及工资。运行前应建表、插入数据并提交。*/

  #include <stdio.h>

  #include <string.h>

  #include <stdlib.h>

  /* 包含SQL通讯区,它用于处理错误。*/

  #include <sqlca.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);

  username.len=(unsigned short)strlen((char *)username.arr);

  printf("\n输入口令:");

  gets(password.arr);

  password.len=(unsigned short)strlen((char *)password.arr);

  printf("\n输入服务器名:");

  gets(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", username.arr, 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输入作家代码: ");

  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;

  /* 出现SQL错误,继续往下执行。 */

  EXEC SQL WHENEVER SQLERROR CONTINUE;

  printf("\n%s\n", msg);

  buf_len=sizeof(err_msg);

  /* 调用函数sqlglm()获得错误消息。 */

  sqlglm(err_msg, &buf_len, &msg_len);

  printf("%.*s\n", msg_len, err_msg);

  /* 回退事务,断开连接,退出程序。 */

  EXEC SQL ROLLBACK RELEASE;

  exit(EXIT_FAILURE);

  }

  3、建表和插入数据记录

  上述示例程序如要正确运行,还需以Oracle库的合法用户登录,并创建AUTHS表和插入一些数据记录。建表文件、建表命令和插入数据记录的示例命令如下所述。这里叙述的工作完成后,上节生成的可执行文件才能正确运行。

  REM 以下为建表文件auths.SQL

  DROP TABLE auths CASCADE CONSTRAINTS

  /

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

  /

  REM 下一行为在PL/SQL环境中运行建表文件的命令

  REM @ E: \ PROCW \ Exam01 \ auths.sql

  REM 下一行为在PL/SQL环境中向auths表插入数据的命令,插入后应提交(COMMIT)!

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

0
相关文章