CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  ASP.NET

这是不是vs.net关于存储过程的bug啊?

楼主nwleo(祺)2005-12-01 08:08:26 在 .NET技术 / ASP.NET 提问

存储过程:  
   
   
  CREATE   PROCEDURE   test  
  (  
      @Total   int   output  
  )  
  AS  
   
      /*   Statement1   */  
      SELECT   @Total   =   COUNT(*)   FROM   t  
   
      /*   Statement2   */  
      SELECT   *   FROM   table  
   
      RETURN  
   
   
   
  在vs.net里调试存储过程时,output窗口显示@Total有值,也返回了t表里面的所有记录。  
  但在程序里,执行完ExcuteReader()后,para["@Total"].Value始终没有值,而把Statement1去掉的话就得到正确值了。  
   
  请问各位大哥这是什么问题啊?怎么解决呢?  
  Thx   a   lot! 问题点数:100、回复次数:11Top

1 楼nwleo(祺)回复于 2005-12-01 08:14:53 得分 0

应该是"把Statement2去掉的话就得到正确的@Total值了".Top

2 楼zhangjian01361(★非也非也★)回复于 2005-12-01 08:18:55 得分 0

你的目的是不是既返回para["@Total"].Value值又返回整个表的记录集呀?Top

3 楼lsqkeke(可可)回复于 2005-12-01 08:19:16 得分 0

就我这烂水平,就知道你的这句:SELECT   *   FROM   table     中的"table"要与SQL关键字重合  
  要改名。  
  还顶一下!  
  Top

4 楼jxufewbt(我的目标是5星)回复于 2005-12-01 08:20:03 得分 0

把Statement2去掉试试Top

5 楼lsqkeke(可可)回复于 2005-12-01 08:20:46 得分 0

那得查看   statement的用法先Top

6 楼sunnystar365(一个人的天空)回复于 2005-12-01 08:35:41 得分 95

把/*   Statement1   */和/*   Statement2   */换一个位置,然后先绑定DataGrid  
  SqlConnection   myConnection   =   new   SqlConnection(con);  
  SqlCommand   myCommand   =   new   SqlCommand   (   "test",   myConnection   );  
  myCommand.Parameters.Add   (   new   SqlParameter   ("@Total   ",    
  SqlDbType.Int   )   ).Direction   =   ParameterDirection.Output;  
  myConnection.Open();  
  DataGrid1.DataSource   =   myCommand.ExecuteReader();  
  DataGrid1.DataBind();  
  myConnection.Clost();  
  这样DataGrid就绑定了,  
  然后得到output值  
  int   totalRecords   =   (Int)   myCommand.Parameters["@Total"].Value;  
  这样可以即绑定DataGrid又得到output值了Top

7 楼greennetboy(我的老婆叫静静)回复于 2005-12-01 08:51:39 得分 5

不是这样的,你即使去掉statement也不可能得到output参数,你可以查看所有msdn上和wrox书上的数据操作事例,他们在获得output参数的时候,都不约而同的使用在了更新,添加。删除等操作中,因为这些操作一般都会执行ExecuteNonQuery(),此时才能得到输出参数的值!如果你非要在查询情况下输出输出参数的话,执行ExcuteReader()是得不到数值的,必须在执行完ExcuteReader()之前或者之后执行ExcuteNonQuery()!楼主请尝试我的方法,应该能得到!Top

8 楼greennetboy(我的老婆叫静静)回复于 2005-12-01 09:01:32 得分 0

改正一下,尝试了一下   sunnystar365(一个人的天空)   (   )   的方法,的确可行,差点误导了楼主,罪过!  
  不过要想像楼主那样不改变顺序,用我上面的方法就可以了!Top

9 楼nwleo(祺)回复于 2005-12-01 12:58:59 得分 0

非常感谢sunnystar365,问题已解决。  
  原来问题就在于取这个output参数时,应该是在DataReader被绑定后取,而不能在ExcuteReader()执行后立即取。  
   
  结贴前问多两个问题:  
   
  1.   为什么两个statement要互换位置?我换不换也可以取到output值,是不是要在特定情况下才这样做?  
   
  2.   问什么不能在ExcuteReader()执行后立即取output参数值?  
   
  Many   thx   !Top

10 楼greennetboy(我的老婆叫静静)回复于 2005-12-01 13:29:00 得分 0

这个和绑定没有关系吧?  
  如果你不换位置,采用我上面的方法可以正常取道数据!Top

11 楼iuhxq(小灰)回复于 2005-12-01 13:46:57 得分 0

我经常用  
  select   @Total来代替output  
   
  SqlDataReader   dr   =   xxxx;  
   
  while   (dr.Read())  
  tvSet.TVs.Add(   PopulateTVFromIDataReader(dr)   );  
   
  if   (returnRecordCount)    
  {  
  dr.NextResult();  
   
  dr.Read();  
  tvSet.TotalRecords   =   (int)   dr[0];  
  }  
   
  dr.Close();Top

相关问题

  • ADODATASET BATCHUPDATE方法 VS 存储过程
  • sql语句在存储过程中调试 正确 但.net执行此存储过程是提示错误
  • .net中调用存储过程,其中存储过程调用一个局部临时表
  • 分特啊!!!!SQL SERVER的存储过程有bug 天哪
  • 在Visual Basic .NET 中如何使用存储过程?急急!
  • 如何 在 Visual Basic .NET 中使用存储过程
  • 如何在存储过程中使用.net组件
  • 如何在存储过程中使用.net组件??
  • 在.NET中如何调用SQL Server的存储过程?
  • 在VB. NET 中如何调用sql-server存储过程?

关键词

  • vs.net
  • 存储过程
  • 执行
  • datagrid
  • excutereader
  • 值
  • 参数
  • statement
  • 去掉
  • dr

得分解答快速导航

  • 帖主:nwleo
  • sunnystar365
  • greennetboy

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo