我有一个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'不是有效的退货 为映射的存储过程键入 方法。在 System.Data.Linq.SqlClient.QueryConverter.TranslateStoredProcedureCall(MethodCallExpression mce,MetaFunction函数)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(表达式 节点) System.Data.Linq.SqlClient.QueryConverter.ConvertOuter(表达式 节点) System.Data.Linq.SqlClient.SqlProvider.BuildQuery(表达式 查询,SqlNodeAnnotations注释) 在 System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(表达式 查询) System.Data.Linq.DataContext.ExecuteMethodCall(对象 实例,MethodInfo methodInfo, 对象[]参数)
任何人都可以帮我确定为什么会生成此异常吗?
谢谢, 甲
更新:L2S设计器文件中自动生成的代码为:
[global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.MyProc")]
public void MyProc()
{
this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())));
}
答案 0 :(得分:3)
生成的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;
}
调用后会抛出此内容 -
第17行:public void MyProc()Line 18:{第19行:IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo的)(MethodInfo.GetCurrentMethod()))); 第20行:返回; // ((INT)(result.ReturnValue));第21行: }
源文件:C:\ Build \ blah.cs行: 19
堆栈追踪:
[InvalidOperationException异常: 'System.Void'不是有效的退货 为映射的存储过程键入 方法。]
System.Data.Linq.SqlClient.QueryConverter.TranslateStoredProcedureCall(MethodCallExpression mce,MetaFunction函数)+904265
答案 1 :(得分:1)
伙计们只是为了让你知道我设置了nocount on
这就解决了这个问题!
我必须在设计师模式下重新添加我的sp。