Linq-to-SQL - 在C#中调用存储过程引发异常

5
我有一个存储过程,通过Linq-to-SQL在C#中调用。我在存储过程中编写了一些代码来检查@@error值,如果它是非零值,我想返回自定义错误消息。
我试图故意破坏我的存储过程,以测试如何处理错误。
在下面的示例中,您将看到我正在尝试将一个六个字符的值插入到只支持五个字符的列中,从而导致截断错误。
存储过程将捕获该问题,并将错误代码/描述保存到一些OUTPUT参数中,但在我的C#代码中,对存储过程的调用会引发异常,因此无法获取我的错误代码/描述参数的值。
为了以最简单易懂的方式说明这一点,假设我有以下表:
CREATE TABLE [dbo].[Test](
[itemName] [varchar](5) NOT NULL
) ON [PRIMARY]

以下是我的存储过程代码:

CREATE PROCEDURE [dbo].[TestSP]
@itemName VARCHAR(5)
,@Error BIT OUTPUT
,@ErrorReason VARCHAR(1000) OUTPUT
AS

BEGIN

SET NOCOUNT ON

DECLARE @err INT

BEGIN TRANSACTION

INSERT INTO [dbo].[Test]
       ([itemName])
 VALUES
       --(@itemName)
       ('123456')

SELECT @err = @@error 
IF @err <> 0 
    BEGIN 
        ROLLBACK TRANSACTION 
        SELECT @Error = 1
        SELECT @ErrorReason = 'Error while inserting row to Test table'
        RETURN @err 
    END

--If all 3 table inserts succeed without issue then return 0
COMMIT TRANSACTION

END

最后,这是我的C#代码,会抛出异常。

异常信息为: String or binary data would be truncated. The statement has been terminated. (System.Data.SqlClient.SqlException)

有没有什么方法可以避免抛出这个异常,以便我可以使用我的OUTPUT参数?

try
{
    using (DataClasses1DataContext dbContext = new DataClasses1DataContext())
    {
        bool? error = false;
        string errorText = "";

        int result = dbContext.TestSP("test", ref error, ref errorText);
    }
}
catch (Exception ex)
{
    string err = ex.Message;
    throw;
}

TestSP抛出了什么异常? - Mikey Mouse
你不应该在存储过程内部使用TRY/CATCH来避免异常被抛给调用者吗? - Yuriy Galanter
@MichaelMaillet请编辑您的帖子并将异常放在那里。 - crthompson
最好将异常编辑到您的问题中,但我认为Yuriy是正确的,如果您在存储过程中使用SQL try和catch,它应该在那里处理,而不是传递回来。 - Mikey Mouse
你是想测试存储过程还是一些C#代码? - Keith Payne
为什么你在使用@@ERROR而不是TRY/CATCH? - Aaron Bertrand
2个回答

2

在存储过程的TSQL代码中,应使用TRY/CATCH。这样,实际异常将在数据库端处理,而不会抛出给C#调用者。

请参阅MSDN链接中的示例,包括提交/回滚事务。


1
你可以尝试这样做。
BEGIN TRY
BEGIN TRANSACTION
   INSERT INTO [dbo].[Test] ([itemName]) VALUES ('123456')
COMMIT TRANSACTION
END TRY
BEGIN CATCH
   ROLLBACK TRANSACTION 
   SELECT @Error = 1
   SELECT @ErrorReason = 'Error while inserting row to Test table'
   RETURN @err 
END CATCH

我会添加TRY/CATCH部分。这似乎解决了问题。谢谢大家。 - Michael Maillet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接