C# Linq到SQL-在C中调用引发异常的存储过程#
我有一个通过Linq到SQL在C#中调用的存储过程。我的存储过程中有一些代码来检查C# Linq到SQL-在C中调用引发异常的存储过程#,c#,sql-server,stored-procedures,linq-to-sql,C#,Sql Server,Stored Procedures,Linq To Sql,我有一个通过Linq到SQL在C#中调用的存储过程。我的存储过程中有一些代码来检查@@error值,如果它是非零值,我想返回一条自定义错误消息 我试图故意破坏我的存储过程,以测试如何处理错误 在下面的示例中,您将看到我试图将一个六个字符的值插入到一个只支持五个字符的列中,从而导致截断错误 存储过程将捕获问题并将错误代码/描述保存到一些输出参数中,但是在我的C#code中,调用存储过程会引发异常,因此我无法获取错误代码/描述参数的值 为了以最简单易懂的方式说明这一点,假设我有下表: CREATE
@@error
值,如果它是非零值,我想返回一条自定义错误消息
我试图故意破坏我的存储过程,以测试如何处理错误
在下面的示例中,您将看到我试图将一个六个字符的值插入到一个只支持五个字符的列中,从而导致截断错误
存储过程将捕获问题并将错误代码/描述保存到一些输出
参数中,但是在我的C#code中,调用存储过程会引发异常,因此我无法获取错误代码/描述参数的值
为了以最简单易懂的方式说明这一点,假设我有下表:
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
您应该在存储过程内部的TSQL代码中使用。这样,实际的异常将在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
TestSP抛出的异常是什么?你不应该在SP内部使用TRY/CATCH来避免异常被抛出给调用方吗?@MichaelMaillet编辑你的帖子并将异常放在那里。最好在你的问题中编辑异常,但我认为Yuriy是对的,如果在存储过程中使用SQL try-and-catch,它应该在那里得到处理,而不是传回。您是在测试存储过程还是某些c代码?我将在try/catch部分中添加。这似乎奏效了。谢谢大家。
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