这是不是vs.net关于存储过程的bug啊?
存储过程:
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




