[英]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.