2010-07-23 40 views
2

我目前正在使用SMO來幫助自動修補和/或升級正在生產的客戶數據庫。我使用下面的代碼SQL管理對象,繼續出錯但日誌消息

Public Sub RunScript(ByVal db As Database, ByVal scriptInfo As FileInfo) 
    If scriptInfo.Exists Then 

     RaiseEvent LogMessage("Executing Indicated Script: " & scriptInfo.Name) 
     Using sr As New StreamReader(scriptInfo.FullName) 
      Dim script As String = sr.ReadToEnd 
      Try 
       db.ExecuteNonQuery(script) 
      Catch ex As Exception 
       RaiseEvent LogMessage("ERROR: " & ex.Message.ToString) 
       db.ExecuteNonQuery(script, 
           Microsoft.SqlServer.Management.Common.ExecutionTypes.ContinueOnError) 
      End Try 
     End Using 

    End If 
End Sub 

,我與Database一部分給我所發生的事情相當簡單的郵件用的是什麼,我做的是記錄的SQLConnection消息被脫落SQLConneciton的。我還在通過我創建的LogMessage(string)事件記錄自己的各種消息。

我真的很希望能夠做的是執行腳本,以便在出現錯誤時繼續執行,但仍然記錄出現錯誤,而不必按現在的方式執行。

原因是一些打破交易的錯誤是微不足道的,它們正在發生。就像試圖在一個存在或者你擁有什麼時創建一個索引一樣。

有什麼辦法可以在錯誤時繼續執行腳本,但仍然會記錄錯誤消息嗎?

**編輯** 一種什麼樣的兩個對象進來是

scriptInfo是一個FileInfo對象,告訴StreamReader要加載從SQL腳本澄清。

db是與SQLClient.Connection相關的SMO Database對象,讓我一個與db

錯誤日誌上SqlClient.SqlConnections OnInfo事​​件發生關聯的數據庫上執行的腳本,或者從LogMessage事件

回答

2

假設您使用SQL Server 2005或更高版本,則可以對腳本中的每個語句使用不同的TRY/CATCH塊。以下是一個示例:

DECLARE @errorLog TABLE (
    row_id INT NOT NULL IDENTITY(1,1), 
    error_msg NVARCHAR(4000) 
) 

/** Create the table **/ 
BEGIN TRY 
    CREATE TABLE t1 (RowID INT NOT NULL) 
END TRY 

BEGIN CATCH 
    INSERT @errorLog (error_msg) 
    SELECT ERROR_MESSAGE() 
END CATCH 

/** Create the table again - will raise an error message **/ 
BEGIN TRY 
    CREATE TABLE t1 (RowID INT NOT NULL) 
END TRY 

BEGIN CATCH 
    INSERT @errorLog (error_msg) 
    SELECT ERROR_MESSAGE() 
END CATCH 

/** Create the index **/ 
BEGIN TRY 
    CREATE INDEX IX_t1 ON t1 (RowID) 
END TRY 

BEGIN CATCH 
    INSERT @errorLog (error_msg) 
    SELECT ERROR_MESSAGE() 
END CATCH 

/** Return the errors **/ 
IF EXISTS (SELECT * FROM @errorLog) 
    SELECT error_msg FROM @errorLog 

/** Confirm it worked **/ 
EXEC sp_help 't1' 

此腳本將在故障後繼續處理。如果存在錯誤,它們將返回結果集中。所以你需要改變你的原始代碼,但我認爲你可能不得不爲了在一個腳本中容納多個錯誤。

另一方面,重複索引錯誤等事情很容易在腳本中處理(即檢查對象是否已經存在)。由於此解決方案需要對原始腳本進行大量更改,因此這可能是更好的選擇。

+0

我們使用CodeSmith來生成這個程序所使用的大部分腳本,但對腳本的修改不是問題。最後一行'EXEC sp_help't1''做了什麼? (谷歌搜索,但它會很好的答案)。我們也儘可能地使用If Exists不存在,因爲我們可以。 – msarchet 2010-08-05 14:15:44

+0

最後一行僅僅是爲了表明腳本儘管出現了錯誤仍然有效。 sp_help命令顯示錶的結構,約束和索引。 – 8kb 2010-08-05 15:14:08

0

你發佈的內容只是你對'scriptinfo'所具有的任何執行調用。

'scriptinfo'的內容是什麼?這就是你需要查看/內置在失敗的CRUD /交易等優雅處理。

如果你可以發佈'scriptinfo',也許我可以給你一些想法。