免费注册 查看新帖 |

Chinaunix

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

一个总是没明白的问题,程序调用ODBC API函数 的错误信息,请教各位!谢谢啦 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-14 11:42 |只看该作者 |倒序浏览
加了诊断函数之后
     rc = SQLFetch(hstmt);

        printf("after fetch  rc is %d\n",rc);

        if (rc == SQL_NO_DATA_FOUND)
        {
                return 0;
        }
        else if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
        {
                return 1;
        }
        else
        {

        printf("before SQLGetDiagField!\n");
        SQLGetDiagField(SQL_HANDLE_STMT,hstmt,0,SQL_DIAG_NUMBER,&NumRecords,SQL_IS_INTEGER,NULL);
        printf("after SQLGetDiagField,NumRecords is %d\n",NumRecords);
        for( Counter = 0; Counter < NumRecords; Counter ++)
        {
                SQLGetDiagRec(SQL_HANDLE_STMT,hstmt,Counter,SQLState, &NativeErr, ErrMsg, sizeof(ErrMsg),&ErrMsgLen);
                printf("SQLSTATE is: %s \n",SQLState);
                printf("Errmsg is: %s \n",ErrMsg);
        }

日志是

before SQLGetDiagField!                          
after SQLGetDiagField,NumRecords is 3!           
SQLSTATE is: ?                                 
Errmsg is: #                                    
SQLSTATE is: 34                                 
Errmsg is: [MERANT][ODBC 20101 driver]1836072   
SQLSTATE is: 34                                 
Errmsg is: [MERANT][ODBC 20101 driver]1836072   

这个号通过什么方法可以查到呢?有介绍这方面的网站或书籍吗

论坛徽章:
0
2 [报告]
发表于 2008-07-14 12:48 |只看该作者

回复 #1 larace 的帖子

没看到你有又问了一边,那就在这边回答一次.

一开始就应该用SQLGetDiagRec了!

  1.  判定你的SQL语句有没有问题很简单,把它在SQLplus运行一下,如果正常,那么就不用怀疑你的SQL 语句了,否则就是SQL语句的问题了.
  2. SQLExecDirect或(SQLPrepare,SQLExecute)执行后会有返回值,判断一下.
  3. SQLExecDirect或(SQLPrepare,SQLExecute)执行很正常,那么有可能是SQLBindCol的问题
  4. SQLExecute执行不正常,那么有可能是SQLBindParameter的问题
  5. 其它的原因(没看到你的代码,不知道你的真实情况,因此只能这样说)

[ 本帖最后由 system888net 于 2008-7-14 13:45 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2008-07-14 12:52 |只看该作者

回复 #2 system888net 的帖子

在ODBC 里,只要你SQLExecDirect或(SQLPrepare,SQLExecute),SQLBindParameter,SQLBindCol用的正确,SQLFetch里不会出现异常错误的.

论坛徽章:
0
4 [报告]
发表于 2008-07-14 23:59 |只看该作者
我加了输出日志,SQLFreeStmt,  SQLExecDirect  ,SQLNumResultCols ,  SQLDescribeCol 都是0。都没有问题。

就到Fetch的时候,返回-1了

郁闷!
2008/07/14 23:22:05 after SQLFreeStmt,rc is 0
2008/07/14 23:22:05 after SQLExecDirect .rc is 0
2008/07/14 23:22:05 after SQLNumResultCols .rc is 0
2008/07/14 23:22:05 after SQLDescribeCol .rc is 0
2008/07/14 23:22:05 SQL_INTEGER ,rc is 0
2008/07/14 23:22:05 after SQLDescribeCol .rc is 0
2008/07/14 23:22:05 SQL_INTEGER ,rc is 0
2008/07/14 23:22:05 after SQLDescribeCol .rc is 0
2008/07/14 23:22:05 SQL_INTEGER ,rc is 0
。。。
。。。
。。。
after fetch  rc is -1
2008/07/14 23:22:05 before SQLGetDiagField!
2008/07/14 23:22:05 after SQLGetDiagField,NumRecords is 2
2008/07/14 23:22:05 SQLSTATE is: $
2008/07/14 23:22:05 Errmsg is:  
2008/07/14 23:22:05 SQLSTATE is: 34
2008/07/14 23:22:05 Errmsg is: [MERANT][ODBC 20101 driver]1836072


上面NumRecords is 2 也不确定,有时候等于3 ,有时候等于1

论坛徽章:
0
5 [报告]
发表于 2008-07-15 00:04 |只看该作者

回复 #4 larace 的帖子

把SQLDescribeCol代码贴上来.
最好把SQLFreeStmt,  SQLExecDirect  ,SQLNumResultCols ,  SQLDescribeCol相关的部分代码贴上来(
可以把涉密部分去掉.),才能高效定位 .否则只能猜, 把简单的问题弄复杂.

[ 本帖最后由 system888net 于 2008-7-15 00:10 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2008-07-15 00:12 |只看该作者

回复 #4 larace 的帖子

SQLFetch 之前的代码有问题,仔细检查.

[ 本帖最后由 system888net 于 2008-7-15 00:15 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2008-07-15 09:05 |只看该作者
我加了一个判断  如果sqlfetch 返回 -1,就接着再 fetch 一遍,不过,这次就返回100(SQL_NO_DATA_FOUND ) 了.这种判断是不是很愚蠢?

SQLFreeStmt  SQLExecDirect   这些都是api 程序直接调用,给了一些参数.

然后就判断返回值.然后就处理.

你觉得哪部分有可能出问题呢?

论坛徽章:
0
8 [报告]
发表于 2008-07-15 12:50 |只看该作者

回复 #7 larace 的帖子

按你所描述的情况,SQLFetch 之前
对于
SQLFreeStmt,
SQLExecDirect,
SQLNumResultCols,
SQLDescribeCo
的代码用法都有可能出问题!

论坛徽章:
0
9 [报告]
发表于 2008-07-16 08:46 |只看该作者
我加了判断,如果fetch返回-1,就再重新执行一次SQLExecDirect.
现在情况稳定了,fetch也没出错.想不出来问题是怎么不重现的.说不定还会有问题...

对于
SQLFreeStmt,
SQLExecDirect,
SQLNumResultCols,
SQLDescribeCo
这些用法,有没有相关书籍专门介绍啊?看网页觉得不详细.我对这块一直都比较模糊,system888net 你有看过这方面的什么好的资料吗? 给我介绍一些书或资料什么的,谢谢谢谢!!!

论坛徽章:
0
10 [报告]
发表于 2008-07-16 12:52 |只看该作者

回复 #9 larace 的帖子

微软的<<ODBC 程序员参考手册>>
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP