Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / SSIS ScriptTask Interop.Excel не закрывается процесс excel / 3 сообщений из 3, страница 1 из 1
29.12.2018, 13:33
    #39754917
MaxFoxxy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSIS ScriptTask Interop.Excel не закрывается процесс excel
Всех с наступающим!

Генерирую ексели и наполняю данными из SQL.
Проблема такова, не закрывается приложение excel. Не закрывается ровно тогда, когда пытаюсь на 2й лист вывести данные с помощью CopyFromRecordset. Уже 3й день борюсь с этим, все впустую...

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
 Public Sub Main()


        Dim conn As ADODB.Connection
        Dim rs As ADODB.Recordset
        Dim fld As ADODB.Field
        Dim sConnString As String

        sConnString = "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=DWH;Integrated Security=SSPI;"

        conn = New ADODB.Connection
        rs = New ADODB.Recordset


        conn.ConnectionString = sConnString
        conn.Open()
        



        Dim FileName As String

        FileName = "C:\FTP\asna\output\" + Dts.Variables("var1").Value.ToString + "_1.xlsx"

        Dim oExcel As New Microsoft.Office.Interop.Excel.Application()
        Dim oBook As Microsoft.Office.Interop.Excel.Workbook
        Dim oSheet As Microsoft.Office.Interop.Excel.Worksheet



        oExcel.ScreenUpdating = False
        oExcel.DisplayAlerts = False
        oExcel.Interactive = False
        oExcel.Visible = False
        oExcel.SheetsInNewWorkbook = 2


        oBook = oExcel.Workbooks.Add()
        Dim col As Integer

		rs = conn.Execute("select * from tab1")

        '----------------Продажи--------------------'
        oSheet = CType(oBook.Worksheets(1), Worksheet)
        oSheet.Name = "Продажи"

        If Not rs.EOF Then
            'Формирование наименований колонок
            col = 1
            For Each fld In rs.Fields
                oSheet.Cells(1, col).value = fld.Name.ToString
                col = col + 1
            Next
            'Вывод данных
            oSheet.Cells(2, 1).CopyFromRecordset(rs)

            rs.Close()
        Else
            MsgBox("Error: No records returned.")
        End If



        rs = conn.Execute("select * from tab2")

        ''----------------Закупки--------------------'
        oSheet = CType(oBook.Worksheets(2), Worksheet)
        oSheet.Name = "Закупки"


        If Not rs.EOF Then
            'Формирование наименований колонок
            col = 1
            For Each fld In rs.Fields
                oSheet.Cells(1, col).value = fld.Name.ToString
                col = col + 1
            Next
            'Вывод данных
            oSheet.Cells(2, 1).CopyFromRecordset(rs) 'Без этой строки процесс закрывается

            rs.Close()


        Else
            MsgBox("Error: No records returned.")
        End If

        conn.Close()


        ReleaseObject(fld)
        ReleaseObject(rs)
        ReleaseObject(conn)


        rs = Nothing
        fld = Nothing
        conn = Nothing


        oBook.SaveAs(FileName)
        oBook.Close()
        oExcel.Quit()

        oSheet = Nothing
        oBook = Nothing




        ReleaseObject(oSheet)        
        ReleaseObject(oBook)        
        ReleaseObject(oExcel)

        oSheet = Nothing
        oBook = Nothing
        oExcel = Nothing
        conn = Nothing

        Dts.TaskResult = ScriptResults.Success
    End Sub

	Private Sub ReleaseObject(ByVal obj As Object)
        Try
            Dim intRel As Integer = 0
            Do
                intRel = System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
                'MsgBox(intRel)
            Loop While intRel > 0
        Catch ex As Exception
            obj = Nothing
            'MsgBox(ex.Message)
        Finally
            GC.Collect()
            GC.WaitForPendingFinalizers()
        End Try
    End Sub

Модератор: Учимся использовать тэги оформления кода - FAQ
...
Рейтинг: 0 / 0
29.12.2018, 13:43
    #39754925
big-duke
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSIS ScriptTask Interop.Excel не закрывается процесс excel
MaxFoxxy,

Server-side Automation - это зло.
https://support.microsoft.com/en-us/help/257757/considerations-for-server-side-automation-of-office

В SSIS можно указать Destination на Excel ?

Если всё-таки нужно покодить, то берите любой OpenXML SDK , например, EPPlus , и кодьте на здоровье.
...
Рейтинг: 0 / 0
29.12.2018, 13:58
    #39754933
MaxFoxxy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSIS ScriptTask Interop.Excel не закрывается процесс excel
big-duke,
Понял, спс! Не придумал как сделать excel как destination, т.к. состав полей рекордсета всегда динамический...

Модератор: Тема перенесена из форума "Visual Basic".
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / SSIS ScriptTask Interop.Excel не закрывается процесс excel / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]