Sql-Server-2016
SSIS 容錯數據連接
我覺得可能離這個太近了。我繼承了一個
SSIS package
有兩個數據連接對象的。在OLE DB
連接(執行工作)和ADO.NET
連接(到不同的伺服器)以進行日誌記錄。ADO.NET 連接遠端的伺服器可能不穩定,我需要使日誌記錄容錯。日誌記錄任務已設置為在失敗時不讓包失敗,也不讓父級失敗。然而,這個過程並沒有那麼遠。包失敗是因為連接失敗,而不是因為任務失敗。
這個包的邏輯路徑是Log Start > Do Stuff > Log Completion。在這個特定的範例中,Log Start 成功,Do Stuff 也是如此。日誌完成失敗,因為伺服器突然不可用。
SSIS 報告級別的錯誤消息是
日誌狀態完成錯誤:無法獲取連接“記錄 ADO NET”。連接可能未正確配置,或者您可能沒有正確的權限 pm 此連接。
歡迎所有建議。(謝謝和聖誕快樂)
不確定這是解決方案還是解決方法。不管怎樣,它解決了這個問題。我禁用了 SQL 任務並創建了一個腳本任務。連接發生在 try/catch 中。如果失敗,流程將轉到“無所事事”的 catch 塊。該軟體包將完成視為成功和進展繼續。包括新腳本任務的螢幕圖像及其程式碼。
#region Namespaces using System; using System.Data; using System.Data.SqlClient; using Microsoft.SqlServer.Dts.Runtime; using System.Windows.Forms; #endregion namespace ST_4ddaab95fb4d46ef9521d651f5227575 { [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute] public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase { public void Main() { Package pkg = new Package(); Variables vars = null; VariableDispenser vd = pkg.VariableDispenser; SqlConnection LoggingConn; SqlCommand LoggingCommand; vd.GetVariables(ref vars); try { LoggingConn = (SqlConnection)Dts.Connections["Logging ADO NET"].AcquireConnection(null); LoggingCommand = new SqlCommand("[etl].[usp_LogPackageStatus]", LoggingConn); LoggingCommand.CommandType = CommandType.StoredProcedure; LoggingCommand.Parameters.AddWithValue("@PackageID", vars["System::PackageID"].Value.ToString()); LoggingCommand.Parameters.AddWithValue("@PackageName", vars["System::PackageName"].Value.ToString()); LoggingCommand.Parameters.AddWithValue("@MasterExecutionID", vars["$Package::MasterExecutionID"].Value.ToString()); LoggingCommand.Parameters.AddWithValue("@ExecutionID", vars["System::ExecutionInstanceGUID"].Value.ToString()); LoggingCommand.Parameters.AddWithValue("@Status", vars["User::Status"].Value.ToString()); LoggingCommand.Parameters.AddWithValue("@StartTime", vars["User::StartTime"].Value.ToString()); LoggingCommand.ExecuteNonQuery(); } catch (Exception ex) { //Do nothing //For Debugging //MessageBox.Show(ex.Message); } Dts.TaskResult = (int)ScriptResults.Success; } #region ScriptResults declaration enum ScriptResults { Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success, Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure }; #endregion }
}