调用EF的存储过程报“存储区数据提供程序返回的数据读取器所具有的列数对于所请求的查询不够”问题...

最近使用EF的函数导入(设置映射的存储过程)遇到该问题。从错误描述很难知道问题发生在哪里?一遍又一遍核对了代码的参数名称和存储过程的参数名称是否一致,也使用SQL探查器跟到执行的sql语句都正常返回结果。

存储过程简要说明如下(代码一):

 
  

CREATE PROCEDURE [ dbo ] . [ pmsvr_ChangeBillingMode ]
(
@in_iPhysicalRegisterId int ,
@in_bIsBillingOnline bit ,
@in_iModifiedEmployeeId int ,
@out_sErrMsg nvarchar ( 255 ) output
)
AS

SET NOCOUNT ON

... ...
set @out_sErrMsg = ''
select 1 as Result
return 1

SET NOCOUNT OFF


Edmx中的封装方法如下(代码二):

 
  
public bool ChangeBillingMode( int physicalRegisterId, bool isBillingOnline, int modifiedEmployeeId, out string errMsg)
{
this .Connection.Open();
EntityCommand cmd
= ((EntityConnection) this .Connection).CreateCommand();

cmd.CommandText
= this .DefaultContainerName + " .ChangeBillingMode " ;
cmd.CommandType
= CommandType.StoredProcedure;

cmd.Parameters.AddWithValue(
" in_iPhysicalRegisterId " , physicalRegisterId);
cmd.Parameters.AddWithValue(
" in_bIsBillingOnline " , isBillingOnline);
cmd.Parameters.AddWithValue(
" in_iModifiedEmployeeId " , modifiedEmployeeId);

EntityParameter para2
= new EntityParameter( " out_sErrMsg " , DbType.String);
para2.Direction
= ParameterDirection.Output;
para2.Value
= string .Empty;
cmd.Parameters.Add(para2);

EntityParameter ret
= new EntityParameter( " ReturnValue " , DbType.Int32);
ret.Direction
= ParameterDirection.ReturnValue;
ret.Value
= 0 ;
cmd.Parameters.Add(ret);

cmd.ExecuteNonQuery();

errMsg
= cmd.Parameters[ " out_sErrMsg " ].Value.ToString();
int returnValue = ( int )cmd.Parameters[ " ReturnValue " ].Value;
return (returnValue > 0 );
}

最后发现在添加函数导入时指定了返回类型为标量Boolean,而当时我理所当然的认为该返回类型是指存储过程最后的Return语句的返回值类型(就这样设置了,因为成功Return 1,失败Return 0);下面是添加函数导入画面(图1):

当时存储过程代码(参见代码一)没有Select 1 as Result这句的,所以总是报如下错误:

后来在Return前增加了上述Select语句就OK,至此才明白添加函数导入的返回类型是指最后一个SELECT语句的字段类型(仅返回一个字段的情况);所以如果没有使用SELECT语句返回则应该置返回类型为“无”;如果SELECT多个字段或者数据表行时必须将返回类型指定为“实体”(即DTO类型);如果是表就必须建一个对应的DTO;如果返回若干字段则必须为这些字段手工创建DTO类型。如果是返回DTO类型的则无需在分部类封装方法了,直接使用导入的函数即可。

总结:如果不使用最后SELECT结果的话,则不必理会返回类型,将返回类型设置为“无”即可,当然我们封装的函数可以获取存储过程Return结果及OUTPUT类型的参数。所以上面例子代码可以删除存储过程中的Return前的Select语句,同时添加函数导入时指定返回类型为“无”。

转载于:https://www.cnblogs.com/chriskwok/archive/2010/08/20/1804358.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值