C语言中使用嵌入式SQL访问Oracle数据库

本文介绍了如何使用C语言通过嵌入式SQL访问Oracle数据库,讲解了从编写pc源文件到预编译、编译和运行的详细步骤,包括预编译选项的设置和VS2017项目配置。
摘要由CSDN通过智能技术生成

    使用C语言开发Oracle应用程序通常有两种方法。一是利用嵌入式SQL语言,将SQL作为子语言嵌入到C语言中,借助C语言访问Oracle以及实现过程化控制和复杂计算。二是利用Oracle调用接口(Oracle Call Interface简称OCI),通过调用一系列OCI函数即可访问数据库。我在这里介绍的是前一种方法。另外,在本文中,我重点介绍的是利用C语言开发Oracle应用程序的流程和步骤,而对嵌入式SQL的语法不会过多介绍,如果想了解详细语法,我在这里可以推荐一本书,书名是《Oracle 11g Pro*C\C++编程艺术》,此书对Oracle嵌入式SQL有详细详解,非常适合做新手入门教材,电子版在网上有,请需要的读者自行查找,

一、工具

    Oracle 11g、vs2017、win10

二、概述

    要用C语言开发Oracle应用程序,首先编写包含嵌有SQL语言的C语言的源代码,后缀名为pc,然后将代码通过Oracle自带的预编译工具Proc将SQL语句转为对Oracle运行库函数(SQLLIB)的调用,预编译后的代码即为C语言源代码,再将预编译后的代码拷到vs中,经过vs编译、链接和运行后,相应的Oracle应用程序即开发完成。过程如下图所示。

                                                                 

 

三、详细步骤

1.编写pc源文件。注意,编码格式应为ANSI编码,如果使用其他编码,可能会报错。例如,我使用UTF-8编码,会报如下图所示错误。

                                                              

 

    示例源代码test.pc如下所示。此代码的功能是查询表STUDENT中学号为2005的学生的学生姓名。

#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sqlca.h>

//我最后用C++编译器编译此文件,不加“extern "C"”会报错
//如报错:无法解析的外部符号
extern "C" unsigned int sqlgls(char *, size_t *, size_t *);

//连接数据库
void connect()
{
	EXEC SQL BEGIN DECLARE SECTION;
	char username[20], password[20];
	EXEC SQL END DECLARE SECTION;

	strcpy_s(username, strlen("scott") + 1, "scott");
	strcpy_s(password, strlen("tiger") + 1, "tiger");
	EXEC SQL CONNECT : username IDENTIFIED BY : password;
}

//断开连接,提交事务
void release()
{
	EXEC SQL COMMIT RELEASE;
}

//错误处理函数,当访问数据库出错时,会中止程序执行,打印错误信息
void sql_error()
{
	char stm[100];
	size_t sqlfc, stmlen = 100;
	unsigned int i;
	i = sqlgls(stm, &stmlen, &sqlfc);
	printf("出错语句为:%.*s\n", stmlen, stm);
	printf("%.*s\n", sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc);
	system("PAUSE");
	exit(1);
}

int main()
{

    //主变量说明
	EXEC SQL BEGIN DECLARE SECTION;
	char name[9];
	int sno;
	EXEC SQL END DECLARE SECTION;
	
	//错误处理
	EXEC SQL WHENEVER NOT FOUND DO sql_error();
	EXEC SQL WHENEVER SQLERROR DO sql_error();
	EXEC SQL WHENEVER SQLWARNING DO sql_error();
	
    connect();
	
	sno=2005;
	
	EXEC SQL SELECT SNAME INTO :name
	FROM STUDENT
	WHERE SNO=:sno;
	
	printf("学号为2005的学生是%s\n",name);
	
	release();
	
	system("PAUSE");
	return 0;
}

2、预编译pc源程序。在命令行中输入命令proc,再加上一些预编译选项即可。常用预编译选项有INAME,INCLUDE,CODE,PARSE,CHAR_MAP等。INAME指定要预编译的文件名,当该选项是命令行第一个选项时,可省略“INAME=”。INCLUDE选项用于指定#include或EXEC SQL INCLUDE所对应的头文件所在路径。CODE选项用于指定预编译器所生成的C函数原型格式,可为ANSI_C,KR_C或CPP。PARSE指定解析pc源文件的方法,PARSE=FULL时,使用C解析器解析;PARS

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值