免费注册 查看新帖 |

Chinaunix

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

救救我啊!数据库插入问题请教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-26 16:56 |只看该作者 |倒序浏览
我编写了个子程序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;
}

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2006-04-26 22:49 |只看该作者
你不把子程序放入主程序,
你怎么执行子程序的?

论坛徽章:
0
3 [报告]
发表于 2006-04-27 08:59 |只看该作者
我当然把子程序放到主程序啦,那是通过函数调用。如上主程序中的insert_sql(),可是这样运行不对啊!我的子程序编的有问题吗?

论坛徽章:
0
4 [报告]
发表于 2006-04-27 10:55 |只看该作者
我是说我把子程序的        程序体           放到主程序中可以运行正确,但通过在主程序中调用子程序,运行就不对,我不知道是什么原因,哪位高人可以救我啊! 我快郁闷死了,就这个问题!先谢了啊!!

论坛徽章:
0
5 [报告]
发表于 2006-04-27 15:44 |只看该作者

我知道错误原因了!!!

我知道错误原因了!!!

是因为我在程序中用到了一句话: EXEC SQL WHENEVER NOT FOUND DO break;
所以 在执行update 语句时,如果数据库中没有链表中的记录,就break了,就不会执行for循环下面的语句了!!
所以在 子程序中应该加一句话:EXEC SQL WHENEVER NOT FOUND GOTO insert ;
然后把insert: 标号放到if(sqlca.sqlcode==1403)前:

insert:
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");

            }
哎! 终于解决问题了!!心情真好!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP