All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
asp.net2.0实现文件上传,控制上传文件大小,类型_[Asp.Net教程]
asp.net点击textbox自动清除其中文字_[Asp.Net教程]
Visual,C#,2005快速入门之调用方法_[Asp.Net教程]
PHP连接MYSQL的两种方法_[PHP教程]
ASP.NET生成静态HTML页面并分别按年月目录存放_.net资料_编程技术
总结:ADO.NET在开发中的部分使用方法和技巧_[Asp.Net教程]
用PHP实现文件上传_php资料_编程技术
PHP的内码转换函数,mb_convert_encoding
PHP安全配置之实现安全的两个重点_php资料_编程技术
PHP上传文件的代码_php资料_编程技术
Reading number is top 10 pictures
BingBingFan apple dew point photo gallery5
为什么别人说你是疯子
俄罗斯台球天后惊艳魅惑2
BingBingFan apple dew point photo gallery1
再发两张抽象画
Sexy women in 2013--2
英雄联盟超神十连杀截图
Play for Free show breast in a world of ice and snow
非笑不可:最强爆笑图片精选
Gang rape
Download software ranking
尖东毒玫瑰B
Unix video tutorial19
Proficient in JavaScript
星际争霸1.08硬盘免安装版
卡丁车单机版
Unix video tutorial2
Boxer's Top ten classic battle6
Sora aoi, the maid, students' uniforms
Boxer Classic video3
Tram sex maniac 2 (H) rar bag5
delv published in(发表于) 2014/1/10 6:31:22 Edit(编辑)
在ExcuteReader中使用输出参数的问题_[Asp.Net教程]

在ExcuteReader中使用输出参数的问题_[Asp.Net教程]

在ExcuteReader中使用输出参数的问题_[Asp.Net教程]

今天一个查询需要通过 ExcuteReader 返回结果集,同时又想输出参数,刚开始的时候一直得不到输出参数的值,以为存储过程出错,但是在查询分析器里面测试是正确的,而且输出参数确实已经赋值。
更加让人百思不得其解的是,对出输出强制类型转换丢出异常之后,确又可以得到了,难道是ado.net 的bug,想象页不可能啊,这么常用的API,不可能出这种错吧,我的代码类似一下场景:


try {
using (SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) {
int val = (int)cmd.Parameters[1].Value; // 现在还是空值
// more
}
}
catch(Exception exp) {
throw new ApplicationException("输出参数值:" + cmd.Parameters[1].Value, exp); // 现在可以得到输出值了
}


真是郁闷惨,足足调试跟踪一个小时


终于还是在MSDN中找到了答案:
当您将 Command 对象用于存储过程时,可以将 Command 对象的 CommandType 属性设置为 StoredProcedure。当 CommandType 为 StoredProcedure 时,可以使用 Command 的 Parameters 属性来访问输入及输出参数和返回值。无论调用哪一个 Execute 方法,都可以访问 Parameters 属性。但是,当调用 ExecuteReader 时,在 DataReader 关闭之前,将无法访问返回值和输出参数。



ref:http://msdn2.microsoft.com/zh-CN/library/tyy0sz6b.aspx


原来如此啊,觉得又被MS忽悠了,想来,谁叫自己学艺不经啊,而且早改查文档


回到自己的代码环境,还是可以解释的。
因为当catch到Expception 的时候已经跳出 using 范围了,DataReader已经自动被关闭了,自然可以得到 输出参数的值。
当然,如果把try catch 放到 using中还是得不到的,因为还在 using范围内,DataReader并没有被关闭。


另外,MSDN中说只有关闭DataReader才可以访问,其实不然。
经过测试,可以总结如下:
1。对于ExecuteReader而言,Output parm 和 returnvalue 作为一个结果集返回DataReader,并且改结果集总是在最后一个。
2。根据1,当有结果集时,要访问输出参数和返回值,需要调用 NextResult 到输出参数和返回值对应的结果集位置
3。根据1 ,当Execute没有返回结果集时,就可以直接访问(注意,无需调用Read())
4。特别注意的对于返回多个结果集的,需要调用多次NextResult;如果结果集个数又是动态的,那么当nextResult()的返回值为 false就是了。
5。即使对ExecuteReader指定了选项CommandBehavior.SingleResult(返回单个结果集,其实是返回批处理的第一个结果集),输出参数也作为一个结果集返回。
6。关闭DataReader(Close()),会填充输出参数,因此可以访问。
7。由于DataReader是只读向前的,因此,即使是通过在关闭DataReader之前通过NextResult方问到了输出参数,之前的结果集都无法在访问了(某些情况,可能想通过输出参数来动态控制结果集的访问)。
8。为解决6中的问题,可以将不使用输出参数,直接将输出参数作为第一个结果返回(SELECT @parmname)


以上只是,自己的总结,希望没有出入,对初学者也许有帮助。


ref:
http://www.bigcircleboy.net/583a194f-2c2c-4662-9036-4e2f0eb262396084313157728108.html


来源:网络







添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.