0
这篇文章是我看CSDN的帖子发现的,我觉得应该对我自己也好,大家也有多少有点帮助的!
详情请看:

UPCC(杂食动物) :

我觉得你的格式有点“特别”,我给你看看我写过的一个类的一个函数吧

int COracle::CheckNote(int& status)
{
 ConnectDB(szUser, szPwd, szServer);
 EXEC SQL BEGIN DECLARE SECTION;
   int statu;
 EXEC SQL END DECLARE SECTION;
 EXEC SQL CALL cp_atm_run_statu_smi_deal(:statu);
 if(sqlca.sqlcode)
 {
   status = statu;
   EXEC SQL ROLLBACK WORK RELEASE;
   throw CError(sqlca.sqlerrm.sqlerrmc, ERR_NOTE_CHECK, errno, 'D', 'M');
 }
 EXEC SQL COMMIT WORK RELEASE;
 status = statu;
 return SUCCESS;
}


其实字符串不要使用text*来传递,

看我的连接:ConnectDB
 EXEC SQL BEGIN DECLARE SECTION;
   char User[30];
   char Pwd[30];
   char Server[30];
 EXEC SQL END DECLARE SECTION;
 sprintf(User, "%s", user);
 sprintf(Pwd, "%s", pwd);
 sprintf(Server, "%s", server);
 EXEC SQL CONNECT :User IDENTIFIED BY :Pwd USING :Server;
 if(sqlca.sqlcode)
   throw CError(sqlca.sqlerrm.sqlerrmc/*"Connect DataBase Error"*/, ERR_UNKOWN, errno, 'D', 'H');

这样的格式是不是很容易看懂?



jixingzhong(瞌睡虫:选择了远方,只顾风雨兼程!) :

连接到SAMPLE数据库,查询LASTNAME为JOHNSON的FIRSTNAME信息。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "util.h"
#include <sqlca.h>
EXEC SQL INCLUDE SQLCA; (1)
main()
{
EXEC SQL BEGIN DECLARE SECTION; (2)
char firstname[13];
char userid[9];
char passwd[19];
EXEC SQL END DECLARE SECTION;
EXEC SQL CONNECT TO sample; (3)
EXEC SQL SELECT FIRSTNME INTO :firstname (4)
FROM employee
WHERE LASTNAME = 'JOHNSON';(4)
printf( "First name = %s\n", firstname );
EXEC SQL CONNECT RESET; (5)
return 0;
}
上面是一个简单的静态嵌入SQL语句的应用程序。它包括了嵌入SQL的主要部分:
(1)中的include SQLCA语句定义并描述了SQLCA的结构。SQLCA用于应用程序和数据库之间的通讯,其中的SQLCODE返回SQL语句执行后的结果状态。
(2)在BEGIN DECLARE SECTION和END DECLARE SECTION之间定义了宿主变量。宿主变量可被SQL语句引用,也可以被C语言语句引用。它用于将程序中的数据通过SQL语句传给数据库管理器,或从数据库管理器接收查询的结果。在SQL语句中,主变量前均有“:”标志以示区别。
(3)在每次访问数据库之前必须做CONNECT操作,以连接到某一个数据库上。这时,应该保证数据库实例已经启动。
(4)是一条选择语句。它将表employee中的LASTNAME为“JOHNSON”的行数据的FIRSTNAME查出,并将它放在firstname变量中。该语句返回一个结果。可以通过游标返回多个结果。当然,也可以包含update、insert和delete语句。
(5)最后断开数据库的连接。
从上例看出,每条嵌入式SQL语句都用EXEC SQL开始,表明它是一条SQL语句。这也是告诉预编译器在EXEC SQL和“;”之间是嵌入SQL语句。如果一条嵌入式SQL语句占用多行,在C程序中可以用续行符“\”。

