经典提问:数据库插入不成功原因请教!!
我编写了个子程序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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论