次の方法で共有


スクリプト タスクによる ForEach ループの一覧の収集

更新 : 2006 年 4 月 14 日

Foreach from Variable 列挙子は、変数で渡された一覧の項目を列挙し、各項目に対して同じタスクを実行します。スクリプト タスクでカスタム コードを使用して、このための一覧を設定することができます。この列挙子の詳細については、「Foreach ループ コンテナ」を参照してください。

ms345158.note(ja-jp,SQL.90).gifメモ :
複数のパッケージでより簡単に再利用できるタスクを作成する場合は、このスクリプト タスク サンプルのコードを基にした、カスタム タスクの作成を検討してください。詳細については、「カスタム タスクの開発」を参照してください。

説明

次の例は、System.IO 名前空間のメソッドを使用して、ユーザーが変数で指定した日数より新しいまたは古い Excel ブックの一覧をコンピュータで収集します。拡張子 .xls を持つファイルを探して C ドライブのディレクトリを再帰的に検索し、各ファイルの最終更新日を調べて、一覧に属するかどうかを判定します。該当するファイルを ArrayList に追加した後、その ArrayList を変数に保存して、後に Foreach ループ コンテナで使用できるようにします。この Foreach ループ コンテナは、Foreach from Variable 列挙子を使用するように構成されています。

ms345158.note(ja-jp,SQL.90).gifメモ :
Foreach from Variable 列挙子で使用する変数は、Object 型である必要があります。変数に配置するオブジェクトは、System.Collections.IEnumerableSystem.Runtime.InteropServices.ComTypes.IEnumVARIANTSystem.ComponentModel IListSourceMicrosoft.SqlServer.Dts.Runtime.Wrapper.ForEachEnumeratorHost のいずれかのインターフェイスを実装する必要があります。Array または ArrayList が一般に使用されます。ArrayList は、System.Collections 名前空間に対する参照と Imports ステートメントを必要とします。

このタスクは、FileAge パッケージ変数に対して正および負のさまざまな値を使用することによってテストできます。たとえば、この 5 日間に作成されたファイルを検索するには 5 を入力し、3 日前よりも前に作成されたファイルを検索するには -3 を入力します。このタスクは、検索するフォルダの数が多いドライブの場合、実行に 1 ~ 2 分かかることがあります。

このスクリプト タスクの例を構成するには

  1. FileAge という integer 型のパッケージ変数を作成し、正または負の整数値を入力します。値が正の場合は、指定した日数より新しいファイルが検索され、値が負の場合は、指定した日数より古いファイルが検索されます。

  2. スクリプト タスクによって収集されたファイルの一覧を受け取るために、FileList という Object 型のパッケージ変数を作成します。この変数を後に Foreach from Variable 列挙子で使用します。

  3. FileAge 変数をスクリプト タスクの ReadOnlyVariables プロパティに追加し、FileList 変数を ReadWriteVariables プロパティに追加します。

  4. コードに System.Collections および System.IO 名前空間をインポートします。

コード

Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Runtime
Imports System.Collections
Imports System.IO

Public Class ScriptMain

  Private Const FILE_AGE As Integer = -50

  Private Const FILE_ROOT As String = "C:\"
  Private Const FILE_FILTER As String = "*.xls"

  Private isCheckForNewer As Boolean = True
  Dim fileAgeLimit As Integer
  Private listForEnumerator As ArrayList

  Public Sub Main()

    fileAgeLimit = DirectCast(Dts.Variables("FileAge").Value, Integer)

    ' If value provided is positive, we want files NEWER THAN n days.
    '  If negative, we want files OLDER THAN n days.
    If fileAgeLimit < 0 Then
      isCheckForNewer = False
    End If
    ' Extract number of days as positive integer.
    fileAgeLimit = Math.Abs(fileAgeLimit)

    listForEnumerator = New ArrayList

    GetFilesInFolder(FILE_ROOT)

    ' Return the list of files to the variable
    '  for later use by the Foreach from Variable enumerator.
    System.Windows.Forms.MessageBox.Show("Matching files: " & listForEnumerator.Count.ToString, "Results", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Information)
    Dts.Variables("FileList").Value = listForEnumerator

    Dts.TaskResult = Dts.Results.Success

  End Sub

  Private Sub GetFilesInFolder(ByVal folderPath As String)

    Dim localFiles() As String
    Dim localFile As String
    Dim fileChangeDate As Date
    Dim fileAge As TimeSpan
    Dim fileAgeInDays As Integer
    Dim childFolder As String

    Try
      localFiles = Directory.GetFiles(folderPath, FILE_FILTER)
      For Each localFile In localFiles
        fileChangeDate = File.GetLastWriteTime(localFile)
        fileAge = DateTime.Now.Subtract(fileChangeDate)
        fileAgeInDays = fileAge.Days
        CheckAgeOfFile(localFile, fileAgeInDays)
      Next

      If Directory.GetDirectories(folderPath).Length > 0 Then
        For Each childFolder In Directory.GetDirectories(folderPath)
          GetFilesInFolder(childFolder)
        Next
      End If

    Catch
      ' Ignore exceptions on special folders such as System Volume Information.
    End Try

  End Sub

  Private Sub CheckAgeOfFile(ByVal localFile As String, ByVal fileAgeInDays As Integer)

    If isCheckForNewer Then
      If fileAgeInDays <= fileAgeLimit Then
        listForEnumerator.Add(localFile)
      End If
    Else
      If fileAgeInDays > fileAgeLimit Then
        listForEnumerator.Add(localFile)
      End If
    End If

  End Sub

End Class

参照

その他の技術情報

Foreach ループ コンテナ
Foreach ループ コンテナの構成方法
Foreach ループ コンテナの追加と構成

ヘルプおよび情報

SQL Server 2005 の参考資料の入手

変更履歴

リリース 履歴

2006 年 4 月 14 日

新しい内容 :
  • Foreach from Variable 列挙子で使用する変数の要件を説明しました。