【问题标题】:VB.net 4.5 .exe fails to execute when run via SSISVB.net 4.5 .exe 通过 SSIS 运行时无法执行
【发布时间】:2016-06-03 13:18:25
【问题描述】:

我编写了一个 vb.net 控制台程序,它链接到数据库,主要功能是通过将不同配置的单独 PDF 页面连接在一起来生成报告包。

为此,我不得不使用一些变通方法,但已经在本地和手动测试了构建和部署的应用程序,效果很好。下面列出了这些:

我需要通过 SSIS 调用该应用程序,以便将其安排为更广泛的代理作业的一部分。

我没有远程访问运行作业的 SSIS 服务器,但可以通过 SSMS 连接到它/触发作业等,并且可以看到应用程序 .exe 和关联文件所在的文件夹的共享.

因为我无权在服务器上安装应用程序,所以我采取了在本地安装从 Visual Studio 输出的单击一次并从本地应用程序文件夹中提取 .exe 和相关文件的方法。然后将这些文件复制到文件共享中。我再次测试了 .exe 文件可以在使用我的凭据登录时手动运行,这没有问题并产生预期的输出文件和日志文件。

当 SSIS 作业运行时,它使用服务帐户 - 我无法确定该帐户是否可以访问共享驱动器,但由于它能够为其他作业移动驱动器上的文件,我认为这是真的。我还创建了一个更基本的控制台应用程序,它只从 XML 文件中读取值,但不写入任何输出并且运行成功。

我查看了 SSMS,可以看到共享文件位于代理服务器的 G: 上。我假设 .exe 也将在代理服务器上执行,因此尝试将文件路径映射到 G: 和文件共享。我假设证券会根据您处理文件夹的方式而有所不同。

创建 PDF 所需的插件不接受 UNC 文件路径,因此我需要给它一个相对或映射的文件夹路径。我无法映射驱动器,因为我不知道代理帐户密码 - 但如果绝对必要,可以解决这个问题。目前我从 XML 配置文件加载相对路径。

当应用程序在我自己的帐户上从共享文件夹位置手动运行时,它会按预期创建日志文件。

当应用程序通过 SSIS 运行时,作业失败并出现错误代码:-2146232576,并且没有创建日志文件。

由于日志文件是应用程序所做的第一件事,我认为它失败了,因为它无法写入输出。

有没有人知道确认的方法: A.) .exe 运行的位置(包从 G: 文件路径调用 .exe) b.) 代理帐户对其运行的目录具有哪些权限 C.) 错误代码的含义 D.) 如果我在这里遗漏了一些完全剩下的字段?

Imports PdfSharp
Imports PdfSharp.Drawing
Imports PdfSharp.Pdf
Imports PdfSharp.Pdf.IO
Imports System.Data.SqlClient

