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