Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SSIS 2008 R2 xls com объект Excel не удаляется из памяти  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1258
Привет всем

SSIS 2008R2
Возникла задача по управлюящей таблице где задан список таблиц закинуть всю инфу в xls файл на отдельные вкладки Table1 , table2.

Так как в SSIS у OLE DB источинков-приемников жесткая структура
( и в силу слабого знания АПИ - но имхо задача перепрограммировать не тривиальна )

я циклом запустил бат с BCP где выдал нужную мне инфу в CSV
а потом с помощью скрипта с ком. объектоами (VB) CSV всунул в XLS

Dim oxls, obook, oSheet, oQuery As Object
oxls = CreateObject("Excel.Application")
oxls.DisplayAlerts = False
obook = oxls.Workbooks.Open(path_xls)
obook.Sheets.Add()
obook.Sheets(1).name = nm_sheet

oSheet = obook.worksheets(nm_sheet) 'obook.worksheets("Sheet1")
oSheet.Cells.ClearContents() '

oQuery = oSheet.QueryTables.Add("TEXT;" & path_csv, oSheet.Cells(1, 1))
oQuery.Refresh() ' !!
oQuery.Delete() ' !!!
...
obook.Save()
obook.Close(False)
oxls.quit()

oSheet = Nothing
oQuery = Nothing
obook = Nothing
oxls = Nothing


проблема в том что не смотря на послед. инструкции экземпляры екселя не удаляются
т.е если 3 таблицы - значит 3 екселя остается висеть.

Может у кого есть какие идеи как обмануть SSIS и убить все таки XLS процесссы
или вдруг какие то идеи для воркараунда
8 апр 13, 17:51    [14153158]     Ответить | Цитировать Сообщить модератору
 Re: SSIS 2008 R2 xls com объект Excel не удаляется из памяти  [new]
qwerty112
Guest
Гулин Федор
проблема в том что не смотря на послед. инструкции экземпляры екселя не удаляются
т.е если 3 таблицы - значит 3 екселя остается висеть.

такое обычно происходит, когда в коде есть обращение к глоб.объектам Excel.Application (типа Range, Cells, ...), без ссылки на объект-апп
но в том коде что представлен - такого нет
это весь код ?
8 апр 13, 18:19    [14153332]     Ответить | Цитировать Сообщить модератору
 Re: SSIS 2008 R2 xls com объект Excel не удаляется из памяти  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1258
qwerty112
Гулин Федор
проблема в том что не смотря на послед. инструкции экземпляры екселя не удаляются
т.е если 3 таблицы - значит 3 екселя остается висеть.

такое обычно происходит, когда в коде есть обращение к глоб.объектам Excel.Application (типа Range, Cells, ...), без ссылки на объект-апп
но в том коде что представлен - такого нет
это весь код ?


вот есть oSheet.Cells.ClearContents() '
- но я убирал это - не помогает

Переформулирую вопрос - ясно что это можно запрограммировать в любом языке программирования
а средствами самого скл-сервера это можно сделать ?
или как минимум надо что-то типа vbs
9 апр 13, 17:50    [14158300]     Ответить | Цитировать Сообщить модератору
 Re: SSIS 2008 R2 xls com объект Excel не удаляется из памяти  [new]
qwerty112
Guest
Гулин Федор
вот есть oSheet.Cells.ClearContents() '
- но я убирал это - не помогает

здесь всё нормально

вот это, вот
oQuery.Refresh() ' !!
oQuery.Delete() ' !!!
...
obook.Save()
obook.Close(False)

что значит ? что там вместо "..."
9 апр 13, 18:49    [14158583]     Ответить | Цитировать Сообщить модератору
 Re: SSIS 2008 R2 xls com объект Excel не удаляется из памяти  [new]
DaniilSeryi
Member

Откуда:
Сообщений: 1741
Гулин Федор,

перед строкой
oxls = Nothing

добавьте строку
oxls.Quit

Вот так:
oxls.Quit
oxls = Nothing


