2016-04-28 10 views
0

SSISを使用しており、スクリプトタスクを使用してfor-eachループで処理されたファイルのファイルサイズを取得しています。私には2つの変数があります。ファイルサイズの取得SSIS C#

  • FileFound:これは、ファイルの名前は、foreachのファイル列挙子

  • FileFoundSizeで拾っている - これは値を持たないInt64の変数です。

私の手順は以下のとおりです。

  • ドラッグアンドでスクリプトタスクをドロップするために、各コンテナ

  • 編集Script-私のコードは

    using System; 
    using System.IO;       
    using System.Data; 
    using Microsoft.SqlServer.Dts.Runtime; 
    using System.Windows.Forms; 
    namespace ST_7068b53f6bf04efd812e51a1aee0c396 
    { 
    
    Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute] 
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase 
    { 
    
        public void Main() 
        { 
        FileInfo fileInfo; 
        fileInfo = new FileInfo(Dts.Variables["User::FileFound"].Value.ToString()); 
        Dts.Variables["User::FileFoundSize"].Value = fileInfo.Length; 
    
    
        Dts.TaskResult = (int)ScriptResults.Success; 
    } 
    
    
    enum ScriptResults 
    { 
        Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success, 
        Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure 
    }; 
    
    
    } 
    } 
    

ですこのタスクを実行すると、例外が呼び出しの対象によってスローされました。 スクリプトで何が問題になっていますか?

+1

あなたのコードは単純ですが、私の最初に推測するのは、FileFound変数が正しく設定されていないか、FileInfoコマンドがファイルにアクセスできないことです。あなたのMain()メソッドにブレークポイントを置き、それを歩いてください。 –

+0

あなたは正しいかもしれません。 FileFound変数は、ファイル名と拡張子を含むファイルの絶対パスである必要がありますか?現在、私のFileFound変数は文字列です。 – MaxPD

+0

ありがとう@KyleHale。あなたの提案は私を助けました。 – MaxPD

答えて

1

はい、ファイル拡張子を含む完全なパスが必要です。 (技術的には正しくなるように、となります。ssisパッケージがファイルと同じディレクトリに置かれている場合は、パスを外しておいてください。

あなたのコードは少しより堅牢にするために、私は次のようにしてください:

public void Main() 
{ 
    string fullPath = Path.Combine(Dts.Variables["User::FilePath"].Value.ToString(), Dts.Variables["User::FileFound"].Value.ToString(), Dts.Variables["User::FileExtension"].Value.ToString()); 
    var fileInfo = new FileInfo(fullPath); 

    if (fileInfo.Exists()) 
    { 
     Dts.Variables["FileFoundSize"] = fileInfo.Length; 
     Dts.TaskResult = (int)ScriptResults.Success; 
    } 
    else 
    { 
     // file could not be found  
     Dts.TaskResult = (int)ScriptResults.Failure; 
    } 
+0

ありがとうございます。ファイルが存在することを知っているので、余分なループは必要ありません。 – MaxPD

1

スクリプト内からDTS変数のアドレス指定には楽しいではありません。 Variablesコレクションのメンバー(「FileFoundSize」など)が存在し、利用可能であることは、設計時検証にはありません。 [スクリプトの編集]ウィンドウの腹立たしいモーダル行動とともに

は(少なくともVS2008で、悲しいことに、私はVS2012での作業時に何が起こるかを忘れてしまった)あなたが持って確認するようにパッケージ変数の表示に裏返してからあなたを防ぎますスペルミス。

私はこれでに実行してきました

共通の落とし穴:

  1. 変数名があなたのコードにスペルミス(ほんの少し)です。
  2. 変数が

(読み取り専用変数、または読み取り/変数を書く)メイン スクリプトタスク画面にスクリプトを「利用可能」にされていないこれらの問題はいずれも、コーディング/ビルドでは明らかであろう時間。 (BTW、起動しないブレークポイントを設定してこの問題をデバッグしようとした場合は、プロジェクトのプロパティ、デバッグをチェックし、Use64BitRunTimeがFALSEであることを確認してください)。

+0

確認するだけです。2012年以降はモーダルではありません。 –

+0

ありがとう。私がここから出てVS2012をもう一度使っているとき、それは私に希望を与えます。私はVS2008にしっかりとこだわっていたので、私がVS2012 +を知っていたことを忘れてしまった。 – SebTHU

+0

詳しい答えは@SebTHUありがとう。 – MaxPD

関連する問題