免费注册 查看新帖 |

Chinaunix

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

ODBC调用存储过程不能同时返会记录集与输出参数的值 [复制链接]

论坛徽章:
5
未羊
日期:2014-08-07 15:42:10双子座
日期:2014-09-23 15:42:172015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:55:282022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-28 13:26 |只看该作者 |倒序浏览
30可用积分
下面是用odbc调用的存储过程与调用的代码。执行后能够返回记录集,但是不能返回输出参数@intResult的值。
如果将其中的 exec(@sql)注释掉,那么就能返回输出参数@intResult的值,但不能返回记录集。
请问如何处理既能返回记录集又能返回@intResult的值?
  1. if exists(select 1 from sysobjects where name='pageUserlist_p' and xtype='p')
  2. drop procedure dbo.pageUserlist_p
  3. go
  4. create procedure dbo.pageUserlist_p
  5. @intResult Int OUTPUT

  6. as
  7. set nocount on
  8. declare @PageCount1 int
  9. declare @sql nvarchar(4000)
  10. begin tran
  11.   set @sql='select userid,userCode,userName,loadName,userPwd from user_t'
  12.   exec(@sql)
  13. set @intResult=12
  14. If @@Error <> 0
  15.      Begin
  16.       RollBack Tran
  17.       SET @intResult=-1
  18.      End
  19. Else
  20.      Begin
  21.       Commit Tran
  22.      End
  23. GO
复制代码
调用存储过程的代码:
  1. sprintf(select_str,"{call pageUserlist_p(?)}");
  2. connectDB();   //调用连接数据库函数
  3. retcode = SQLBindParameter(hstmt, 1, SQL_PARAM_OUTPUT, SQL_C_LONG,SQL_INTEGER, 0, 0, &recordTotal, 0, &cb1);  //返回值
  4.   retcode = SQLExecDirect(hstmt,(SQLCHAR *)select_str,SQL_NTS);
  5. if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
  6.    {
  7.              retcode=SQLBindCol(hstmt,1,SQL_C_ULONG,&userid,11,&cb);        
  8.              retcode=SQLBindCol(hstmt,2,SQL_C_CHAR,userCode,11,&cb);         
  9.              retcode=SQLBindCol(hstmt,3,SQL_C_CHAR,userName,20,&cb);         
  10.              retcode=SQLBindCol(hstmt,4,SQL_C_CHAR,loadName,20,&cb);         
  11.              retcode=SQLBindCol(hstmt,5,SQL_C_CHAR,userPwd,20,&cb);
  12.       while (TRUE)
  13.      {
  14.               retcode = SQLFetch(hstmt);
  15.              if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
  16.              {
  17.                  //代码
  18.              }
  19.          }
  20.    }
复制代码

最佳答案

查看完整内容

回复 10# 光速 不要这么用,或者说SQLMoreResults(...) 不是这么用的. 尝试如下看看: ........... retcode = SQLExecDirect(hstmt,(SQLCHAR *)select_str,SQL_NTS); 获取第一个结果集. SQLMoreResults(stmt); 获取第二个结果集 ...

论坛徽章:
0
2 [报告]
发表于 2010-12-28 13:26 |只看该作者
回复 10# 光速

    不要这么用,或者说SQLMoreResults(...) 不是这么用的.

   尝试如下看看:

    ...........
    retcode = SQLExecDirect(hstmt,(SQLCHAR *)select_str,SQL_NTS);
    获取第一个结果集.
    SQLMoreResults(stmt);
    获取第二个结果集
    ...

论坛徽章:
5
未羊
日期:2014-08-07 15:42:10双子座
日期:2014-09-23 15:42:172015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:55:282022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32
3 [报告]
发表于 2010-12-28 13:45 |只看该作者
说说自己的观点.

论坛徽章:
5
未羊
日期:2014-08-07 15:42:10双子座
日期:2014-09-23 15:42:172015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:55:282022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32
4 [报告]
发表于 2010-12-28 16:54 |只看该作者
没人回复吗?

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
5 [报告]
发表于 2010-12-28 19:34 |只看该作者
估计是存储过程的问题

论坛徽章:
5
未羊
日期:2014-08-07 15:42:10双子座
日期:2014-09-23 15:42:172015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:55:282022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32
6 [报告]
发表于 2010-12-28 20:47 |只看该作者
估计是存储过程的问题
chenzhanyiczy 发表于 2010-12-28 19:34



    不知道哪里出了问题。现在挺郁闷的。

论坛徽章:
0
7 [报告]
发表于 2010-12-28 21:52 |只看该作者
lz 用的是sql server吗?  不同的odbc驱动在一些兼容细节上会有不同(比如sql server和sybase)
对于lz的这个例子,从接口的角度而言,可以看作是返回了两个结果集,可以按两个结果集处理试看一下结果.

论坛徽章:
0
8 [报告]
发表于 2010-12-28 22:29 |只看该作者
本帖最后由 system888net 于 2010-12-28 22:31 编辑

如果还不行,就用 SQLMoreResults(...)测试一下.

论坛徽章:
0
9 [报告]
发表于 2010-12-28 22:49 |只看该作者
fetch结果集之前调试/打印一下recordTotal的值?我觉得两者应该不影响啊

把存储过程中的 rollback/commit去掉在试下。

论坛徽章:
5
未羊
日期:2014-08-07 15:42:10双子座
日期:2014-09-23 15:42:172015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:55:282022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32
10 [报告]
发表于 2010-12-29 06:24 |只看该作者
如果还不行,就用 SQLMoreResults(...)测试一下.
system888net 发表于 2010-12-28 22:29



    用SQLMoreResults测试发现:能够得到输出参数的值,但不能获得记录集。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP