Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SSIS. Копирование с FTP - ошибка если папка пустая  [new]
RockMan
Member

Откуда:
Сообщений: 184
Добрый день!

Есть SSIS пакет (MSSQL 2012 StEd), в нем Script Task для записи списка файлов в XML.
Выполняется без ошибок, но только в том случае если в папке есть хотя бы один файл. Если папка пустая - ошибка.
Подскажите, что докрутить?


Скрипт:
' Microsoft SQL Server Integration Services Script Task
' Write scripts using Microsoft Visual Basic
' The ScriptMain class is the entry point of the Script Task.

Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Runtime
Imports System.Text     ' need to add this one

<Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute()> _
<System.CLSCompliantAttribute(False)> _
Partial Public Class ScriptMain
    Inherits Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase

    Enum ScriptResults
        Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success
        Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
    End Enum

    Public Sub Main()

        ' STEP 1
        Dim ftpFileNameListXML As New StringBuilder
        ftpFileNameListXML.AppendLine("<filelist>")

        ' STEP 2
        Dim ftpcm As ConnectionManager = Dts.Connections.Add("FTP")

        Dim ftpFileNames() As String
        Dim ftpFolderNames() As String

        ' Block
        ftpcm.Properties("ServerName").SetValue(ftpcm, "192.168.1.1")
        ftpcm.Properties("ServerUserName").SetValue(ftpcm, "user")
        ftpcm.Properties("ServerPassword").SetValue(ftpcm, "MyPass")
        'ftpcm.Properties("SetWorkingDirectory").SetValue(ftpcm, "\out")

        ftpcm.Properties("ServerPort").SetValue(ftpcm, "21")
        ftpcm.Properties("Timeout").SetValue(ftpcm, "0") 'The 0 setting will make it not timeout
        ftpcm.Properties("ChunkSize").SetValue(ftpcm, "1000") '1000 kb
        ftpcm.Properties("Retries").SetValue(ftpcm, "1")

        ' STEP 3
        Dim ftp As FtpClientConnection =
                        New FtpClientConnection(ftpcm.AcquireConnection(Nothing))

        ftp.Connect()
        ftp.SetWorkingDirectory(Dts.Variables("FtpWorkingDirectory").Value.ToString())
        ftp.GetListing(ftpFolderNames, ftpFileNames)

        ' STEP 4
        Dim i As Integer
        For i = 0 To ftpFileNames.GetUpperBound(0)
            'add xml element
            ftpFileNameListXML.Append("<file name='")
            ftpFileNameListXML.Append(ftpFileNames(i))
            ftpFileNameListXML.AppendLine("'/>")
        Next i

        ' STEP 5
        ftpFileNameListXML.AppendLine("</filelist>")
        Dts.Variables("FtpFileListXML").Value = ftpFileNameListXML.ToString()

        Dts.TaskResult = ScriptResults.Success
    End Sub
End Class


Ошибка (отдельное окно вылетает):

К сообщению приложен файл. Размер - 126Kb
23 окт 12, 17:53    [13364580]     Ответить | Цитировать Сообщить модератору
 Re: SSIS. Копирование с FTP - ошибка если папка пустая  [new]
SSIS
Guest
а вне SSIS пакета этот код при пустой FTP папке отрабатывает нормально?
23 окт 12, 18:19    [13364746]     Ответить | Цитировать Сообщить модератору
 Re: SSIS. Копирование с FTP - ошибка если папка пустая  [new]
RockMan
Member

Откуда:
Сообщений: 184
SSIS
а вне SSIS пакета этот код при пустой FTP папке отрабатывает нормально?


Вы поставили меня в затруднительное положение с ответом) Как мне это проверить, учитывая что объекты в этом скрипте это ведь компоненты самого SSIS?
23 окт 12, 18:23    [13364776]     Ответить | Цитировать Сообщить модератору
 Re: SSIS. Копирование с FTP - ошибка если папка пустая  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
А зачем надо было писАть скрипт при наличие FTP Task?!
23 окт 12, 18:31    [13364809]     Ответить | Цитировать Сообщить модератору
 Re: SSIS. Копирование с FTP - ошибка если папка пустая  [new]
SSIS
Guest
RockMan
SSIS
а вне SSIS пакета этот код при пустой FTP папке отрабатывает нормально?


Вы поставили меня в затруднительное положение с ответом) Как мне это проверить, учитывая что объекты в этом скрипте это ведь компоненты самого SSIS?

