扔在DTS異常造成的,您可以創建將導致包無限期等待點擊一個按鈕,繼續UI交互。
SSIS通過確定它是否在「interactive mode」中運行來嘗試解決此問題。這與Hadi的答案類似,但不同之處在於僅在BIDS/SSDT/Visual Studio之外運行SSIS包不足以觸發交互模式標誌未設置。
嘗試與以非交互模式運行的SSIS包進行UI交互將導致從代碼拋出異常。
如果我加入消息框的腳本任務,我找到一個有用的模式是系統:: InteractiveMode變量添加爲只讀變量的任務,然後使用以下
bool interactiveMode = (bool) Dts.Variables["System::InteractiveMode"].Value;
if (interactiveMode)
{
// UI code here
MessageBox.Show("Something happened");
}
我找到上述內容更清晰,因爲相同的代碼可以部署到生產環境,也可以在我的桌面上運行,而不是「一切正常,一秒鐘內完成更改以移除調試墊片」......並修復那些可能會出現的代碼已經做得更好
作爲最後一點,我還發現,使用UI元素不好的形式,因爲我懶惰,不想必須截圖或寫下他們所說的話。相反,請使用包中的Dts.Events.FireInformation
事件。例如,這個泛型代碼將枚舉所有變量(我已經檢查爲只讀或讀寫)及其值。
public void Main()
{
bool fireAgain = false;
string message = "{0}::{1} : {2}";
foreach (var item in Dts.Variables)
{
Dts.Events.FireInformation(0, "SCR Echo Back", string.Format(message, item.Namespace, item.Name, item.Value), string.Empty, 0, ref fireAgain);
}
Dts.TaskResult = (int)ScriptResults.Success;
}
現在,當我運行該程序包,在Visual Studio中我的輸出選項卡(在那裏我可以選擇它全部)+圖形結果選項卡將所有這些信息的消息。當我運行該軟件包時,如果我使用2005/2008或2012+包部署模型,我需要確保我有/rep eiw
的參數來將錯誤,信息和警告事件捕獲到作業日誌或控制檯或任何默認是隻報告錯誤)。 2012+與項目部署模型將自動將信息捕獲到SSISDB.catalog.operation_messages表。
目前尚不清楚,但如果您顯示一個消息框,我會假設執行會暫停,直到消息框被關閉? – Tanner
我不認爲MessageBox.Show會減慢並導致服務器超時。你可以發佈你的代碼示例,以便我們可以清楚一點。另外,爲了排除巧合的可能性,我會建議重複幾次測試來重複測試:) –
或者MessageBox將腳本直到達到超時限制? – LONG