对每条SQL语句的访问计划,它存放在DB2数据库服务器上。应用程序执行到SQL语句时,就到相应的服务器上去找它们的PACKAGE,数据库服务器根据PACKAGE执行具体的数据库操作。所以,如果一个应用程序访问了多个数据库服务器,则该应用程序应在它访问到的数据库服务器上均生成相应的PACKAGE。因此,当遇到这种情况时,推荐的方式是将源程序分成若干个文件,每个文件只访问一个服务器,然后分别进行预编译。
执行PREP命令时,加上选项PACKAGE或不注明BINDFILE、SYNTAX或SQLFLAG选项,这时BIND操作将自动进行。
直接使用BIND命令从BIND文件中生成PACKAGE存放在数据库管理器中。BIND完成的功能是,从数据库中找到SQL语句所涉及的表,查看SQL语句中提到的表名及属性是否与数据库中的表名和属性相匹配,以及应用程序开发者是否有权限查询或修改应用程序中所涉及到的表及属性。这就是为什么在预编译之前要连接到相应的数据库上的原因。在做BIND操作后,在数据库管理器中就生成一个PACKAGE,PACKAGE的名字与源程序的文件名字相同。
一个源文件在数据库中可有多个PACKAGE存在。为了区分不同的PACKAGE,DB2中引入了时间戳的概念。在PREP执行时,系统对生成的修改过的C语言程序和BIND文件以及PACKAGE中都加入了一个时间戳。BIND文件在生成PACKAGE时也将时间戳传递下来,修改过的C语言程序在生成可执行程序时,同样也将时间戳传递下去。当应用程序运行时,可执行程序是通过时间戳找到相应的PACKAGE,如果时间戳不匹配,则说明版本更新,需要做BIND。
6 事务
所谓事务,就是一系列应用程序和数据库之间交互操作的集合。一旦一个事务开始执行,则事务中的操作要么全部执行,要么全部不执行。
事务开始:DB2事务是隐式开始的,除了下列的一些语句,其他任何一个可执行的SQL语句都隐式地开始一个事务。
BEGIN DECLARE SECTION END DECLARE SECTION
DECLARE CURSOR INCLUDE SQLCA INCLUDE SQLDA
WHENEVER
事务结束:事务由一个可执行的SQL语句开始,后面执行的所有SQL语句都将属于同一个事务,该事务一直遇到COMMIT或ROLLBACK命令时才结束。
COMMIT操作的作用是,结束当前的事务,事务对数据库所做的修改永久化。ROLLBACK的作用是,结束当前的事务,将被修改的数据恢复到事务执行以前的状态,即取消事务执行产生的影响。当程序结束时,系统自动隐式地执行COMMIT操作,如果系统检测到死锁等故障,则隐式地执行ROLLBACK操作。
CICS CLIENT调用
通用流程(最简)和调用方法:
EasyCics提供以下支持文件供开发者使用:
ec.h (C语言头文件)
ec.c
ec.umk(for UNIX)或ec.nmk(for NT)
由此编译生成:ec.o(for UNIX),或ec.obj(for NT) ecx.h (C++语言头文件)
ecx.c
ecx.umk(for UNIX)或ecx.nmk(for NT)
由此编译生成:ecx.o(for UNIX),或ecx.obj(for NT) EasyCICS Client OLE安装程序,安装生成EcOle.dll。 确保安装CICS客户程序之后再安装EasyCICS。
对Win9x/NT客户,应重新启动机器,以保证在PATH环境变量中含有CICS客户程序的
安装注意事项:
执行目录。对WIN9X客户,有时需要增加环境变量的内存空间,办法是在c:\\config.sys文件中加入以下一行内容:
SHELL=c:\\command.com c:\\ /E:2048 /P ? ? ? ? ?
声明\EasyCics.App\组件接口 调用ConnectServer接口函数 调用BeginWrite接口函数
使用SetValue接口函数设置输入的条件(可以) 调用CallProgramAndCommit接口函数
使用GetValue接口函数或RsOpen接口函数得到输出的结果
说明:CICS SERVER端程序的作用类似于DLL,CICS接口就是如何调用DLL;
使用C函数库和头文件
以下是使用C开发EasyCICS的要点:
1. EasyCics通过Ec.h和Ec.c文件提供访问EasyCics Client C API的支持。 2. 在C源文件加入以下声明:
#include \
3. 连接时加入Ec.c生成的目标文件。
#include \
int get_custinfo(char * custid) { int r; char sum_str[20];
r=ConnectServer(\if(r!=0)return(0);
SetValue(\
}
SetValue(\TE\
CallProgramAndCommit(\GetValue(\GetValue(\GetValue(\sum=atof(sum_str); return(1);
int get_spinfo(char *txm) {
int r;
char price_str[200],kcl_str[200],result[20];
/* r=ConnectServer(\ if(r!=0)return(0); */ }
int set_sale() {
int r,k;
char qty_str[230],result[20]; SetValue(\SetValue(\
CallProgramAndCommit(\GetValue(\if (strcmp(result,\ GetValue(\ } return 0;
GetValue(\GetValue(\price=atof(price_str); GetValue(\kcl=atof(kcl_str); spname[20]='\\0'; return(1);
/* r=ConnectServer(\ if(r!=0) return(0);
RsSetColNameList(\TE\*/ RsCreate(4); for(k=0;k<=currow-1;k++){ }
RsAddRow();
RsSetCol(1,item_id[k]); RsSetCol(2,custid);
sprintf(qty_str,\RsSetCol(3,qty_str); RsSetCol(4,date); RsSaveRow();
}
CallProgramAndCommit(\GetValue(\if(strcmp(result,\
return(0);
return 1;
连接CICS SERVER
使用OLE对象:
oEc = CreateObject(\
r = oEc.ConnectServer(\if r<>0 then wait window \
return End if
调用CICS服务:
清空缓冲区: =oEc.BeginWrite() 设置参数:
oEc.SetValue 参数名,参数值 例子:
oEc.SetValue \oEc.SetValue \oEc.SetValue \