c# 处理存储过程output返回值的问题
我用ExecuteNonQuery方法执行存储过程时,output的属性值就能获得,而我用ExecuteReader方法,却获得不了,怎么回事?(目的:最终结果集和out...
我用ExecuteNonQuery方法执行存储过程时,output的属性值就能获得,
而我用ExecuteReader方法,却获得不了,怎么回事?
(目的:最终结果集和output的值都能获得)
存储过程代码:http://hi.baidu.com/janksandks/blog/item/e08ae22d7cf3453e359bf7dc.html
谢谢一楼的答案,那请问怎么既能得到返回值,又能得到查询后的数据呢?
这两个值其实可以通过代码来实现,可是得到这两个值需要 总记录数
总记录数 又要执行一次SQL语句才能获得,感觉浪费资源(我只会这样做才能得到 总记录数 如果有什么好的办法共享一下o(╯□╰)o) 展开
而我用ExecuteReader方法,却获得不了,怎么回事?
(目的:最终结果集和output的值都能获得)
存储过程代码:http://hi.baidu.com/janksandks/blog/item/e08ae22d7cf3453e359bf7dc.html
谢谢一楼的答案,那请问怎么既能得到返回值,又能得到查询后的数据呢?
这两个值其实可以通过代码来实现,可是得到这两个值需要 总记录数
总记录数 又要执行一次SQL语句才能获得,感觉浪费资源(我只会这样做才能得到 总记录数 如果有什么好的办法共享一下o(╯□╰)o) 展开
1个回答
展开全部
因为ExecuteReader每次读取一行,没有和数据库断开连接,就像一个方法正在执行中,还没执行return呢。所以没值。
而ExecuteNonQuery是根据条件全查出来了放在你本地内存,就像一个方法执行完一样,所以return也执行了,也就有值。
返回值我一般写在添加等操作的存储过程里,查询没必要即查询结果还要在附带一个返回值。不如只查结果,返回值不就是通过一些计算得来的吗,完全可以在代码中计算出来。
比如我添加的存储过程是:
ALTER PROC [dbo].[sp_InsertModal]
@ModalName int
AS
INSERT tb_Modal(ModalName) values(@ModalName);
SELECT @@IDENTITY;
通过@@IDENTITY我能在添加一条数据后,直接拿到此数据的id数(自动增长的)。
像查询的都写成:
ALTER PROC [dbo].[sp_SelectLog]
@LogWork VARCHAR(50),
@StartTime DATETIME,
@EndTime DATETIME,
@UserId INT,
@ModalId INT
AS
SELECT LogId,LogWork,CreateTime,UserId,ModalId
FROM tb_Log tl
WHERE (@LogWork='' OR tl.LogWork=@LogWork)
AND (@StartTime <= tl.CreateTime AND @EndTime >= tl.CreateTime)
AND (@UserId = 0 OR tl.UserId = @UserId)
AND (@ModalId = 0 OR tl.ModalId = @ModalId)
楼主考虑一下,如果存储过程不好解决可以试着在代码中去处理。 因为存储过程也是类似于程序中的方法。在存储过程里面处理业务逻辑和方法里面是一样的。但你要考虑那个更适合你的程序。
而ExecuteNonQuery是根据条件全查出来了放在你本地内存,就像一个方法执行完一样,所以return也执行了,也就有值。
返回值我一般写在添加等操作的存储过程里,查询没必要即查询结果还要在附带一个返回值。不如只查结果,返回值不就是通过一些计算得来的吗,完全可以在代码中计算出来。
比如我添加的存储过程是:
ALTER PROC [dbo].[sp_InsertModal]
@ModalName int
AS
INSERT tb_Modal(ModalName) values(@ModalName);
SELECT @@IDENTITY;
通过@@IDENTITY我能在添加一条数据后,直接拿到此数据的id数(自动增长的)。
像查询的都写成:
ALTER PROC [dbo].[sp_SelectLog]
@LogWork VARCHAR(50),
@StartTime DATETIME,
@EndTime DATETIME,
@UserId INT,
@ModalId INT
AS
SELECT LogId,LogWork,CreateTime,UserId,ModalId
FROM tb_Log tl
WHERE (@LogWork='' OR tl.LogWork=@LogWork)
AND (@StartTime <= tl.CreateTime AND @EndTime >= tl.CreateTime)
AND (@UserId = 0 OR tl.UserId = @UserId)
AND (@ModalId = 0 OR tl.ModalId = @ModalId)
楼主考虑一下,如果存储过程不好解决可以试着在代码中去处理。 因为存储过程也是类似于程序中的方法。在存储过程里面处理业务逻辑和方法里面是一样的。但你要考虑那个更适合你的程序。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询