gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:24:41 24 4
gpt4 key购买 nike

我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com