首页 新闻 会员 周边

entity framework 5.0 调用存储过程获取返回值转换时值不正确

1
悬赏园豆:50 [待解决问题]

我用EF5.0调用sql的存储过程时,有个OUTPUT返回值 ,为什么在数据库中输出的是正确的,但获取时值就不正确,各位大侠谁遇到过这种问题



如果把类型换为DbType.UInt64又变为

从小就不会的主页 从小就不会 | 初学一级 | 园豆:152
提问于:2014-04-16 21:46
< >
分享
所有回答(2)
0

你的存储过程中的 totalCount 是什么类型?

你的 GetListPaging 是咋实现的?

Launcher | 园豆:45045 (高人七级) | 2014-04-17 09:05

支持(0) 反对(0) 从小就不会 | 园豆:152 (初学一级) | 2014-04-17 09:20

@从小就不会: 数据类型用 int 。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-04-17 09:43

@Launcher: 

支持(0) 反对(0) 从小就不会 | 园豆:152 (初学一级) | 2014-04-17 09:51

@从小就不会: 你应该调试下存储过程中传入的参数的值是多少。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-04-17 11:30

@Launcher: 这是我用profiler查看的结果

支持(0) 反对(0) 从小就不会 | 园豆:152 (初学一级) | 2014-04-17 11:32

@从小就不会: 你这样测试下,你在你的存储过程中,把脚本都注释掉,然后只写一条赋值语句:

@totalCount = 101

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-04-17 11:39

@Launcher: 照您的方法,我把脚本都注释了,并且把EF中的返回类型设置成无,数值就正常了

支持(0) 反对(0) 从小就不会 | 园豆:152 (初学一级) | 2014-04-17 11:53

@从小就不会: 你的存储过程中有没有类似 @totalCount = 101 赋值的语句?

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-04-17 13:01

@Launcher: 有的,最后一个exec就是给输出参数赋值的,而且如果我把存储过程改为这样

http://img.bbs.csdn.net/upload/201404/17/1397717018_544236.jpg

并且 把返回值改为实体后,返回的输出变量值 又是错误 的,难道EF中的存储过程不能共同输出数据集和输出变量?

支持(0) 反对(0) 从小就不会 | 园豆:152 (初学一级) | 2014-04-17 14:45

支持(0) 反对(0) 从小就不会 | 园豆:152 (初学一级) | 2014-04-17 14:45

@从小就不会: 看不懂,我只知道如果直接设置 @totalCount = 1223,结果就正确,因此你的脚本的最后应该有句: @totalCount = xxxx。从存储过程返回值获取的话(比如用 SqlDataReader),脚本最后应该添加 return @totalCount 语句。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-04-17 15:34

@Launcher: 我的意思是这样的,如果用EF来调用存储过程时,它会根据这个存储过程自动生成一个方法,然后你可以在这个方法上选择返回值类型。我照你的方法试了下,如果存储过程中只有一个set @totalCount=101这句时,我把返回值类型设置为无,运行时得到结果是正确的。但我又把那个分页的语句加上后,因为要得到一个对象集合,我就把那个返回值类型设置为实体对象,再运行时,实体对象里有值了,但输出参数的值就错了。

支持(0) 反对(0) 从小就不会 | 园豆:152 (初学一级) | 2014-04-17 15:48

@从小就不会:你的 paper.TotalCount 为 11 时,result  是不是包含了 11 条记录,或者是第一条记录的第一个字段的值是 11?

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-04-17 15:52

@Launcher: 不是,而且我最奇怪的是ObjectParameter param = new ObjectParameter("totalCount", SqlDbType.Int)这个类里面的第二个参数,如果变成其他类型时,比如DbType.Int16,DbType.Int32,DbType.Int64, paper.TotalCount的值 都不一样,不知道是什么原因

支持(0) 反对(0) 从小就不会 | 园豆:152 (初学一级) | 2014-04-17 15:56

@从小就不会: 用 SqlDataReader 调用时,存储过程的传出参数通过 SqlParameter 来获取,要指定 ParameterDirection.Output,如果指定为 ParameterDirection.ReturnValue,它就会从存储过程的返回值中读取。存储过程的返回值是确定类型或游标的话,通过 SqlDataReader 来读取结果。

 

你可以用 SqlDataReader 测试下下你的存储过程,如果没有问题的话,那么可能的原因在于 EF 在处理返回值和传输参数时没有正确使用 SqlDataReader。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-04-17 16:09
0

给你如下理由不用EF

http://www.cnblogs.com/humble/p/3535883.html

迅捷网络[来送福利] | 园豆:576 (小虾三级) | 2014-04-17 11:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册