免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7245 | 回复: 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
跳转到指定楼层
[收藏(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.    }
复制代码

论坛徽章:
0
13 [报告]
发表于 2011-01-04 15:25 |只看该作者
学习了!

论坛徽章:
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
12 [报告]
发表于 2010-12-30 13:40 |只看该作者
回复 12# system888net
非常感谢!

论坛徽章:
0
11 [报告]
发表于 2010-12-29 22:22 |只看该作者
回复 11# system888net


注: 一个结果集是输出参数,一个结果集是记录集.

论坛徽章:
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 08:02 |只看该作者
如果还不行,就用 SQLMoreResults(...)测试一下.
system888net 发表于 2010-12-28 22:29

添加上 语句while(SQLMoreResults(hstmt) == SQL_SUCCESS);后,发现能返回输出参数的值,但是记录集又不能返回了

     sprintf(select_str,"{call pageUserlist_p(?)}");
connectDB();   //调用连接数据库函数
retcode = SQLBindParameter(hstmt, 1, SQL_PARAM_OUTPUT, SQL_C_LONG,SQL_INTEGER, 0, 0, &recordTotal, 0, &cb1);  //返回值
  retcode = SQLExecDirect(hstmt,(SQLCHAR *)select_str,SQL_NTS);
while(SQLMoreResults(hstmt) == SQL_SUCCESS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
   {
             retcode=SQLBindCol(hstmt,1,SQL_C_ULONG,&userid,11,&cb);        
             retcode=SQLBindCol(hstmt,2,SQL_C_CHAR,userCode,11,&cb);         
             retcode=SQLBindCol(hstmt,3,SQL_C_CHAR,userName,20,&cb);         
             retcode=SQLBindCol(hstmt,4,SQL_C_CHAR,loadName,20,&cb);         
             retcode=SQLBindCol(hstmt,5,SQL_C_CHAR,userPwd,20,&cb);
      while (TRUE)
     {
              retcode = SQLFetch(hstmt);
             if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
             {
                 //代码
             }
         }
   }

论坛徽章:
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
9 [报告]
发表于 2010-12-29 06:24 |只看该作者
如果还不行,就用 SQLMoreResults(...)测试一下.
system888net 发表于 2010-12-28 22:29



    用SQLMoreResults测试发现:能够得到输出参数的值,但不能获得记录集。

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

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

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

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

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

论坛徽章:
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
5 [报告]
发表于 2010-12-28 20:47 |只看该作者
估计是存储过程的问题
chenzhanyiczy 发表于 2010-12-28 19:34



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

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

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP