Ошибка задачи скрипта - невозможно поместить список файлов GetListings в переменную объекта - PullRequest
0 голосов
/ 19 ноября 2011

Использование задачи скрипта ниже, чтобы заполнить список файлов в User :: ftp_file_list.Но контейнер For Each Loop на следующем шаге возвращает ошибку «Контейнер цикла Foreach: объект в переменной« User :: ftp_file_list »не содержит перечислителя».

OK, выясняется, что проблемаявляется то, что соединение не устанавливается.Чего я не понимаю, так это того, что я без проблем проверил соединение самостоятельно.Итак, я немного озадачен, почему он не подключается в скриптовой задаче.

У кого-нибудь есть мысли?Заранее спасибо!

Public Sub Main()
    Dim result As Integer
    Dim manager As ConnectionManager
    Dim ftpClient As FtpClientConnection
    Dim foldersList As String()
    Dim filesList As String()
    Dim var As Variables

    manager = Dts.Connections("FTP_Connection")

    ftpClient = New FtpClientConnection(manager.AcquireConnection(Nothing))

    Try
        If ftpClient.Connect() Then

            Call ftpClient.SetWorkingDirectory(Dts.Variables("ftp_path").ToString)
            Call ftpClient.GetListing(foldersList, filesList)


            ' Store files list in package variable.'
            Call Dts.VariableDispenser.LockOneForWrite("ftp_file_list", var)

            Try
                var("ftp_file_list").Value = filesList
            Finally
                Call var.Unlock()
            End Try

        End If

    Catch ex As Exception

        result = Dts.TaskResult = ScriptResults.Failure

        Call Dts.Events.FireError( _
            0, _
            String.Empty, _
            ex.Message, _
            String.Empty, _
            0)

    Finally

        Call ftpClient.Close()

    End Try

    Dts.TaskResult = ScriptResults.Success

End Sub ' Main

Ответы [ 2 ]

2 голосов
/ 19 ноября 2011

Я думаю, что вы не можете напрямую присвоить значение fileList переменной объекта.Вам нужно перебрать значения и присвоить их переменной коллекции, прежде чем присваивать их переменной объекта пакета служб SSIS.

Ответ в следующей ссылке содержит подробное объяснение того, как перебирать файлы FTP и затем сохранять ихв объектной переменной.

Как избежать сбоя задачи FTP-сервера SSIS при отсутствии файлов для загрузки?

Код, показанный ниже, взят по вышеуказанной ссылке.Код ищет определенный шаблон файла, а не загружает все файлы.Это единственное отклонение от того, что вы пытаетесь сделать.

VB код, который можно использовать в SSIS 2005 and above.

Включите оператор Imports Imports System.Text.RegularExpressions

Public Sub Main()
    Dim varCollection As Variables = Nothing
    Dim ftpManager As ConnectionManager = Nothing
    Dim ftpConnection As FtpClientConnection = Nothing
    Dim fileNames() As String = Nothing
    Dim folderNames() As String = Nothing
    Dim listOfFiles As Collections.ArrayList
    Dim remotePath As String = String.Empty
    Dim filePattern As String = String.Empty
    Dim regexp As Regex
    Dim counter As Integer

    Dts.VariableDispenser.LockForRead("User::RemotePath")
    Dts.VariableDispenser.LockForRead("User::FilePattern")
    Dts.VariableDispenser.LockForWrite("User::ListOfFiles")
    Dts.VariableDispenser.GetVariables(varCollection)

    Try

        remotePath = varCollection("User::RemotePath").Value.ToString()
        filePattern = varCollection("User::FilePattern").Value.ToString()

        ftpManager = Dts.Connections("FTP")
        ftpConnection = New FtpClientConnection(ftpManager.AcquireConnection(Nothing))

        ftpConnection.Connect()
        ftpConnection.SetWorkingDirectory(remotePath)
        ftpConnection.GetListing(folderNames, fileNames)            

        listOfFiles = New Collections.ArrayList()
        If fileNames IsNot Nothing Then
            regexp = New Regex("^" & filePattern & "$")
            For counter = 0 To fileNames.GetUpperBound(0)
                If regexp.IsMatch(fileNames(counter)) Then
                    listOfFiles.Add(remotePath & fileNames(counter))
                End If
            Next counter
        End If

        varCollection("User::ListOfFiles").Value = listOfFiles

        Dts.TaskResult = ScriptResults.Success

    Catch ex As Exception
        Dts.Events.FireError(-1, String.Empty, ex.ToString(), String.Empty, 0)
        Dts.TaskResult = ScriptResults.Failure
    Finally
        varCollection.Unlock()
        ftpConnection.Close()
        ftpConnection = Nothing
        ftpManager = Nothing
    End Try

    Dts.TaskResult = ScriptResults.Success
End Sub

Надеюсь, что это поможет.

0 голосов
/ 08 декабря 2011

Оказывается, это была проблема, созданная в 64-битном режиме.После того, как я изменил Run64BitRuntime = False, все заработало правильно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...