PRO*C 工作原理

   PRO 系列是ORACLE 公司提供的在第三代高级程序设计语言中嵌入SQL 语句来访问数据库的一套预编译程序,包括PRO*Ada、PRO*C、PRO*COBOL、PRO*Fortran、PRO*Pascal 和PRO*PL/I 六种。程序员用相应的高级语言编写嵌入SQL 语句的PRO 源程序(若用C 语言则称为PRO*C 源程序)后运行相应的预编译程序,把嵌入的SQL 语句转换为标准的ORACLE 调用并生成目标源程序,即纯高级语言格式的源程序,然后就可以将这些源程序加入用户的程序中调用,其处理过程如下图。

   ORACLE 预编译程序提供如下功能:

   ⑴能用六种通用的高级程序设计语言中的任何一种编写应用程序。

   ⑵遵循ANSI 标准,在高级语言中嵌入SQL 语句。

   ⑶可采用动态SQL 方法,让程序在运行时接受或构造一个有效的SQL 语句。

   ⑷实现ORACLE 内部数据类型和高级语言数据类型之间的自动转换。

   ⑸可通过在应用程序中嵌入PL/SQL 事物处理块来改进性能。

   ⑹能在程序行和命令行上指定所需要的预编译可选项,并可在预编译的过程中改变它们的值。

   ⑺能全面检查嵌入的SQL 数据操纵语句和PL/SQL 块的文法和语义。

   ⑻可用SQL*Net 并行存取多个地点的ORACLE 数据库。

   ⑼可把数组作为输入和输出程序变量使用。

   ⑽能对应用程序中的代码段进行条件预编译。

   ⑾提供了较强的异常处理功能。

   由此可见,通过预编译程序与其它高级语言的结合,既可以利用SQL 强有力的功能和灵活性为数据库应用系统的开发提供强有力的手段,又可以充分利用高级语言自身在系统开发方面的优势,从而提供一个完备的基于ORACLE 数据库应用程序的开发解决方案。

   2.2 在VC 中使用PRO*C

   每个PRO*C 源文件一般由程序头和程序体两部分组成。程序头包含宿主变量(SQL 语句中所包含的变量)说明、通讯区定义和C 外部表示符的说明等。程序体一般是由若干函数组成,这些函数内含有SQL 语句(以EXEC SQL 起头的语句)。

   PRO*C 支持的数据类型包括VARCHAR2( 变长字符串)、NUMBER( 二进制数)、INTGER( 有符号整数)、FLOAT( 浮点数)、STRING( 以NULL 结尾的字符串)、VARNUM( 变长二进制数)、LONG( 变长字符串)、VARCHAR( 变长字符串)、ROWID( 二进制值)、DATE( 定长日期/ 时间值)、VARRAW( 变长二进制数据)、RAW( 定长二进制数据) 、LONGRAW( 变长二进制数据)、UNSIGNED( 无符号整数)、LONGVARCHAR( 变长字符串)、LONGVARRAW( 变长二进制数据)、CHAR( 定长字符串)、CHARZ(C 中定长以NULL 结尾的字符串)、MLSLABEL( 变长二进制数据)。

   在PRO*C 中不能使用'l' 或'u' 作词尾或'0x' 作词头修饰常量;在SQL 语句中使用单引号来定义字符串,用双引号来定义特殊的或小写字符的标识符( 如表名等);SQL 语句中不允许使用C 中的寻址、间接、位逻辑、复合赋值、?=、-、++、%、<<、>> 操作符并且用NOT、AND、OR、= 代替!、&&、||、==。

   下面的程序是一个联结数据库的PRO*C 源程序例子。

#include < sqlca.h > //声明SQL通讯区
#include < string.h >
#include < afxwin.h >
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR username[20]; //声明宿主变量
VARCHAR password[20];
VARCHAR dbname[20];
EXEC SQL END DECLARE SECTION;
void db_connect()
{
strcpy((char *)username.arr,"SCOTT");
username.len = strlen((char *)username.arr);
strcpy((char *)password.arr,"TIGER");
password.len = strlen((char *)password.arr);
strcpy((char *)dbname.arr,"SUNDB");
dbname.len = strlen((char *)dbname.arr);
EXEC SQL WHENEVER SQLERROR STOP; //隐式异常处理
EXEC SQL CONNECT :username
IDENTIFIED BY :password USING :dbname;
/*if (sqlca.sqlcode != 0) //显式异常处理
{
AfxMessageBox("\n与Oracle数据库连接失败!");
return;
}*/
}

Tags: , | 引用(0)
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]