簡體   English   中英

Linq-to-SQL - 在C#中調用存儲過程拋出異常

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM