使用Entity Framework,我应该在我的存储过程中使用RETURN还是SELECT?
我目前正在尝试使用Entity Framework的存储过程,我遇到了返回类型的问题。
我的存储过程的返回类型是BIT。
这是我的存储过程的代码(简化):
CREATE PROCEDURE [dbo].[sp_makeStuff] @id int AS BEGIN DECLARE @status BIT BEGIN TRY BEGIN TRANSACTION DELETE FROM MyTable WHERE Id = @id SET @status = 1 COMMIT END TRY BEGIN CATCH SET @status = 0 ROLLBACK END CATCH RETURN @status END END
我在我的.edmx文件中添加了sp_makeStuff,返回类型为bool?。
然后,我尝试使用下面的代码执行它
using (var ctx = new MyEntities()) { ObjectResult result = ctx.sp_makeStuff(id); if (result.FirstOrDefault().Value) { // Stuff } }
但是,它引发了System.Data.EntityCommandExecutionException类型的exception,其消息是“商店数据提供程序返回的数据读取器没有足够的列用于请求的查询”。
经过一番调查,我发现如果我更换它会有效
RETURN @status
通过
SELECT @status
在过去,我总是使用T-SQL“RETURN”关键字来返回这样的结果。
我想知道我的新实现是否正确。 因为我想在我的项目中使用EF,是否有意义使其与“RESULT”一起使用或者我必须明确地使用“SELECT”?
谢谢。
编辑24/10/2014
根据下面的回答,我重新编写了我的存储过程。 如果出现问题,它会引发错误而不是返回某些内容。
CREATE PROCEDURE [dbo].[sp_makeStuff] @id int AS BEGIN BEGIN TRY BEGIN TRANSACTION DELETE FROM MyTable WHERE Id = @id COMMIT END TRY BEGIN CATCH ROLLBACK RAISERROR('Delete failed', 16, -1) END CATCH END END
然后,我告诉EF我的存储过程什么都不返回,如果调用RAISERROR,我会处理exception。
try { ctx.sp_web_DeleteElement(elementId); // ... } catch (Exception e) // Message in e.InnerException.Message { // ... }
在过去,我总是使用T-SQL“RETURN”关键字来返回这样的结果。
存储过程返回码只能是整数。 其目的是指示调用应用程序的成功或失败,而不是返回数据。 使用OUTPUT参数或结果集返回数据。
返回值约定是零表示成功,错误/警告不为零。 非零值还可用于指示特定原因(例如,在更新尝试期间未找到客户的99)作为引发错误的替代方案。 默认情况下,如果引发任何严重性为10或更高的错误,SQL Server将返回负值。