asp.net - 在 LINQ-to-SQL 中运行映射存储过程方法时生成奇怪的 system.void 返回异常

标签 asp.net linq-to-sql stored-procedures

我有一个 SQL Server 2008 存储过程(下面的伪代码),如下所示:

CREATE PROCEDURE MyProc
AS
BEGIN

 CREATE DummyTable

 INSERT INTO DummyTable
 SELECT xxx

 INSERT INTO DummyTable
 SELECT yyy

 IF EXISTS FinalTable DROP FinalTable

 EXEC sp_RENAME 'DummyTable', 'FinalTable'

END
GO

请注意,此存储过程没有返回类型/值。我在 LINQ-TO-SQL 设计器(ASP.NET MVC2 应用程序)中映射了这个存储过程。但是,当我按如下方式调用该方法时:

using (MyContext context = new MyContext())
{
 context.MyProc();
}

但是,在我的日志中,我发现运行此方法时会生成此异常:

System.InvalidOperationException: 'System.Void' is not a valid return type for a mapped stored procedure method. at System.Data.Linq.SqlClient.QueryConverter.TranslateStoredProcedureCall(MethodCallExpression mce, MetaFunction function) at System.Data.Linq.SqlClient.QueryConverter.VisitMappedFunctionCall(MethodCallExpression mc) at System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpression mc) at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) at System.Data.Linq.SqlClient.QueryConverter.ConvertOuter(Expression node) at System.Data.Linq.SqlClient.SqlProvider.BuildQuery(Expression query, SqlNodeAnnotations annotations) at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) at System.Data.Linq.DataContext.ExecuteMethodCall(Object instance, MethodInfo methodInfo, Object[] parameters)

任何人都可以帮我确定为什么会生成此异常吗?

谢谢, 答:

更新:L2S 设计器文件中自动生成的代码是:

[global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.MyProc")]
public void MyProc()
{
 this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())));
}

最佳答案

生成的 linq-to-sql 代码是什么样的?也许您手动将其更改为返回 void?

创建一个不提供像这样的输出的存储过程 -

CREATE PROCEDURE MyProc
AS
BEGIN
    IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'DropMe')
    DROP TABLE DropMe
END
GO

将其添加到 l2s 设计界面时应生成以下代码 -

[Function(Name = "dbo.MyProc")]
        public int MyProc()
        {
            IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())));
            return ((int)(result.ReturnValue));
        }

如果你的返回 void,这将导致它抛出该异常。

所以如果我将上面的内容更改为这个 -

[Function(Name = "dbo.MyProc")]
    public void MyProc()
    {
        IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())));
        return;
    }

调用时会抛出此异常 -

Line 17: public void MyProc() Line 18: { Line 19: IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod()))); Line 20: return;// ((int)(result.ReturnValue)); Line 21: }

Source File: C:\Build\blah.cs Line: 19

Stack Trace:

[InvalidOperationException: 'System.Void' is not a valid return type for a mapped stored procedure method.]
System.Data.Linq.SqlClient.QueryConverter.TranslateStoredProcedureCall(MethodCallExpression mce, MetaFunction function) +904265

关于asp.net - 在 LINQ-to-SQL 中运行映射存储过程方法时生成奇怪的 system.void 返回异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3193583/

相关文章:

ASP.NET 可下载图像文件?

sql-server - sql 简单存储过程 - 过滤器

c# - 设计依赖注入(inject)和单个数据上下文的重用

asp.net - LINQ to SQL 执行时间比 SSMS SQL 长 50 倍

c# - 如何使表达式将值类型视为引用类型?

mysql - MySql 过程中的 DECLARE 变量错误

stored-procedures - Sybase IN 和 OUT 参数

asp.net - dot net mvc5 Controller 中的异步函数造成死锁

jquery - asp.net ajax 使用参数进行代码隐藏

asp.net - 使用css将div移动到下一行