Задание SQL в SSIS Excel RefreshAll () завершается ошибкой, когда никто не вошел в систему - PullRequest
0 голосов
/ 02 марта 2012

Несколько месяцев назад я создал пакет служб SSIS, который используется для обновления нескольких рабочих листов Excel (+ несколько других вещей)

Теперь мой колледж, который все еще работает над проектом, сообщает об этом странном поведении.Пакет служб SSIS запланирован как задание агента SQL.

Он запускается ежечасно с 8:00.В 8 утра он всегда терпит неудачу , его вывод: в 8 утра никто не вошел на сервер.Второй раз, в 9 утра, работа идет нормально.(RefreshAll сработало) Его вывод: в этот момент на сервере всегда есть кто-то, вошедший в систему через RDP.

(На самом деле я не знаю о других запусках в тот же день)

Задача представляет собой задачу VB Script, которая вызывает библиотеки Excel Interop.Я помню, как мне было трудно заставить его работать, пока я не установил Excel 2010 x86 на сервер.-> Excel полностью и законно установлен на сервере.

В тот момент я предположил и решил, что иногда он что-то не так и Excel не закрывался должным образом.Когда я открыл taskmgr, я обнаружил +10 экземпляров Excel.exe, запущенных ... Это было во время разработки.

Мой колледж провел интересный тест : планировал работу каждую минуту, входил в систему ивыключить несколько раз на сервер.Каждый раз, когда никто не входил в систему на сервере (RDP), задание не выполнялось.При входе в систему задание выполнялось ОК!

Ниже кода, который используется в задаче сценария 'RefreshAll'.

Я также использовал threading.sleep, потому что в противном случае я получил ошибки тайм-аута.Другого пути не нашел.

Заранее спасибо !!L

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 Ответ

1 голос
/ 02 марта 2012

Excel - это клиентское приложение, и обычно ему требуется активный сеанс пользователя на компьютере, на котором он запущен. Для такой работы я бы рассмотрел другие подходы, не связанные с работой с процессом Excel, eiter:

  • сохраните результат в таблице сервера SQL, а затем используйте связанную таблицу из таблицы Excel для извлечения данных.
  • использовать экспорт как .csv (значения, разделенные запятыми)
  • использовать сторонние элементы управления, которые пишут в формате Excel
  • они могут это исправить в следующей версии Excel?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...