免费注册 查看新帖 |

Chinaunix

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

informix 诡异问题求助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-19 16:46 |只看该作者 |倒序浏览
10可用积分
如下面的程序段:
int Location(char *pszCondition , struct CMSLocalInstInfo *pstCMSLOCALINSTINFO)
{
int idbs_SqlCode ;
EXEC SQL BEGIN DECLARE SECTION ;
char acCondition_l[ 1024 ];
struct EcCmsLocalInstInfo lstCmsLocalInstInfo;
EXEC SQL END DECLARE SECTION ;

memset( acCondition_l , 0 , sizeof(acCondition_l));
sprintf( acCondition_l , "SELECT * FROM %s WHERE %s FOR UPDATE " ,
"tablename", pszCondition );

EXEC SQL PREPARE s1_l FROM :acCondition_l;
    if ( sqlca.sqlcode )
    {
        idbs_SqlCode = sqlca.sqlcode;
        return idbs_SqlCode;
    }
    EXEC SQL DECLARE CMSLocalInstInfo_l_cur CURSOR FOR s1_l;

    EXEC SQL OPEN CMSLocalInstInfo_l_cur ;
    if ( sqlca.sqlcode )
    {
        idbs_SqlCode = sqlca.sqlcode;
        return idbs_SqlCode;
    }
EXEC SQL FETCH CMSLocalInstInfo_l_cur INTO :lstCmsLocalInstInfo; ;

    if ( sqlca.sqlcode && sqlca.sqlcode != SQLNOTFOUND )
    {
        idbs_SqlCode = sqlca.sqlcode;
        EXEC SQL CLOSE  CMSLocalInstInfo_l_cur;
        return idbs_SqlCode;
    }

    if ( CMSSQLCODE == SQLNOTFOUND )
    {
        idbs_SqlCode = sqlca.sqlcode;
        EXEC SQL CLOSE  CMSLocalInstInfo_l_cur;
        return idbs_SqlCode;
    }
}

int Update(struct CMSLocalInstInfo *pstCMSLOCALINSTINFO)
{
int idbs_SqlCode ;
EXEC SQL BEGIN DECLARE SECTION ;
char acCondition_l[ 1024 ];
struct EcCmsLocalInstInfo lstCmsLocalInstInfo;
EXEC SQL END DECLARE SECTION ;
    memcpy ((char *)&lstCmsLocalInstInfo , (char *)pstCMSLOCALINSTINFO,sizeof(CMSLocalInstInfo))
    EXEC SQL UPDATE CMSLOCALINSTINFO SET * = :lstCmsLocalInstInfo
            WHERE CURRENT of CMSLocalInstInfo_l_cur ;
    return sqlca.sqlcode
}
调用顺序为 beginwork-->Location(...) --> Update(...)-->commitwork;
多数都跑得好好的没问题,但偶尔报259或266错,实在查不出来了,请高手帮忙分析下是什么原因?谢谢!

论坛徽章:
0
2 [报告]
发表于 2007-10-19 18:57 |只看该作者
你的调用序列也给出来。最好贴出完整的代码。这段看不出来。

论坛徽章:
0
3 [报告]
发表于 2007-10-19 19:03 |只看该作者
调用序列上面已经列出来了:
调用顺序为 beginwork-->Location(...) --> Update(...)-->commitwork;

源代码太长了,贴出来估计看得更晕。

论坛徽章:
0
4 [报告]
发表于 2007-10-19 19:10 |只看该作者
用附件吧。

论坛徽章:
0
5 [报告]
发表于 2007-10-19 19:11 |只看该作者
然后你给出,错误是在哪个点报出来的。

论坛徽章:
0
6 [报告]
发表于 2007-10-19 19:25 |只看该作者
做了个时程序试 了试,在open失败时fetch会报259 , fetch失败做update会报266.但问题是,上面的程序在open时没报错,update前的fetch也没报错。

论坛徽章:
0
7 [报告]
发表于 2007-10-19 19:35 |只看该作者
这段代码没有办法看出来问题。

挑个无关的吧。
int Update(
exec sql begin declare section;
   parameter struct CMSLocalInstInfo *pstCMSLOCALINSTINFO
exec sql end declare section;
)
{
    EXEC SQL UPDATE CMSLOCALINSTINFO SET * = :pstCMSLOCALINSTINFO[0]
            WHERE CURRENT of CMSLocalInstInfo_l_cur ;
    return sqlca.sqlcode
}

何必来回memcpy?

论坛徽章:
0
8 [报告]
发表于 2007-10-19 19:36 |只看该作者
诶呀,不愿意贴附件。我走咯。

论坛徽章:
0
9 [报告]
发表于 2007-10-19 19:40 |只看该作者
我晕、完整的源程序只有我贴出的这一块在操作数据库,贴出来何用?

论坛徽章:
0
10 [报告]
发表于 2007-10-19 19:53 |只看该作者

回复 #7 ivhb 的帖子

不是所有的嵌入式语言都支持你这种写法,我这样是考虑移植的方便性。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP