2013-11-27 5 views
0

Good Day All,Импортирование последнего измененного файла в SSIS

Я заранее извиняюсь за то, что может быть довольно простой проблемой для многих из вас.

В основном файл сохраняется каждый час в определенной папке (файл ext .AMA), и я хотел бы создать пакет SSIS, который запускается каждый час и импортирует только последний измененный файл в базу данных SQL Server.

Я понимаю, что для этого нужно использовать компонент сценария, но у меня нет нужных рабочих знаний vb.net (я застрял с VS 2005). Кроме того, я не уверен, что это нужно сделать в контейнере цикла Foreach или если вы можете перейти непосредственно из компонента scrip в OLE DB Destination?

Может кто-нибудь быть добрым, чтобы дать мне образец сценария, который я могу отключить, и объяснить мне, как включить его в пакет SSIS? Я не могу описать сценарий решений, которые я видел из Googling, и многие из них, похоже, используют C# в любом случае.

Переход на последнюю измененную дату/время должен быть в порядке, но есть дата/время в имени файла в следующем формате «YYMMDDHHMM», я не уверен, насколько это было бы полезно.

Заранее благодарен!

+0

Считаете ли вы использование [Задачи файловой системы] (http://technet.microsoft.com/en-us/library/ms140185.aspx)? Вы можете определить свое * исходное соединение * для переменной. – TsSkTo

+0

У меня нет, но разве мне еще не нужно использовать компонент скрипта для определения переменной? Спасибо за ответ. – DPPD

+0

Возможный дубликат [Импорт последнего файла csv на sql-сервер в ssis] (http://stackoverflow.com/questions/8831060/import-most-recent-csv-file-to-sql-server-in-ssis) – billinkc

ответ

0

Вместо того чтобы выдавать полное решение, давайте разбейте этот проект на более мелкие куски. Попытайтесь решить каждую из этих частей, и решение должно появиться - надеюсь. Если вы застряли на любой части, почувствуйте, что возвращаетесь назад с более острым вопросом. Тем не менее, вот что я хотел бы предложить - 1. Возьмите один из ваших .AMA-файлов. Используйте задачу потока данных. Используйте соединение с файловым файлом как источник и OleDB как Target. Жесткий код источника и целевых соединений в диспетчере соединений. Если вам нужно какое-либо преобразование, попробуйте использовать производные столбцы (потому что это проще и выполняет большую часть преобразований). Если вы сможете выполнить эту часть, это устранит ваши сомнения в использовании компонента скрипта.

  1. Далее, работа по удалению жесткой кодирующей части, упомянутой в шаге 1. Узнайте, как динамически изменять строки подключения с помощью переменных.

  2. Поместите другой файл .AMA в то же место. Используйте задачу ForEach для обработки обоих файлов. (Не обязательно вам понадобится)

  3. Import most recent csv file to sql server in ssis

Надеется, что это поможет вам в найти свое решение самостоятельно - в отличие от просить полное решение.

+0

Hi Anoop Verma, это для вашего ответа. Я использовал переменные в контейнере Foreach Loop перед тем, как импортировать все файлы в другой каталог, используя плоский источник файлов, это не проблема.Моя проблема заключается в написании сценария для определения последнего измененного файла в каталоге. Тема, с которой вы связались в третьем шаге, - это первое, что я натолкнулся на свой квест Google, но для этого используется сценарий C#, я не знаю, как применить это в компоненте скрипта в visual studio 2005? Благодарю. – DPPD

+0

Спасибо, что вернулись обратно. Этот код очень хорошо документирован. Я использовал сайт конвертера кода. Вот результат. –

0
Public Sub Main() 
Dim fileMask As String = "*.csv" 
Dim mostRecentFile As String = String.Empty 
Dim rootFolder As String = String.Empty 

' Assign values from the DTS variables collection. 
' This is case sensitive. User:: is not required 
' but you must convert it from the Object type to a strong type 
rootFolder = Dts.Variables["User::RootFolder"].Value.ToString() 

' Repeat the above pattern to assign a value to fileMask if you wish 
' to make it a more flexible approach 

' Determine the most recent file, this could be null 
Dim candidate As System.IO.FileInfo = ScriptMain.GetLatestFile(rootFolder, fileMask) 

If candidate IsNot Nothing Then 
    mostRecentFile = candidate.FullName 
End If 

' Push the results back onto the variable 
Dts.Variables["CurrentFile"].Value = mostRecentFile 

Dts.TaskResult = (int)ScriptResults.Success 
End Sub 




private static System.IO.FileInfo GetLatestFile(string directoryName, string fileExtension) 
{ 
System.IO.DirectoryInfo directoryInfo = new System.IO.DirectoryInfo(directoryName); 

System.IO.FileInfo mostRecent = null; 

// Change the SearchOption to AllDirectories if you need to search subfolders 
System.IO.FileInfo[] legacyArray = directoryInfo.GetFiles(fileExtension,  
    System.IO.SearchOption.TopDirectoryOnly); 
foreach (System.IO.FileInfo current in legacyArray) 
{ 
    if (mostRecent == null) 
    { 
     mostRecent = current; 
    } 

    if (current.LastWriteTimeUtc >= mostRecent.LastWriteTimeUtc) 
    { 
     mostRecent = current; 
    } 
} 

return mostRecent; 

// To make the below code work, you'd need to edit the properties of the project 
// change the TargetFramework to probably 3.5 or 4. Not sure 
// Current error is the OrderByDescending doesn't exist for 2.0 framework 
//return directoryInfo.GetFiles(fileExtension) 
//  .OrderByDescending(q => q.LastWriteTimeUtc) 
//  .FirstOrDefault(); 
} 

This is the site I used for conversion: http://www.developerfusion.com/tools/convert/csharp-to-vb 
Смежные вопросы