2.正式开始编译前,需要和DB2数据库(如:TESTDB)建立连接。
以linux环境为例,在命令行状态下,输入:db2
connect
to
TESTDB
3.调用DB2的prep命令对SQC文件进行预编译,用来生成C文件。
在命令行状态下,输入:db2
prep
test.sqc
BINDFILE
package
using
bindtest
说明:
上述命令中的“BINDFILE”是用来指定在做预编译的同时生成bind文件的(如:bindtest.bnd)
上述命令中的“package
using
bindtest”是用来指定将要写入到DB2的系统表中的package信息的名称(如:bindtest)。
bind文件里记载的是用来写入到package信息的数据。
4.调用DB2的bind
命令从上一步生成的bind文件中读出必要的数据写入到上一步指定名称的package信息中。
并可以给这条信息指定访问权限。
以linux环境为例,在命令行状态下,输入:db2
bind
ConnTEST.bnd
GRANT
PUBLIC
5.到目前为止可以说与DB2相关的所有预编译就基本完成了,我们需要的C文件(如:test.c)也整成生成了,那个bind文件后边暂时不会用到了。
下来就可以调用CC或GCC之类的C代码编译器对这个C文件进行编译,基本的过程是test.c→test.o→test。这样我们就可以执行这个最终的可实行程序了。
Windows下使用C语言+嵌入SQL实现DB2开发 Cygwin,gcc的介绍和安装在前面的文章有将过,请参考在Windows中使用Cygwin环境下的gcc编译器编译Informix ESQ/C程序
对于DB2的嵌入SQL程序,有以下步骤:
1)编写dbconn.sqc程序(一个简单的连接数据库,查询并显示的例子)2)在Cygwin命令行中键入 db2cmd 启动一个新的db2命令行窗口
在db2命令行窗口中:
3)预编译
db2 prep dbconn.sqc
生成dbconn.c文件
4)编译
gcc -I"C:\Program Files\IBM\SQLLIB\include" dbconn.c "C:\Program Files\IBM\SQLLIB\lib\db2api.lib"
生成a.exe文件
在C程序>文章中提到在使用gcc编译时如果路径中包含空格的路径,就不能正确解析。
这次发现可以将路径用双引号引起来就可以了。
5)执行a.exe,成功
如果需要生成外部绑定文件,(db2执行预编译时默认是做绑定了)
1)db2 prep dbconn.sqc bindfile
生成
dbconn.c, dbconn.bnd
2)手工绑定
db2 bind dbconn.bnd
3)绑定完后一定要重新编译,否则报-818,
db2 ? SQL0818
预编译时由预编译器生成的时间戳记与绑定时存在的包内的时间戳记不同
附录1
dbconn.sqc程序
#include
#include
#include
int main()
{
EXEC SQL INCLUDE SQLCA
EXEC SQL BEGIN DECLARE SECTION
char firstnme[12+1]
EXEC SQL END DECLARE SECTION
long RetCode = SQL_RC_OK
char ErrorMsg[1024]
EXEC SQL CONNECT TO sample USER zhangjij USING happyday
EXEC SQL SELECT firstnme INTO :firstnme FROM employee WHERE empno='000099'
if (sqlca.sqlcode != SQL_RC_OK)
{
RetCode = sqlaintp(ErrorMsg, sizeof(ErrorMsg), 70, &sqlca)
switch (RetCode)
{
case -1:
printf("ERROR: Insufficient memory.\n")
break
case -3:
printf("ERROR: Message file is inaccessible.\n")
break
case -5:
printf("ERROR: Invalid SQLCA, bad buffer, or bad buffer length specified.\n")
break
default:
printf("sqlca.sqlcode=[%ld], Message= [%s] \n", sqlca.sqlcode, ErrorMsg)
break
}
}
printf("OK = [%s] \n", firstnme)
EXEC SQL DISCONNECT CURRENT
return(0)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)