【问题标题】:Linq-to-SQL - Calling stored procedure throwing exception in C#Linq-to-SQL - 在 C# 中调用存储过程引发异常
【发布时间】:2014-01-08 16:38:59
【问题描述】:

我有一个通过 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;
}

【问题讨论】:

  • TestSP 抛出的异常是什么?
  • 你不应该在你的 SP 中使用 TRY/CATCH 来避免向调用者抛出异常吗?
  • @MichaelMaillet 编辑您的帖子并将异常放在那里。
  • 最好将异常编辑到您的问题中,但我认为 Yuriy 是对的,如果您在存储过程中使用 SQL try and catch 它应该在那里处理而不是传回
  • 你是在测试存储过程还是一些c#代码?

标签: c# sql-server stored-procedures linq-to-sql


【解决方案1】:

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

查看 MSDN 链接中的示例,包括提交/回滚事务。

【讨论】:

    【解决方案2】:

    你可以试试这样的

    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 部分。这似乎可以解决问题。谢谢大家。
    猜你喜欢
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多