设为首页 收藏本站
查看: 1142|回复: 0

[经验分享] 在C中嵌入SQL语句访问DB2数据库(转载)

[复制链接]

尚未签到

发表于 2016-11-18 08:46:34 | 显示全部楼层 |阅读模式
  本文来自【http://www.cppblog.com/prayer/archive/2008/09/03/60795.html】

  SQL/C学习笔记 在C中嵌入SQL
  公司最近有个项目,需要在Linux下访问DB2数据库,Linux在我机器上装了好几年了也没碰过,郁闷。DB2
  就只是听说过,没有见过。C倒是用过一段时间。于是打开百度,狗狗开搜。
于是找到一部分文章,从中找了一些代码:短小,感觉适合入门。被我改了改,程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "util.h"
#include <sqlca.h>
EXEC SQL INCLUDE SQLCA;
main()
{
EXEC SQL BEGIN DECLARE SECTION;
char firstname[130];
char userid[9];
char passwd[19];
EXEC SQL END DECLARE SECTION;
  EXEC SQL CONNECT TO Test;
EXEC SQL SELECT SEALNAME INTO :firstname
FROM SEAL fetch first 1 row only;
  printf( "First name = %s\n", firstname );
EXEC SQL CONNECT RESET;
return 0;
}
我就不解释这段程序了,网上一搜解释的都比我好。一会最后贴出原贴方便以后使用。
打开VC编辑环境,将代码贴了进去。编译。我考,一堆错误,说什么不认识EXEC ....,这是怎么回事啊
  ,难道是少包含了头文件,赶快找啊。找了一堆,加上,外甥打灯笼-照旧(招舅)。TNND,再查。
  好长时间过去了,怎么得有几个小时吧,狗狗都累了。最后才明白,VC编译器不能直接编译这种代码,(
  我突然觉得怎么有点像ASP呢,混在一起)必须先使用预处理器将这些代码转换成c代码,VC编译环境才能
  认。那怎么转换呢?使用什么样的预处理器呢?再查,忘了是从哪查到一个 DB2 prep *.sqc bindfile命
  令,感觉上这个可以了,马上运行cmd打开控制台,输入试,N次后我差点一屁股就坐地上了,前面带了个
  DB2,应该是在DB2的命令行下运行吧,于是在bin下找到了什么exe来着,就是命令行工具中的全集窗口。
  打开,输入,兴奋啊。在我可爱的sqc文件旁边出了个.c的文件,哈哈,就是他了。
  或许是我高兴的太早,或许是我运气不好,该例子始终过不去,没报什么错
,NND。这是为啥?!难道我的SQL语句错了?!在DB2的控制台下再试,考,成功。再运行我的程序,还
  是报这个错。改程序,或许是我的Select 语句不行,我建个表试试不取数据总行吧。于是有了如下的代
  码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "util.h"
#include <sqlca.h>
  EXEC SQL INCLUDE SQLCA;
