2014-04-01 29 views
1

我使用的SQLConnection和命令C#執行批處理SQL命令的其餘部分繼續。我需要能夠知道哪個語句失敗,並且由於性能問題,我無法一次執行這些語句。在C#中有什麼方法可以執行批處理SQL語句,並且在失敗的情況下,告訴我什麼語句失敗(索引,標識或任何可以知道哪一個的語句),然後繼續處理其餘的聲明。C#執行批處理SQL命令,捕獲異常,然後用一批

感謝

回答

1

你沒有提到你正在使用的數據庫,但如果你使用SQL Server 2005或更高版本,可以使用try/catch語句這一點。這是一個例子。

BEGIN TRY 
    select 1/0 
END TRY 
BEGIN CATCH 
    SELECT 'statement 1 failed' AS Statement,ERROR_MESSAGE() as ErrorMessage,ERROR_SEVERITY() AS Severity; 
END CATCH 

BEGIN TRY 
    select 1.0/2 
END TRY 
BEGIN CATCH 
    SELECT 'statement 2 failed' AS Statement,ERROR_MESSAGE() as ErrorMessage,ERROR_SEVERITY() AS Severity; 
END CATCH 

在這種情況下,我趕上了錯誤,只是返回它們的結果集,但你可以在開始創建臨時表/變量,插入,當錯誤發生,然後選擇所有結束時從該表格開始的行。

編輯:這是一個將在觸發拋出一個錯誤的例子:

create table csm (id int) 
go 
create trigger tr_i_csm on csm for insert as 
declare @d int 
select @d=sum(id) from inserted 
if (@d>=10) 
begin 
raiserror('error',@d,0) 
end 
go 

BEGIN TRY 
    BEGIN TRAN 
    insert into csm values (5) 
    COMMIT 
END TRY 
BEGIN CATCH 
    ROLLBACK 
    SELECT 'statement 1 failed' AS Statement,ERROR_MESSAGE() as ErrorMessage,ERROR_SEVERITY() AS Severity; 
END CATCH 

BEGIN TRY 
    BEGIN TRAN 
    insert into csm values(16) 
    COMMIT 
END TRY 
BEGIN CATCH 
    ROLLBACK 
    SELECT 'statement 2 failed' AS Statement,ERROR_MESSAGE() as ErrorMessage,ERROR_SEVERITY() AS Severity; 
END CATCH 

BEGIN TRY 
    BEGIN TRAN 
    insert into csm values(2) 
    COMMIT 
END TRY 
BEGIN CATCH 
    ROLLBACK 
    SELECT 'statement 3 failed' AS Statement,ERROR_MESSAGE() as ErrorMessage,ERROR_SEVERITY() AS Severity; 
END CATCH 

selecT * from csm 
+0

C#SqlConnection是指Sql Server。其他任何東西都會有不同的連接對象:OleDbConnection,OdbcConnection,MySqlConnection等。 –

+0

所以基本上,你試圖繞過每一個聲明?另外,正如我所提到的,如果在C#中有任何方法可以做到,請告訴我。我懷疑它會很難改變實施 –

+0

@TeddyBlack是的,非常。那麼你可以控制你在出現錯誤時做什麼。 – csm8118

0

一個選項是在您的批次每個查詢以下print語句。然後,您可以查看輸出以查找故障。 (有關如何閱讀本文的信息,請參閱here)。

在之前的工作中,我們有一些是通過SQL代理跑了夜間的存儲過程,並用C#編寫跑作爲Windows計劃任務的一些其他非數據庫工作。我們最終編寫了一個c#程序來調用存儲過程,而不是Sql Agent,以便我們可以將所有的調度(和日誌記錄)放在一個地方(計劃任務)。我們也支持通過程序執行Sql文件。接收打印消息輸出是我們如何處理日誌記錄。

當然,這意味着修改批處理腳本的能力。這也意味着編寫SQL,使失敗的語句不會終止整個工作。

+0

有趣。是的,我需要它來跟蹤哪些失敗,但我也不希望它失敗時終止。 –