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

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

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

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

最佳答案

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

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

关于c# - Linq-to-SQL - 在 C# 中调用存储过程抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21001436/

相关文章:

python - 带输出的 sqlalchemy 存储过程

c# - 如何在 C# 中将子字符串从一个分隔符提取到另一个分隔符?

c# - 当用户点击 ios/xamarin 通知中心的通知时触发什么事件

c# - C# 中的 Javascript 问题

c# - 如何将列值存储到数据流任务中的变量中?

使用多个表的 SQL Server 更新

c# - 带参数的开放泛型的依赖注入(inject)

sql-server - 是否可以使用 EXEC 在其他数据库中创建 View ?

c# - 如何使用 C# 中的 MySQL 存储过程将表作为存储过程的输入发送?我有 T-SQL 工作

c# - 存储过程中的转换异常