SSIS / C#:Script Task,C#脚本查看目录并将1个文件的名称存储在变量中

时间:2011-06-06 14:54:34

标签: ssis

基本上我已经为SSIS中的脚本任务编写了一个C#脚本,该脚本任务在User :: Directory中查找1 csv,如果&只有当有一个文件时,它才会将其存储在实例变量中,然后映射到SSIS的包变量。

当我exicute时,它会给我一个红色填充的Script任务框。我认为这与我如何查看目录有关,但我不确定。

请帮忙!

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.IO;

namespace ST_e8b4bbbddb4b4806b79f30644240db19.csproj
{
    [System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {
       private String fileName = "";
       private String RootDirictory;
       private String FilePath;

       enum ScriptResults
       {
           Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
           Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
       };

       public ScriptMain()
       {
           RootDirictory = Dts.Variables["RootDir"].Value.ToString();
           FilePath = RootDirictory + "\\" + "SourceData" + "\\";
       }

       public void setFileName()
       {
           DirectoryInfo YDGetDir = new DirectoryInfo(FilePath);
           FileInfo[] numberOfFiles = YDGetDir.GetFiles(".csv");

           if (numberOfFiles.Length < 2)
           {
               fileName = numberOfFiles[0].ToString(); 
           }

          int fileNameLen = fileName.Length;

          String temp = fileName.Substring(0, fileNameLen - 5);

          fileName = temp; 
       }


       public void mapStateToPackage()
       {
           if((fileName!=null)||(fileName!=""))
           {
               Dts.Variables["ExDFileName"].Value = fileName; 
           }
       }

        public void Main()
        {
            setFileName();
            mapStateToPackage(); 
            Dts.TaskResult = (int)ScriptResults.Success;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

这可以简单地使用Foreach loop container完成,如this Stack Overflow question中所述,这是您提出的问题。 : - )

无论如何,要回答有关您提供的Script Task code的问题。下面提到的原因可能是问题的原因:

  1. 您正在寻找.csv。这不会返回任何结果,因为您正在查找没有名称但扩展名为.csv的文件。标准应为 * .csv

  2. 如果您只查找一个文件,则条件if (numberOfFiles.Length < 2)应更改为if (numberOfFiles.Length == 1)

  3. 提取文件名的 if 部分之后的代码部分应该在上面提到的 if 条件中,而不是在其外面。必须这样做是为了防止在空字符串上应用子字符串功能。

  4. 修改后的代码可以在脚本任务代码部分下找到。

  5. 抱歉,我冒昧地简化了一些代码。我不建议这是执行此功能的最佳方式,但问题是merely an answer

    希望有所帮助。

    脚本任务代码:

    C#代码,只能在 SSIS 2008 and above 中使用。

    /*
       Microsoft SQL Server Integration Services Script Task
       Write scripts using Microsoft Visual C# 2008.
       The ScriptMain is the entry point class of the script.
    */
    using System;
    using System.Data;
    using Microsoft.SqlServer.Dts.Runtime;
    using System.Windows.Forms;
    using System.IO;
    
    namespace ST_3effcc4e812041c7a0fea69251bedc25.csproj
    {
        [System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
        public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
        {
            Variables varCollection = null;
            String fileName = string.Empty;
            String fileNameNoExtension = string.Empty;
            String rootDirectory = string.Empty;
            String filePath = string.Empty;
    
            #region VSTA generated code
            enum ScriptResults
            {
                Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
                Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
            };
            #endregion
    
            public void Main()
            {
                Dts.VariableDispenser.LockForRead("User::RootDir");
                Dts.VariableDispenser.LockForWrite("User::ExDFileName");
                Dts.VariableDispenser.GetVariables(ref varCollection);
    
                rootDirectory = varCollection["User::RootDir"].Value.ToString();
                filePath = rootDirectory + @"\SourceData\";
    
                DirectoryInfo YDGetDir = new DirectoryInfo(filePath);
                FileInfo[] numberOfFiles = YDGetDir.GetFiles("*.csv");
    
                if (numberOfFiles.Length == 1)
                {
                    fileName = numberOfFiles[0].ToString();
                    fileNameNoExtension = fileName.Substring(0, fileName.LastIndexOf("."));
                }
                if (!String.IsNullOrEmpty(fileNameNoExtension))
                {
                    varCollection["User::ExDFileName"].Value = fileNameNoExtension;
                }
    
                Dts.TaskResult = (int)ScriptResults.Success;
            }
        }
    }