#define CHECKERR(CE_STR) if (check_error (CE_STR, &sqlca) != 0) return 1;
  int check_error (char eString[], struct sqlca *caPointer)
{
char eBuffer[1024];
char sBuffer[1024];
short rc, Erc;
if (caPointer->sqlcode != 0)
  {
  printf ("--- error report ---\n");
  printf ("ERROR occured : %s.\nSQLCODE : %ld\n", eString,
  caPointer->sqlcode);
}
return 0;
}
  int main(int argc, char *argv[])
{
EXEC SQL BEGIN DECLARE SECTION;
char firstname[13];
char userid[9];
char passwd[19];
EXEC SQL END DECLARE SECTION;
printf( "Sample C program: STATIC\n" );
if (argc == 1)
{
  EXEC SQL CONNECT TO test user test using hdshtest;
  CHECKERR ("CONNECT TO SAMPLE");
}
else if (argc == 3)
{
  strcpy (userid, argv[1]);
  strcpy (passwd, argv[2]);
  EXEC SQL CONNECT TO test USER :userid USING :passwd;
  CHECKERR ("CONNECT TO SAMPLE");
}
else
{
  printf ("\nUSAGE: static [userid passwd]\n\n");
  return 1;
} /* endif */
  // create table
  EXEC SQL CREATE TABLE tbname(col1 SMALLINT,
                                       col2 CHAR(7),
                                       col3 VARCHAR(7),
                                       col4 DEC(9, 2),
                                       col5 DATE,
                                       col6 BLOB(5000),
                                       col7 CLOB(5000));
  CHECKERR("Table -- Create");
  EXEC SQL COMMIT;
    CHECKERR("Transaction -- Commit");

/*
     
     EXEC SQL SELECT account.moneytype INTO :firstname FROM test.account fetch first
  1 row only;
*/
EXEC SQL SELECT name INTO :firstname FROM accounttype where id = '1';
CHECKERR ("SELECT statement");
printf( "First name = %s\n", firstname );
EXEC SQL CONNECT RESET;
CHECKERR ("CONNECT RESET");
return 0;
}
/* end of program : STATIC.SQC */
  重复上述步骤,重新生成了.C的文件,还是出不了我要的结果,但是我加上出错处理了, 先看看出错信
  息,出错信息如下:
sqlcode:  -805
sqlstate:  51002
这是什么东西?再搜。我可是在百度上搜了N分钟啊。大多是java的,看不懂。老天不负我有心人呐,最
  终找到了解释:
  请问db2的这个错误是什么意思?
  DB2 SQL error: SQLCODE: -805, SQLSTATE: , SQLERRMC: NULLID.SYSSH200
  回答:
解释:  此信息 (SQLCODE) 的可能原因是:
  o   未在数据库中定义指定的程序包或程序。
  o   未联编该程序或它已被卸下。
  o   正在运行的应用程序未与数据库联编。
  o   若试图运行 DB2 实用程序或 CLI 应用程序, 则 DB2
    实用程序可能需要重新联编至数据库。
  不能处理该语句。
  用户响应:
指定正确的程序包名或联编该程序。若正在运行的应用程序未与数据库联编
,则与数据库管理员联系以执行必需的联编。
  若 DB2
实用程序需要重新联编至数据库,则当连接至数据库时,数据库管理员可以
通过从实例的 bnd 子目录发出下列 CLP 命令之一来完成此操作: 
  o   对于 DB2 实用程序,发出 "DB2 bind @db2ubind.lst blocking all
    grant public"。
  o   对于 CLI,发出 "DB2 bind @db2cli.lst blocking all grant
    public"。
  联合体系统用户:确保在适用的数据源上联编 联合体服务器
所必需的程序包。参考&#8220;安装和配置补遗&#8221;指南以获取有关将程序包与数据
源联编的详情。
  sqlcode:  -805
  sqlstate:  51002
当真是遇上救星了?于是乎,我将刚才搜到的信息总结了一下,三句话:
  如果您打完补丁10后,您需要对每一个数据库执行
db2 terminate
db2 CONNECT TO <dbname>
db2 BIND <path>/db2schema.bnd BLOCKING ALL GRANT PUBLIC sqlerror continue
db2 terminate
  DB2 bind @db2ubind.lst blocking all grant public
DB2 bind @db2cli.lst blocking all grant public
  bind "C:\Program Files\IBM\SQLLIB\BINtestmain.bnd" BLOCKING ALL GRANT PUBLIC sqlerror
  continue
  如上在DB2后输入的上述命令,我晕,程序还是不对。不能出来正确结果。今天注定我一晚上睡不好吗?
就是我要失去信心的时候,发现了在我的.c的旁边一直躲着个.bnd的文件。考,再bind一次这个家伙。哈哈哈,我要的结果出来了!爽,痛快,写下来,省得过几天忘了,有做这方面的朋友也可以少走些弯路,呵呵。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-301906-1-1.html 上篇帖子: db2死锁分析与处理 下篇帖子: DB2 数据库安全总述
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表