2012-02-22 3 views
0

Я создал пакет для импорта файлов с FTP-сервера и должен обрабатывать только новые файлы, то есть исключать файлы, которые уже были загружены (которые хранятся в таблице).Задача скрипта SSIS - Не удалось заполнить DataTable

Сначала я запустил SQL-задачу Execute для заполнения переменной объекта «AlreadyLoadedFiles». Затем я пытаюсь определить, какие файлы мне нужно обрабатывать в задаче скрипта. Сначала загружаю имена файлов на FTP-сервер, а затем удаляю те, которые уже были загружены.

У меня нет проблем с поиском имен файлов, находящихся на FTP, но проблема в том, что когда я заполняю OleDBDataAdapter объектной переменной «AlreadyLoadedFiles», результирующий datatable пуст, и я не уверен, почему.

' 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.Xml 
Imports System.Data.OleDb 
Imports System.Collections.Specialized 
Imports System.Text.RegularExpressions 

<System.AddIn.AddIn("ScriptMain", Version:="1.0", Publisher:="", Description:="")> _ 
<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() 
     ' 

     Dim vs As Variables 
     Dim dt As New DataTable 
     Dim da As New OleDbDataAdapter() 


     'We need to go to or FTP server 
     Dts.VariableDispenser.LockOneForRead("FTPSourceDirectory", vs) 

     Dim cm As ConnectionManager = Dts.Connections("FTPServer") 
     Dim ftp As FtpClientConnection = New FtpClientConnection(cm.AcquireConnection(Nothing)) 
     ftp.Connect() 
     ftp.SetWorkingDirectory(vs("FTPSourceDirectory").Value.ToString()) 
     vs.Unlock() 

     'We now need to get ourselves the files we have already seen 
     Dts.VariableDispenser.LockOneForRead("AlreadyLoadedFiles", vs) 


     da.Fill(dt, vs("AlreadyLoadedFiles").Value) 
     MessageBox.Show(dt.Rows.Count) 
     vs.Unlock() 


     Dim foldernames() As String 
     Dim filenames() As String 

     'Get the list of files that are there on the FTP server 
     ftp.GetListing(foldernames, filenames) 

     Dim dr As DataRow 

     Dim ss As StringCollection = New StringCollection() 

     Dim iFileCount As Integer 

     If filenames Is Nothing Then 
      MessageBox.Show("No Files Found") 
      Exit Sub 
     Else 
      'Need to loop through all the files found 
      For iFileCount = 0 To filenames.GetUpperBound(0) 

       'First we add all of the found files to the Array (Object) but only if they are CSV files 

       Dim re As New Regex("^co_users_report_\d{4}-\d{2}-\d{2}\.csv$") 

       If re.IsMatch(filenames(iFileCount).ToString()) Then 
        ss.Add(filenames(iFileCount).ToString()) 
        Dts.Events.FireInformation(0, "", filenames(iFileCount).ToString(), "", 0, True) 
       End If 
       For Each dr In dt.Rows 
        Dts.Events.FireInformation(0, "", dr(0).ToString(), "", 0, True) 
        If dr(0).ToString() = filenames(iFileCount).ToString() Then 
         MessageBox.Show(dr(0).ToString) 
         Dts.Events.FireInformation(0, "", "Removed " & filenames(iFileCount).ToString() & " from array because it was previously loaded.", "", 0, True) 

         ss.Remove(filenames(iFileCount).ToString()) 
         Exit For 
        End If 
       Next 
      Next 
     End If 

     Dts.VariableDispenser.LockOneForWrite("FilesForFTPDownload", vs) 

     vs(0).Value = ss 


     vs.Unlock() 

     Dts.TaskResult = ScriptResults.Success 
    End Sub 

End Class 

Я использую SQL Server (SSIS) 2008 R2 64-битную

ответ

0

Я хотел бы предложить вам разорвать этот на несколько компонентов. Задайте сценарий, как тот, который у вас есть, вытащите необходимые данные с ftp-сайта и сохраните его как плоский файл. Затем используйте функцию потока данных для чтения плоского файла и обработки соответствующим образом. Хотя способ, которым вы это делаете, действителен, я не считаю, что он настолько эффективен, насколько это возможно, если вы использовали дополнительные компоненты SSIS.

0

Я действительно нашел проблему - это была структура проверки, которая сбросила ADO Rowset ...

Смежные вопросы