' STEP 1
        Dim ftpFileNameListXML As New StringBuilder
        ftpFileNameListXML.AppendLine("<filelist>")

        ' STEP 2
        Dim ftpcm As ConnectionManager = Dts.Connections.Add("FTP")

        Dim ftpFileNames() As String
        Dim ftpFolderNames() As String

        ' Block
        ftpcm.Properties("ServerName").SetValue(ftpcm, "192.168.1.1")
        ftpcm.Properties("ServerUserName").SetValue(ftpcm, "user")
        ftpcm.Properties("ServerPassword").SetValue(ftpcm, "MyPass")
        'ftpcm.Properties("SetWorkingDirectory").SetValue(ftpcm, "\out")

        ftpcm.Properties("ServerPort").SetValue(ftpcm, "21")
        ftpcm.Properties("Timeout").SetValue(ftpcm, "0") 'The 0 setting will make it not timeout
        ftpcm.Properties("ChunkSize").SetValue(ftpcm, "1000") '1000 kb
        ftpcm.Properties("Retries").SetValue(ftpcm, "1")

        ' STEP 3
        Dim ftp As FtpClientConnection =
                        New FtpClientConnection(ftpcm.AcquireConnection(Nothing))

        ftp.Connect()
        ftp.SetWorkingDirectory(Dts.Variables("FtpWorkingDirectory").Value.ToString())
        ftp.GetListing(ftpFolderNames, ftpFileNames)

        ' STEP 4
        Dim i As Integer
        For i = 0 To ftpFileNames.GetUpperBound(0)
            'add xml element
            ftpFileNameListXML.Append("<file name='")
            ftpFileNameListXML.Append(ftpFileNames(i))
            ftpFileNameListXML.AppendLine("'/>")
        Next i

        ' STEP 5
        ftpFileNameListXML.AppendLine("</filelist>")


вот этот кусок кода вставить в VB.NET программу и проверить.
23 окт 12, 18:32    [13364812]     Ответить | Цитировать Сообщить модератору
 Re: SSIS. Копирование с FTP - ошибка если папка пустая  [new]
RockMan
Member

Откуда:
Сообщений: 184
pkarklin
А зачем надо было писАть скрипт при наличие FTP Task?!


FTP Task не богат на функциональность. Там можно только явно указывать название файла, в моем случае названия всегда разные, предварительно нужно прочитать перечень файлов и в цикле передать в виде переменной.
24 окт 12, 10:48    [13367041]     Ответить | Цитировать Сообщить модератору
 Re: SSIS. Копирование с FTP - ошибка если папка пустая  [new]
RockMan
Member

Откуда:
Сообщений: 184
[quot SSIS]
RockMan
пропущено...
вот этот кусок кода вставить в VB.NET программу и проверить.


Полагал что достаточно в нужном месте добавить блок
Try catch end 
либо что-то вроде
<что то там files>.count >0 then <Обрабатываем> else <папка пустая> end
... и будет счастье.
24 окт 12, 10:56    [13367079]     Ответить | Цитировать Сообщить модератору
 Re: SSIS. Копирование с FTP - ошибка если папка пустая  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
RockMan
Полагал ... и будет счастье.
вы хоть попробуйте разобраться с тем что у вас там написано. например почитать что нибудь про метод GetListing.
24 окт 12, 11:02    [13367111]     Ответить | Цитировать Сообщить модератору
 Re: SSIS. Копирование с FTP - ошибка если папка пустая  [new]
RockMan
Member

Откуда:
Сообщений: 184
Дедушка,

Да-да, спасибо за совет, действительно нужно было добавить блок:
Try Catch
чтобы настало счастье

' Microsoft SQL Server Integration Services Script Task
' Write scripts using Microsoft Visual Basic
' The ScriptMain class is the entry point of the Script Task.

Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Runtime
Imports System.Text     ' need to add this one

<Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute()> _
<System.CLSCompliantAttribute(False)> _
Partial Public Class ScriptMain
    Inherits Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase

    Enum ScriptResults
        Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success
        Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
    End Enum

    Public Sub Main()
        Try

            ' STEP 1
            Dim ftpFileNameListXML As New StringBuilder
            ftpFileNameListXML.AppendLine("<filelist>")

            ' STEP 2
            Dim ftpcm As ConnectionManager = Dts.Connections.Add("FTP")
            Dim ftpFileNames() As String
            Dim ftpFolderNames() As String

            ' Denis Block
            ftpcm.Properties("ServerName").SetValue(ftpcm, "192.168.1.1")
            ftpcm.Properties("ServerUserName").SetValue(ftpcm, "user")
            ftpcm.Properties("ServerPassword").SetValue(ftpcm, "Pass1234")
            'ftpcm.Properties("SetWorkingDirectory").SetValue(ftpcm, "\out")

            ftpcm.Properties("ServerPort").SetValue(ftpcm, "21")
            ftpcm.Properties("Timeout").SetValue(ftpcm, "0") 'The 0 setting will make it not timeout
            ftpcm.Properties("ChunkSize").SetValue(ftpcm, "1000") '1000 kb
            ftpcm.Properties("Retries").SetValue(ftpcm, "1")

            ' STEP 3
            Dim ftp As FtpClientConnection =
                            New FtpClientConnection(ftpcm.AcquireConnection(Nothing))

            ftp.Connect()
            ftp.SetWorkingDirectory(Dts.Variables("FtpWorkingDirectory").Value.ToString())
            ftp.GetListing(ftpFolderNames, ftpFileNames)

            ' STEP 4
            Dim i As Integer
            For i = 0 To ftpFileNames.GetUpperBound(0)
                'add xml element
                ftpFileNameListXML.Append("<file name='")
                ftpFileNameListXML.Append(ftpFileNames(i))
                ftpFileNameListXML.AppendLine("'/>")
            Next i

            ' STEP 5
            ftpFileNameListXML.AppendLine("</filelist>")
            Dts.Variables("FtpFileListXML").Value = ftpFileNameListXML.ToString()

        Catch ex As Exception
            Dts.TaskResult = ScriptResults.Failure
        End Try
        Dts.TaskResult = ScriptResults.Success
    End Sub
End Class
24 окт 12, 12:36    [13367814]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить