繁体   English   中英

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

[英]Linq-to-SQL - Calling stored procedure throwing exception in C#

我有一个存储过程,我通过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#代码,它会引发异常。

例外情况是:字符串或二进制数据将被截断。 该语句已终止。 (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;
}

您应该在存储过程内的TSQL代码中使用TRY / CATCH 这样,实际的异常将在DB端处理,不会被抛给C#调用者。

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

你可以尝试这样的事情

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM