簡體   English   中英

SQL管理對象,“錯誤時仍繼續”日志消息

[英]SQL Management Object, Continue On Error yet log message

我目前正在使用SMO來幫助自動修補和/或升級生產中的客戶數據庫。 我正在使用以下代碼

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發出的SQLConnection消息,這些消息使我對正在發生的事情相當簡單。 我是否也在通過創建的LogMessage(string)事件記錄自己各種消息。

我真正想做的是執行腳本,以便在出現錯誤時繼續執行,但仍然記錄錯誤,而不必像現在那樣進行。

原因是一些破壞交易的錯誤是微不足道的,並且可以進行。 就像嘗試在存在索引或擁有索引時創建索引。

有什么辦法既可以繼續執行錯誤腳本,又可以記錄錯誤消息?

**編輯**澄清兩個對象是什么

scriptInfo是一個FileInfo對象,它告訴StreamReader何處加載sql腳本。

db是與SQLClient.Connection關聯的SMO Database對象,允許我在與db關聯的數據庫上執行腳本

錯誤記錄發生在SqlClient.SqlConnections LogMessage事件上,或者發生在LogMessage事件中

假設您使用的是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' 

失敗后,該腳本將繼續處理。 如果存在錯誤,它們將在結果集中返回。 因此,您需要更改原始代碼,但我想無論如何您都必須適應一個腳本中的多個錯誤。

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

您發布的內容只是您對其中任何'scriptinfo'的執行調用。

'scriptinfo'的文字是什么? 那是您需要查找/內置優美處理以處理失敗的CRUD /事務/等的地方。

如果您可以發布“ scriptinfo”,也許我可以給您一些想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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