Module Module1

    Sub Main(ByVal args() As String)

        Dim eventlog As System.IO.StreamWriter
        eventlog = My.Computer.FileSystem.OpenTextFileWriter("\\csimccs01\FTP\Out\PDFCREATOR\log.txt", True)

        eventlog.WriteLine(Now() & " Process Started at")

        Dim countargs = 0
        Dim FY As String = ""
        Dim FP As String = ""
        Dim con1 As New SqlConnection
        Dim con2 As New SqlConnection
        Dim con3 As New SqlConnection
        Dim cmd1 As New SqlCommand
        Dim cmd2 As New SqlCommand
        Dim cmd3 As New SqlCommand

        Dim sqldataset2 As SqlDataReader
        Dim packid As Integer
        Dim LV7Symbol As String
        Dim PackDescription As String
        Dim SPPATH As String
        Dim RptVer As Integer
        Dim outputdoc As PdfDocument
        Dim PDFCount As Integer
        Dim progress As Integer = 0
        Dim importdoc As PdfDocument
        Dim count As Integer


        Dim constr As String
        Dim inputfilefolder As String
        Dim outputfilefolder As String
        Dim fullinputfilepath As String
        Dim outputfilename As String

        eventlog.WriteLine(Now() & " Looking for config file")
        Try
            If My.Computer.FileSystem.FileExists("\\csimccs01\FTP\Out\PDFCREATOR\config.xml") Then
                Dim xmlconfig = XDocument.Load("\\csimccs01\FTP\Out\PDFCREATOR\config.xml")
                constr = xmlconfig.<config>.<DBCONNECTIONSTRING>.Value
                inputfilefolder = xmlconfig.<config>.<FilePath>.<Input>.Value
                outputfilefolder = xmlconfig.<config>.<FilePath>.<Output>.Value
                eventlog.WriteLine(Now() & " Config file loaded and variables set")
                eventlog.WriteLine(Now() & " inputfolder: " & inputfilefolder)
                eventlog.WriteLine(Now() & " outputfolder: " & outputfilefolder)
            Else
                eventlog.WriteLine(Now() & " Config File Not Found")
                Exit Sub
            End If


        Catch ex As Exception
            Console.WriteLine(1)
            eventlog.WriteLine(Now() & " Config File Not Found, routine exited by exception")
            eventlog.Close()
            Exit Sub
        End Try

        countargs = 0

        eventlog.WriteLine(Now() & " Setting Fiscal Year & Period Variables")

        If FY = "" Then

            FY = "FY2016"
        End If

        If FP = "" Then

            FP = "FP01"
        End If
        eventlog.WriteLine(Now() & " Fiscal Year & Period Variables set")

        Try
            eventlog.WriteLine(Now() & " Attempting to open database con1")
            con1.ConnectionString = constr
            con1.Open()
            eventlog.WriteLine(Now() & " Con1 open")
            cmd1.Connection = con1
            cmd1.CommandText = "SELECT [PackID],[LV7Symbol],[LV7Description],[SharePoint_Output_Path],[Report_Version] FROM [D_EXP_CPM].[dbo].[FACT_REPORT_CONTROL_TABLE]"
            Dim sqldataset1 As SqlDataReader = cmd1.ExecuteReader()
            eventlog.WriteLine(Now() & " Report List loaded into Dataset1")


            eventlog.WriteLine(Now() & " Starting to loop through Dataset1")

            While sqldataset1.Read()


                packid = sqldataset1.Item("PackID")
                LV7Symbol = sqldataset1.Item("LV7Symbol").ToString
                PackDescription = sqldataset1.Item("LV7Description").ToString
                SPPATH = sqldataset1.Item("SharePoint_Output_Path").ToString
                RptVer = sqldataset1.Item("Report_Version") + 1
                eventlog.WriteLine(Now() & " Pack level variables set for pack id " & packid)
                eventlog.WriteLine(Now() & " Opening connection3 to update version number")
                con3.ConnectionString = constr
                con3.Open()
                cmd3.Connection = con3
                cmd3.CommandText = "UPDATE [D_EXP_CPM].[dbo].[FACT_REPORT_CONTROL_TABLE] SET [Report_Version]=" & RptVer & " WHERE [PackID] =" & packid
                cmd3.ExecuteNonQuery()
                con3.Close()
                eventlog.WriteLine(Now() & " Version Updated")
                eventlog.WriteLine(Now() & " Connection 3 closed")


                Try
                    eventlog.WriteLine(Now() & " Opening connection2")

                    con2.ConnectionString = constr
                    con2.Open()
                    cmd2.Connection = con2
                    cmd2.CommandText = "SELECT [EntryID],[PackID], [TemplateID], [SortOrder] FROM [D_EXP_CPM].[dbo].[FACT_REPORTPACK_PAGE_CONFIG] WHERE [PACKID] = " & packid & "  Order By [PackID], [SortOrder]"
                    sqldataset2 = cmd2.ExecuteReader()
                    eventlog.WriteLine(Now() & " Results or pack page configuration loaded into sqldatset2")

                    eventlog.WriteLine(Now() & " Opening temporary PDF")
                    outputdoc = New PdfDocument
                    eventlog.WriteLine(Now() & " Starting to loop through Pack pages for pack " & packid)
                    While sqldataset2.Read()

                        If Not sqldataset2.HasRows Then
                            eventlog.WriteLine(Now() & " No template configuration data found for packid " & packid)
                            GoTo nextrpt
                        End If

                        fullinputfilepath = inputfilefolder & "\CC " & LV7Symbol & "_TID" & (sqldataset2.Item("TemplateID") - 1) & "_" & FP & "_" & FY & ".pdf"
                        eventlog.WriteLine(Now() & " input file path set to: " & fullinputfilepath)

                        Try
                            eventlog.WriteLine(Now() & " attempting to read input file")
                            importdoc = PdfReader.Open(fullinputfilepath, PdfSharp.Pdf.IO.PdfDocumentOpenMode.Import)
                            eventlog.WriteLine(Now() & " inputfile read successfully")
                        Catch ex As Exception
                            eventlog.WriteLine(Now() & " Unable to read intput file, move to next report")
                            GoTo nextrpt 
                        End Try

                        count = importdoc.PageCount

                        progress = 0

                        Do Until progress = count
                            Dim pdfpage As PdfPage = importdoc.Pages(progress)
                            outputdoc.AddPage(pdfpage)
                            progress = progress + 1
                        Loop
                        eventlog.WriteLine(Now() & " incrementing pdf page count")
                        PDFCount = PDFCount + 1
                    End While
                    eventlog.WriteLine(Now() & " all pages of input file consolidated")

                    PackDescription.Replace("&", "and")
                    eventlog.WriteLine(Now() & " '&' charcter removed from file names")

                    outputfilename = outputfilefolder & "\" & LV7Symbol & "_" & FY & "_" & FP & "_" & PackDescription & "_VER" & RptVer & ".pdf"

                    eventlog.WriteLine(Now() & " attempting to save output PDF as: " & outputfilename)

                    If outputdoc.PageCount > 0 Then
                        outputdoc.Save(outputfilename)
                    End If

                    eventlog.WriteLine(Now() & " output file saved")
nextrpt:

                Catch ex As Exception
                    eventlog.WriteLine(Now() & " Exception encountered in page level try catch")
                Finally
                    con2.Close()
                    eventlog.WriteLine(Now() & " Connection 2 closed")

                End Try


            End While



        Catch ex As Exception
            Console.WriteLine(1)
            eventlog.WriteLine(Now() & " Exception encountered in report level try catch")
            eventlog.Close()
            Exit Sub
        Finally
            con1.Close()
            eventlog.WriteLine(Now() & " Connection 1 closed")
        End Try

        Console.WriteLine(0)
        eventlog.WriteLine(Now() & " Process completed successfully")
        eventlog.Close()

        Exit Sub



    End Sub


End Module

【问题讨论】:

  • 您真的需要包含所有这些注释行吗?阅读:stackoverflow.com/help/mcve
  • 评论已删除。 - 我认为这个问题也可能与服务器上安装的 .net 版本有关。

标签: .net sql-server vb.net windows ssis


【解决方案1】:

原来不是代码,而是安装在服务器上的 .net 版本。无法升级 .net,因此将 Visual Studio 中的编译设置更改为 .net 4,并将包文件修改为目标 net40 而不是 net45,现在可以使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 2023-03-15
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多