繁体   English   中英

Linq To Sql:调用具有不同返回值的存储过程

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM