2017-04-12 68 views
2

我有一個預定的SSIS包,script task在我們的服務器上的SQL Server Agent。我確實爲SQL連接設置了timeout,並且對於Try塊中的一些代碼,它會拋出錯誤,Catch塊中有MessageBox.Show。如果我將代碼保留原樣,它將會使作業失敗,但如果我註釋掉這些MessageBox.Show並將Catch塊留作空白僅用於測試目的,則作業會成功運行。將MessageBox.Show導致服務器端的超時問題?

有人知道MessageBox.Show會影響服務器端連接的timeout,或者在禁用顯示錯誤消息後究竟導致這種不同的結果是什麼?如果是Visual Studio的SSDT外執行

感謝提前:)

+2

目前尚不清楚,但如果您顯示一個消息框,我會假設執行會暫停,直到消息框被關閉? – Tanner

+0

我不認爲MessageBox.Show會減慢並導致服務器超時。你可以發佈你的代碼示例,以便我們可以清楚一點。另外,爲了排除巧合的可能性,我會建議重複幾次測試來重複測試:) –

+0

或者MessageBox將腳本直到達到超時限制? – LONG

回答

6

扔在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表。

+0

,需要消化xD – LONG

1

Messagebox.show會拋出異常。當你刪除它時,catch塊是空的,所以你的腳本會忽略這個異常(空catch塊=沒有錯誤處理,只是忽略)。

如果您刪除了try.. catch塊,將會顯示異常並顯示一條消息。

超時可能由Messagebox.show

+0

Thx Hadi,或者我可以理解,'Messagebox.Show'會將任務掛起直到它遇到超時然後拋出錯誤? – LONG

+0

我認爲。但是'Messagebox.show()'拋出的異常是ssis無法顯示圖形組件。不是真正的 – Hadi

+0

upvoted的答案,謝謝你的詳細解答Hadi – LONG