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