2012-03-02 44 views
0

幾個月前,不會記錄任何一個任務,SQL作業失敗,我做了用於刷新了幾個Excel工作表(+其他一些東西)SSIS的Excel RefreshAll()時

現在SSIS包,我的大學那仍然在項目上報告這種奇怪的行爲。 SSIS包計劃爲SQL代理作業。

從8am00開始每小時運行一次。在早上8點,它總是失敗,他的結論是:在上午8點沒有人登錄服務器。 第二次,在上午9點,作業運行正常。 (RefreshAll工作)他的結論是:在那個時刻總有人通過RDP登錄到服務器上。

(其實我不知道其他運行後當天)

任務是一個VB腳本任務調用Excel的互操作的DLL。我記得在我在服務器上安裝Excel 2010 x86之前無法正常工作。 - > Excel完全合法地安裝在服務器上。

我在那個時候的猜測和決心是,它有時在某個地方出錯,Excel沒有正常關閉。當我打開taskmgr時,我發現運行Excel.exe的+10個實例...這是在開發過程中。

我的大學做了一個有趣的測試:每分鐘安排一次作業,並登錄和關閉幾次到服務器。每次沒有人登錄到服務器(RDP)時,作業都會失敗。登錄時,作業運行正常!

在'RefreshAll'腳本任務中使用的代碼下面。

我也使用threading.sleep,否則我得到超時錯誤。沒有找到其他方式。

在此先感謝! 大號

Public Sub Main() 
     Dts.TaskResult = ScriptResults.Success 

     Dim oApp As New Microsoft.Office.Interop.Excel.Application 
     oApp.Visible = False 
     'oApp.UserControl = True 
     Dim oldCI As System.Globalization.CultureInfo = _ 
      System.Threading.Thread.CurrentThread.CurrentCulture 
     System.Threading.Thread.CurrentThread.CurrentCulture = _ 
      New System.Globalization.CultureInfo("en-US") 

     Dim wb As Microsoft.Office.Interop.Excel.Workbook 
     wb = oApp.Workbooks.Open(Dts.Variables("User::FileNameHandleFull1").Value.ToString) 
     oApp.DisplayAlerts = False 
     wb.RefreshAll() 
     Threading.Thread.Sleep(10000) 
     wb.Save() 
     wb.Close() 
     oApp.DisplayAlerts = True 

     oApp.Quit() 
     Runtime.InteropServices.Marshal.ReleaseComObject(oApp) 

    End Sub 

End Class 

回答

1

Excel是客戶端應用程序,通常它需要有它運行在計算機上的活動用戶會話。對於這樣的工作,我會考慮不涉及與Excel進程,eiter工作的其他方法:

  • 。結果存儲在SQL Server表,然後用鏈接表從Excel表提取數據。
  • 利用出口爲.csv(逗號分隔值)寫入Excel格式
  • 他們可以修復它在Excel的下一個版本
  • 使用第三方控件?
+0

Thx,所以沒有其他修復,並讓refreshAll函數從ssis任務中調用?!我運行SQL服務器作業EM-個性化我的用戶帳戶,所以實際上應該是相同的..?這是2010年的卓越,所以那麼我必須等到2014年左右=不是一種選擇。謝謝! – laurens 2012-03-02 14:37:34

+0

Excel需要活動的用戶會話。 – b0rg 2012-03-02 15:10:10