经典提问:数据库插入不成功原因请教!!

发布于 2022-09-27 11:28:42 字数 5624 浏览 11 评论 0

我编写了个子程序int insert_sql(ONLINEINFO_LIST **online_head),实现把链表中的数据更新到数据库的USER_SNMP_DETECT表中去。
思路是:对链表中的每一个结点,先更新,如果sqlca.sqlcode=1403,则插入。
可是,执行时,可以更新数据,但只要某个结点的值不在数据库中,程序就跳过了 更新和插入语句,而去执行下一次的for循环。
更奇怪的是,我把这个程序体放到调用该程序的主程序中去时,程序运行就是正确的,可以更新,也可以实现插入操作。我实在是搞不明白是怎么回事。希望高手们能指点一下,万分感谢。就这个问题,我已经搞了两天了,可还是没弄明白。
以下是我的子程序(子程序应该没语法错误,因为 把程序体放到主程序中可以运行正确):
int insert_sql(ONLINEINFO_LIST **online_head)
{

        EXEC SQL BEGIN DECLARE SECTION ;
        unsigned int str_ipnum;
        char str_name[41];
        unsigned int str_usercity;
        unsigned int str_localarea;
        unsigned int str_sharenum;
        char str_modifytime[15];
        EXEC SQL END DECLARE SECTION;

        ONLINEINFO_LIST *p=NULL;
        int i;
        printf("\nin insert_sql.\n");

         for(i=0;i<MAXONLINEHASH;i++)
           for( p =online_head[i]; p!=NULL; p=p->next )
           {
              printf("\nin for for.\n");
              strcpy(str_name,p->info.UserName);
              str_ipnum     = p->info.IpAddress;
              str_usercity  = p->info.UserCity;
              str_localarea = p->info.LocalArea;
              str_sharenum  = p->info.sharenum;

              printf("\nname:%s\nipnum:%u\ncity: %u\nlocalarea: %u \n",str_name,str_ipnum,str_usercity,str_localarea);
              printf("\n before update\n");
              EXEC SQL UPDATE USER_SNMP_DETECT
              SET IPNUM     =: str_ipnum,
                  USERCITY  =: str_usercity,
                  LOCALAREA =: str_localarea,
                  DETECTNUM =: str_sharenum
              WHERE USERNAME =: str_name;
              printf("\nsqlca.sqlcode=%d\n",sqlca.sqlcode);
              report_db_error(sqlca);
              if(sqlca.sqlcode==1403)
              {
                printf("\ninsert to sql.\n");
                EXEC SQL INSERT INTO USER_SNMP_DETECT( USERNAME, DETECTNUM, IPNUM, SYSNAME, CONNERRNUM, CREATETIME, MODIFYTIME, USERCITY, LOCALAREA ) VALUES(:str_name,:str_sharenum,:str_ipnum, 'winxp', 0, to_date('2006-04-13', 'yyyy-mm-dd'),to_date('2006-04-13', 'yyyy-mm-dd'), :str_usercity,:str_localarea ) ;
                report_db_error(sqlca);
             }
             else
                if(sqlca.sqlcode==0)    printf("\n update success.\n");

            }
        EXEC SQL COMMIT;
        logoffDb(ctx);
        return 0;
}

主程序为:
#include "db_lib.h"
#include "online.h"

void sql_error(char *msg);
int  select_sql();
int insert_sql(ONLINEINFO_LIST **online_head);
struct sqlca sqlca;
sql_context ctx;
EXEC SQL INCLUDE SQLCA;

int main()
{
        EXEC SQL CONTEXT ALLOCATE :ctx;
        EXEC SQL CONTEXT USE :ctx;

        InitHashList(MAX_HASH);
        logonDb(ctx,"ics001/ics@icsora9");

        select_sql();/*建立链表部分*/
        PrintOnlineHash(&online_head[0]);/*输出链表的值*/
        insert_sql(&online_head[0]);/*将链表的值更新或插入到数据库*/
        FreeHashList();/*释放链表*/
        return 0;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文