免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 716 | 回复: 0
打印 上一主题 下一主题

经典提问:数据库插入不成功原因请教!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-26 15:38 |只看该作者 |倒序浏览
我编写了个子程序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;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP