[英]Linq To Sql : Call a Stored Procedure With Different Return Values
我有一个存储过程,根据输入,该存储过程将返回多行整数或多行日期时间。
我查看了该问题的答案,并阅读并实现了从SPROC 处理多个结果形状中的 Scott Guthries解决方案(向下滚动页面以查看该部分)。
不幸的是,它不起作用。
这是我的代码:
[Function(Name = "FunkyStoredProcedure")]
[ResultType(typeof(List<int>))]
[ResultType(typeof(List<DateTime>))]
public IMultipleResults FunkyStoredProcedure(int appId, int sId, int cId)
{
IExecuteResult result = this.ExecuteMethodCall(this, (MethodInfo)(MethodInfo.GetCurrentMethod()), appId, sId, cId);
return (IMultipleResults)result.ReturnValue;
}
}
使用SQL Server Profiler,Linq 2 Sql生成的代码如下所示:
declare @p6 int
set @p6=0
exec sp_executesql N'EXEC @RETURN_VALUE = [FunkyStoredProcedure] @appId = @p0, @sId = @p1, @cId = @p2',N'@p0 int,@p1 int,@p2 int,@RETURN_VALUE int output',@p0=2,@p1=4,@p2=2,@RETURN_VALUE=@p6 output
select @p6
产生的结果集如下所示:
cId
-----------
694
42
43
41
4732
-----------
0
(1 row(s) affected)
请注意,这里有两个结果集(应该只有一个。)并且请注意,第二个结果集,将被返回给LinqToSql的结果集是0!
“ exec sp_executesql ...”行产生了第一个正确的结果集。
“ select @ p6”行产生第二个错误的结果集。
首先,为什么将@ p6定义为int? 在函数中,我有两个可能的ResultTypes:List和List这似乎是一个问题。
其次,为什么它不返回存储过程的输出? 而不是返回@ p6的值?
最后,最重要的是,如何使它正常工作?
忽略探查器-它引导您走错了路;-)
您如何阅读结果? 您应该将它们读取到IMultipleResults中,然后调用GetResult <>以获取实际数据,即。
IMultipleResults result = dc.FunkyStoredProcedure(1,2,3);
var ints = result.GetResult<int>();
要么
IMultipleResults result = dc.FunkyStoredProcedure(1,2,3);
var dts = result.GetResult<DateTime>();
如果选择了错误的类型并枚举结果,则会抛出SystemException(message =“ Specified cast is not valid”。),因此,如果您不知道该类型,请假设最有可能的类型,并且抛出以上内容,请尝试其他类型。
就像是:
IMultipleResults result = dc.FunkyStoredProcedure(1,2,3);
try
{
var ints = result.GetResult<int>();
DoStuffWithIntegerResults(ints);
}
catch(SystemException)
{
var dates = result.GetResult<DateTime>();
DoStuffWithDateResults(dates);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.