Chinaunix

标题: informix 诡异问题求助 [打印本页]

作者: niec2003    时间: 2007-10-19 16:46
标题: informix 诡异问题求助
如下面的程序段:
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错,实在查不出来了,请高手帮忙分析下是什么原因?谢谢!
作者: ivhb    时间: 2007-10-19 18:57
你的调用序列也给出来。最好贴出完整的代码。这段看不出来。
作者: niec2003    时间: 2007-10-19 19:03
调用序列上面已经列出来了:
调用顺序为 beginwork-->Location(...) --> Update(...)-->commitwork;

源代码太长了,贴出来估计看得更晕。
作者: ivhb    时间: 2007-10-19 19:10
用附件吧。
作者: ivhb    时间: 2007-10-19 19:11
然后你给出,错误是在哪个点报出来的。
作者: niec2003    时间: 2007-10-19 19:25
做了个时程序试 了试,在open失败时fetch会报259 , fetch失败做update会报266.但问题是,上面的程序在open时没报错,update前的fetch也没报错。
作者: ivhb    时间: 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?
作者: ivhb    时间: 2007-10-19 19:36
诶呀,不愿意贴附件。我走咯。
作者: niec2003    时间: 2007-10-19 19:40
我晕、完整的源程序只有我贴出的这一块在操作数据库,贴出来何用?
作者: niec2003    时间: 2007-10-19 19:53
标题: 回复 #7 ivhb 的帖子
不是所有的嵌入式语言都支持你这种写法,我这样是考虑移植的方便性。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2