none
SSIS Paket mit MSSQL Agent kennt Excel Zugriff nicht mehr

    Allgemeine Diskussion

  • Ich habe ein SSIS Intergration Paket mit einer VB Scriptkomponente erstellt. Dabei werden Daten an das Excel übergeben dort neu berechnet und die Ergebnisspalten wieder eingelesen.

    Das funktioniert innerhalb Visual Studio richtig.

    Auf dem Server manuell ausgeführt mittels SQLServer 2018 Integration Service Package Execution Utility ebenfalls.

    Wenn ich es aber durch den SQL Server Agent starten lassen, funktioniert es nicht mehr.

    Haben dem Agentdienst ein Adminkonto zugeteilt ohne Erfolg. Es muss vermutlich mit den Rechten zu tun haben, finde aber das Problem leider nicht. Habe für den Agent auch das Proxy Konto angelegt, läuft auch nicht. Bringt folgende Fehlermeldung:

    Meldung
    Ausgeführt als Benutzer: ''JP\if_support''. Microsoft (R) SQL Server-Paketausführungsprogramm  Version 11.0.6020.0 für 32-Bit  Copyright (C) Microsoft Corporation. Alle Rechte vorbehalten.    Gestartet: 19:13:43  Fehler: 2017-05-18 19:13:50.96     Code: 0xC0047062     Quelle: Datenflusstask Excel auslesen [332]     Beschreibung: System.Runtime.InteropServices.COMException (0x8001010A): Eine Instanz der COM-Komponente mit der CLSID {00024500-0000-0000-C000-000000000046} konnte aufgrund des folgenden Fehlers nicht von der IClassFactory erstellt werden: 8001010a Durch den Messagefilter wurde angezeigt, dass die Anwendung ausgelastet ist. (Ausnahme von HRESULT: 0x8001010A (RPC_E_SERVERCALL_RETRYLATER)).     bei Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.HandleUserException(Exception e)     bei Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.PreExecute()     bei Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostPreExecute(IDTSManagedComponentWrapper100 wrapper)  Fehlerende  Fehler: 2017-05-18 19:13:50.97     Code: 0xC004701A     Quelle: Datenflusstask SSIS.Pipeline     Beschreibung: Fehler in der Phase vor der Ausführung für 'Excel auslesen'. Fehlercode: 0x8001010A.  Fehlerende  DTExec: Die Paketausführung wurde beendet. DTSER_FAILURE (1).  Gestartet: 19:13:43  Beendet: 19:13:51  Verstrichen:  7.14 Sekunden.  Fehler beim Ausführen des Pakets.  Fehler bei Schritt.

    Die Scriptkomponente greift auf den InteroptService zu.

    Scriptcomponente sie folgendermassen aus: (Wiederholungen in der Programmierung habe ich rausgelöscht.

    Vielen Dank im Voraus für Eure Hilfe.

    Norbert

    <Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute> _
    <CLSCompliant(False)> _
    Public Class ScriptMain
        Inherits UserComponent

        <DllImport("kernel32.dll")> _
        Shared Sub OutputDebugString(ByVal lpOutputString As String)
        End Sub

        Public uebergabekonditionen(15) As String

        Public xlApp As Excel.Application
        Public xlWorkBook As Excel.Workbook
        Public xlWorkSheets As Excel.Worksheets
        Dim xlWorkSheet As Excel.Worksheet

        Public range As Excel.Range
        Public rCnt As Integer
        Public cCnt As Integer
        Public Obj As Object

        Public excelSheet As Excel.Worksheet
        Public rng As Excel.Range

        Public zahltraeger As Decimal
        Public Rechnungart As String = ""

     Public Overrides Sub PreExecute()
            MyBase.PreExecute()
            '
          
            Try
                xlApp = CType(Marshal.GetActiveObject("Excel.Application"), Excel.Application)

            Catch ex As Exception
                Try
                    xlApp = New Excel.Application
                Catch ex2 As Exception
                    OutputDebugString(ex2.Message)
                    'MsgBox(ex2.Message)
                    Throw
                End Try
            End Try


            xlApp.DisplayAlerts = False

            xlApp.AlertBeforeOverwriting = False
            '
        End Sub

     Public Overrides Sub PostExecute()
            MyBase.PostExecute()
            '
            ' Add your code here

            'xlApp = New XLS.Application
            ''xlWorkBook.Close()

            xlApp.DisplayAlerts = True
            xlApp = Nothing

            Dim p As System.Diagnostics.Process
            Dim pp As System.Diagnostics.Process()

            pp = Process.GetProcesses()
            For Each p In pp
                If p.ProcessName = "EXCEL" Or p.ProcessName = "EXCEL.EXE" Then
                    p.Kill()
                End If
            Next
            '
        End Sub

      Public Overrides Sub Eingabe0_ProcessInputRow(ByVal Row As Eingabe0Buffer)
            '
            Dim XLSFilenameSource As String = ""
            Dim AlleBerechnungsteileVorhanden As Boolean = False
            Dim g As Guid
            g = Guid.NewGuid


            'Formatkorrektur Datum ohne zeit

            Row.gestrigesDatum = FormatDateTime(Row.gestrigesDatum.ToString, DateFormat.ShortDate)
            Row.heutigesDatum = FormatDateTime(Row.heutigesDatum.ToString, DateFormat.ShortDate)

            Row.neueGUIDZeitbereich = g

             XLSFilenameSource = "C:\japa_daten\calc_file\" & Row.Artikelgruppe10Filename

             xlWorkBook = xlApp.Workbooks.Open(XLSFilenameSource)
             Dim ws As Excel.Worksheet = CType(xlWorkBook.Worksheets("Eingabe"), Excel.Worksheet)

              excelauslesen(xlApp, xlWorkBook, ws, Row.KonditionsAnsatzEK.ToString)


               Select Case Row.PreiseinheitenCodeEinkauf
                    Case Is = 1
                        Row.Kondition01 = Convert.ToDecimal(uebergabe_in_kondition_row(1, uebergabekonditionen(1)))
                 
                End Select

                'Erase uebergabekonditionen
                ws = Nothing
            Else

            End If

        End Sub

    Public Function excelauslesen(ByVal app As Excel.Application, ByVal WoerkB As Excel.Workbook, ByVal Sheet As Excel.Worksheet, ByVal ek As String) As Double
            Dim i As Integer

            Dim SourceSheet As Excel.Worksheet = CType(WoerkB.Worksheets("Eingabe"), Excel.Worksheet)

            For i = 0 To 15
                uebergabekonditionen(i) = ""
            Next i

            'EK uebergeben
            rCnt = 5
            cCnt = 2
            zahltraeger = Convert.ToDecimal(ek)

            Sheet.Cells(rCnt, cCnt) = zahltraeger

            ' Excelsheet berechnen
            Sheet.Calculate()


            'VP Auslesen Stufe 1
            uebergabekonditionen(1) = SourceSheet_auslesen(13, 6, Sheet)

            'Sheet = SourceSheet
            'rCnt = 13
            'cCnt = 6
            'excelSheet = SourceSheet
            'rng = DirectCast(Sheet.Cells(rCnt, cCnt), XLS.Range)
            'uebergabekonditionen(1) = Replace(CType(rng.Value, String), ".", ",")

            SourceSheet = Nothing


            Return 0
        End Function

        Function SourceSheet_auslesen(reihe As Integer, zelle As Integer, sheet As Excel.Worksheet) As String

            rCnt = reihe
            cCnt = zelle
            excelSheet = sheet
            rng = DirectCast(sheet.Cells(rCnt, cCnt), Excel.Range)

            SourceSheet_auslesen = CType(rng.Value, String)

            Return SourceSheet_auslesen
        End Function

        Function uebergabe_in_kondition_row(position As Integer, wert As String) As Decimal

            If IsDBNull(uebergabekonditionen(position)) Or uebergabekonditionen(position) = "" Then
                uebergabe_in_kondition_row = 0
            Else
                uebergabe_in_kondition_row = Convert.ToDecimal(uebergabekonditionen(position))
            End If
            Return uebergabe_in_kondition_row
        End Function


    End Class


    Donnerstag, 18. Mai 2017 17:42

Alle Antworten

  • Hallo Norbert,

    Dieser Fehler tritt aufgrund von Threadkonflikten zwischen externen Multithreadanwendungen und Visual Studio auf. Er kann durch die Implementierung von IOleMessageFilter-Fehlerhandlern in Deiner Visual Studio-Automatisierungsanwendung beseitigt werden. Weitere Informationen zu diesem Thema findest Du in diesem Thread:
    Exception from HRESULT: 0x8001010A (RPC_E_SERVERCALL_RETRYLATER)

    Gruß,

    Ivan Dragov


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 19. Mai 2017 13:49
    Moderator
  • Das kann ebenso durch die unbeaufsichtigte Ausführung passieren.
    Excel ist nachweislich für die Automatisierung ohne Benutzerinteraktion nicht zugelassen. Daher funktionieren die Skripte meist nur, wenn der ausführende Benutzer angemeldet ist.

    Mit unserer BI-Anwendung veranstalte ich durchaus vergleichbares.
    D.h., Batchausführungen finden über die Aufgabenplanung statt.
    Wenn es geht, wird der ausführende Benutzer auf dem Server nicht abgemeldet (also nur RDP-Sitzung trennen).

    Den Aufruf des Excel-Starts habe ich geändert:
    Aufruf des Excels per Shell mit dem Argument einer XLS-Datei.
    Ca. 250 ms pausieren, um Excel den Start vervollständigen zu lassen.
    Jetzt erst GetObject mit dem Namen der Excel-Datei aufrufen.

    Wichtig vor allem ist bei der Excel-Automatisierung Nachrichten (DisplayAlerts) und ggf. Refresh (ScreenUpdating) abzuschalten.
    Und wenn man im Batch fertig ist, den Excel-Prozess per Quit zu beenden.
    Auch hier kann es u.U. zu Prozessleichen der Excel-Anwendung kommen, die man nur mit TerminateProcess beseitigen kann.

    Im Dialog könnte das für den User unangenehm werden, da man ggf. mit dem aktivien Prozess verbunden wird.
    Man muss also wissen, ob das Programm im Dialog oder Batch aufgerufen wurde.

    Montag, 22. Mai 2017 07:40