P.S. Не помню, как там в VB.NET, а в VBA надо писать:
Set oxls = Nothing
10 апр 13, 11:03    [14160483]     Ответить | Цитировать Сообщить модератору
 Re: SSIS 2008 R2 xls com объект Excel не удаляется из памяти  [new]
qwerty112
Guest
DaniilSeryi
Гулин Федор,

перед строкой
oxls = Nothing

добавьте строку
oxls.Quit

Вот так:
oxls.Quit
oxls = Nothing


P.S. Не помню, как там в VB.NET, а в VBA надо писать:
Set oxls = Nothing

он (ТС), конечно, "не очень хороший человек", так как не пользуется тегами, но строка такая есть
10 апр 13, 11:36    [14160707]     Ответить | Цитировать Сообщить модератору
 Re: SSIS 2008 R2 xls com объект Excel не удаляется из памяти  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1258
DaniilSeryi
Гулин Федор,
перед строкой
oxls = Nothing
добавьте строку
oxls.Quit
Вот так:
oxls.Quit
oxls = Nothing

P.S. Не помню, как там в VB.NET, а в VBA надо писать:
Set oxls = Nothing



Делал так - увы НЕ помогает
oxls = Nothing
obook.Save()
obook.Close(False)
oSheet = Nothing
oQuery = Nothing
obook = Nothing
oxls.quit()
oxls = Nothing


зы я бы исправил первонач. сообщение забываю теги кода вставлять - но увы нельзя это сделать на этом форуме
10 апр 13, 12:26    [14161079]     Ответить | Цитировать Сообщить модератору
 Re: SSIS 2008 R2 xls com объект Excel не удаляется из памяти  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1258
полный код сниппета
Public Sub Main()
        Dts.Events.FireInformation(0, "----------", "-------------", "", 0, True)
        Dim path_xls As String = Dts.Variables("v_xls_fullname").Value '.ToString
        Dim path_csv As String = Dts.Variables("v_csv_fullname").Value
        Dts.Events.FireInformation(1, path_xls, path_csv, "", 0, True)
        Dim oxls, obook, oSheet, oQuery As Object

        oxls = CreateObject("Excel.Application")
        oxls.DisplayAlerts = True ' False 'True 'False

        Dts.Events.FireInformation(1, "Add book ", "", "", 1, True)
        oxls.Workbooks.add()
        obook = oxls.Workbooks(1)
        obook.saveas(path_xls) 'oxls.saveas(path_xls)

        Dts.Events.FireInformation(1, "1-st save ", "", "", 1, True)
        Dim nm_sheet As String = Dts.Variables("v_table").Value '"v2" 'path_csv ' "V1"
		
        Dts.Events.FireInformation(1, " before add sheet", "", "", 1, True)
        obook.Sheets.Add()
        Dts.Events.FireInformation(1, " after add sheet", "", "", 1, True)

        Dim kol As Integer
        kol = obook.Sheets.count
        Dts.Events.FireInformation(1, kol, " SHEETS", "", 1, True)

        'obook.Sheets(kol).name = nm_sheet ' insert before !! - 1-st sheet
        obook.Sheets(1).name = nm_sheet
        Dts.Events.FireInformation(1, " name ", "", "", 1, True)
        oSheet = obook.worksheets(nm_sheet) 'obook.worksheets("Sheet1")
        oQuery = oSheet.QueryTables.Add("TEXT;" & path_csv, oSheet.Cells(1, 1))
        oQuery.TextFileParseType = 1 ' xlDelimited
        'oQuery.TextFileSemicolonDelimiter = True ' ; 'TextFileCommaDelimiter
        oQuery.TextFileOtherDelimiter = "~"
        oQuery.Refresh() ' !!
        oQuery.Delete() ' !!!

        obook.Save()
        obook.Close(False)

        oSheet = Nothing
        oQuery = Nothing
        obook = Nothing


        oxls.quit()
        oxls = Nothing
        Dts.Events.FireInformation(99, "END ", "END message ==========", "", 0, True)

        Dts.TaskResult = ScriptResults.Success
    End Sub
10 апр 13, 12:30    [14161143]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить