• ExcuteReader中使用传出参数


             最近,做一个分页,用到的是存储过程分页。花了一个晚上终于弄了个比较通用的SQL存储过程。但是在数据执行时,用了ExcuteReader,结果怎么着都得不到一个传出参数的值。这个参数是用来反映到底从数据库中select了都少条数据(就是受影响的行数)。
              其实,以前也觉得过这样的问题,只是当时没有仔细分析。听了“长辈”的话,认为存储过程中有两个Select,第二个就不能执行。所以遇到这样的,总是用两个存储过程来完成;再后来知道了并没有“长辈”的那么一说就把一个存储过程执行两次。现在想想都是很垃圾的解决方案。
     下面援引MSDN
    :   
                   Command 对象公开了几个可用于执行所需操作的 Execute 方法。当以数据流的形式返回结果时,使用 ExecuteReader 可返回 DataReader 对象。使用 ExecuteScalar 可返回单个值。使用 ExecuteNonQuery 可执行不返回行的命令。
    当您将 Command 对象用于存储过程时,可以将 Command 对象的 CommandType 属性设置为 StoredProcedure。当 CommandType 为 StoredProcedure 时,可以使用 Command 的 Parameters 属性来访问输入及输出参数和返回值。无论调用哪一个 Execute 方法,都可以访问 Parameters 属性。但是,当调用 ExecuteReader 时,在 DataReader 关闭之前,将无法访问返回值和输出参数。
                   根据的断点调试和分析,得出:
         1.存储过程能返回你所需要的所有结果集,问题不是在存储过程上,
               当然若是你的存储过程不过关,就另当别论了;
         2.不存在某些人说的,ReturnValue和输出参数会作为DataReadr的最后一个数据集。
             因为我用dr.NextResult()返回布尔值时为false
            (注:SqlDataReader dr,存储过程只返回一个数据集)
         3.dr不关闭,肯定拿不到传出参数的值,如果你觉得是ADO.NET的bug,那就是的。毕竟它不是god。
         4.如果只返回一个数据集,用dr.NextResult也可以得到参数值。但是它的原理还是和关闭是一样的。
               因为强制读下一个数据集,会导致dr关闭。

  • 相关阅读:
    张旭升20162329 2006-2007-2 《Java程序设计》第一周学习总结
    预备作业03——20162329张旭升
    预备作业02 : 体会做中学-20162329 张旭升
    预备作业01——20162329
    FPGA的软核与硬核
    网页调用vlc并播放网络视频
    vue视频插件VLC
    vue+vue-video-player实现弹窗播放视频
    【面向对象程序设计】作业三
    【面向对象程序设计】作业二
  • 原文地址:https://www.cnblogs.com/xiaobing/p/868924.html
Copyright © 2020-2023  润新知