DB2 - C 嵌入式 SQL 不会插入一行

Posted

技术标签:

【中文标题】DB2 - C 嵌入式 SQL 不会插入一行【英文标题】:DB2 - C embedded SQL won't insert a row 【发布时间】:2020-04-03 16:24:09 【问题描述】:

我正在尝试构建一个 C 程序来生成部分随机字符串并在循环中将大量字符串插入到 db2 行中,因此我需要它从嵌入式 SQL 插入...。该程序执行除插入之外的所有操作。

我可以进行选择查询、c 编译器、db2 预编译器和绑定器都可以毫无错误地执行。 它甚至不允许我使用硬编码变量进行插入,更不用说使用主机变量了,并且从终端行查询完全成功

db2 "INSERT INTO
 SYT006_COUNTRY(SL_ISO2,BZ_COUNTRY,KZ_RISK)
 VALUES
 ('XY', 'wont work from embedded SQL', 'R')"

主机变量定义为 char 数组,多了一个位置作为终止符。平台是 Ubuntu。

我尝试了一百万件事,所以这里是代码.. 编辑所有过时的内容

    #include <stdio.h>
    #include <string.h>
    #include <sqlca.h>
    #include <stdlib.h>
    #include <sqlenv.h>
    #include <sqlcodes.h>
    #include <sqlutil.h>
    #include <time.h>
    #include "utilemb.h"
    #include "sqlaprep.h"

    /* SQL includes */
      EXEC SQL INCLUDE SQLCA;
      EXEC SQL BEGIN DECLARE SECTION;

      EXEC SQL DECLARE     SYT006_COUNTRY TABLE
                (
                  KEYFIELD                            INT,
                  SL_ISO2                             CHAR(2) NOT NULL,
                  BZ_COUNTRY                          CHAR(30) NOT NULL,
                  KZ_RISK                             CHAR(1) NOT NULL
                ) ;


        char       hostVar[31];

      EXEC SQL END DECLARE SECTION;

    int main()
    
      /* connect to the database REQUIRED */
    printf("Connecting to database...\n ");
    EXEC SQL CONNECT TO "sample";
    if (SQLCODE  <0)
    
       printf("Connect Error. Code: %d\n",  sqlca.sqlcode);
    
    else
    
       printf("Connected to database. Code: %d\n",sqlca.sqlcode );
    

    /* works only from command line terminal*/
      EXEC SQL
      INSERT INTO
      SYT006_COUNTRY(SL_ISO2,BZ_COUNTRY,KZ_RISK)
      VALUES
      ('XY', 'please', 'R');


    /* this one works perfectly normal*/
    /*
        EXEC SQL SELECT BZ_COUNTRY INTO :hostVar
        FROM SYT006_COUNTRY WHERE   KEYFIELD = 515;
        printf("printing hostVar: %s\n", hostVar);
    */
        printf("MAIN FINISH \n");
    return (0);
    /*end main*/

我得到的唯一不正常的事情是当我从我的 shell 脚本启动 db2 时:

SQL5043N 对 DB2COMM 环境变量中指定的一种或多种通信协议的支持未能成功启动。但是,核心数据库管理器功能已成功启动。 SQL1063N DB2START 处理成功。

【问题讨论】:

还没有 COBOL。这都是 SQC,而不是预编译的 C。在代码的末尾有两个查询。选择一直在做这项工作,插入没有。一切都编译,sqlca.sqlcode 返回零,但该行未写入数据库。如果我在终端中写入相同的查询,它会写入数据库然后... 如果我理解 IBM 在这里所说的正确:-ibm.com/support/knowledgecenter/SSEPEK_10.0.0/sqlref/src/tpc/…,您声明了一个表。这与使用 CREATE TABLE 不同。声明的表仅用于语法检查,不用于保存持久数据。 该表不是在 sqc 中创建的,而是从命令行创建的。创建查询就在 cmets 下的代码中。创建是一次性工作 【参考方案1】:

没有比第二天一杯咖啡更好的了。 Embedded-SQL 程序需要一行

EXEC SQL COMMIT;

【讨论】:

以上是关于DB2 - C 嵌入式 SQL 不会插入一行的主要内容,如果未能解决你的问题,请参考以下文章

DB2操作

当嵌入式键包含 SQL Server 上的标识列时,休眠插入失败

嵌入式数据库 --- sqlite3的基本操作

[转]什么是Pro*C/C++,嵌入式SQL,第一个pro*c程序,pro*c++,Makefile,Proc增删改查

嵌入式SQL语言

嵌入式SQL语言