最近,做一个分页,用到的是存储过程分页。花了一个晚上终于弄了个比较通用的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关闭。