SSIS For Loop停止工作

时间:2017-12-13 08:32:36

标签: for-loop ssis wildcard

我的ssis包中有一个for循环容器,它包含一个脚本和一个sql任务。

enter image description here

我有3个变量。

source.string = this is folder location 
file.string = i have used wildcard = *.csv
exist.int = defaulted to 0

我将innitexpression值设置为@ Exists = 1 并且evalexpression值设置为@Exists = 1

在脚本中我将其设置为查看源变量,如果file.string变量存在则将exists变量设置为1

问题是它只是循环它应该只循环,如果没有文件那里。在我将变量更改为通配符* .csv

之前,我无法看到我是如何做错的。

我已经使用另一个包含文件名而不是通配符的变量对其进行了测试,并且它正常工作,问题在于查找文件名的通配符,后跟扩展名。为什么是这样?我不能通过通配符变量吗?

我的脚本任务是

      public void Main()
        {
            // TODO: Add your code here
            string Filepath = Dts.Variables["User::Source"].Value.ToString() 
+ Dts.Variables["User::file"].Value.ToString();
            if (
                File.Exists(Filepath))
            {
                Dts.Variables["User::Exists"].Value = 1;
            }

            /// MessageBox.Show (Filepath);
            /// MessageBox.Show(Dts.Variables["Exists"].Value.ToString());
            Dts.TaskResult = (int)ScriptResults.Success;
        }

        #region ScriptResults declaration
        /// <summary>
        /// This enum provides a convenient shorthand within the scope of this class for setting the
        /// result of the script.
        /// 
        /// This code was generated automatically.
        /// </summary>
        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };
        #endregion

    }
}

1 个答案:

答案 0 :(得分:3)

根据上述评论,我提出了两种不同的解决方案。你现在的解决方案是否定的。 2

  
      
  1. 这个可以根据您路径中的多个文件搜索特定文件。它需要一些调整,但如果你想检查特定文件是否存在通配符,可以使用

  2.   
  3. 如果找到任何通配符文件,则此值为true。

  4.   

C#Code 1

Using System.IO:

string Filepath = Dts.Variables["User::Source"].Value.ToString();
            string WildCard = Dts.Variables["User::file"].Value.ToString(); // In Text form @"*.txt";
            string fullpath = Filepath + WildCard;

            //With for loop
            string txtFile = null;
            // Gets all files with wildcard
            string[] allfiles = Directory.GetFiles(Filepath, WildCard);

            //Loop through all files and set the filename in txtFile. Do whatever you want here
            foreach(string fileName in allfiles)
            {
                //Check if a file contains something, it could be a prefixed name you only want
                if(fileName.Contains("txt"))
                {
                    txtFile = fileName;
                    if(File.Exists(txtFile))
                    {
                        Dts.Variables["User::Exists"].Value = 1;
                    }
                }
            }

C#Code 2

 Using System.IO;
 Using System.Linq;

 string Filepath = Dts.Variables["User::Source"].Value.ToString();
            string WildCard = Dts.Variables["User::file"].Value.ToString(); //In text form "*.txt";
            string fullpath = Filepath + WildCard;

            //With bool
            bool exists = Directory.EnumerateFiles(Filepath, WildCard).Any();

            if(exists == true)
            {
                Dts.Variables["User::Exists"].Value = 1;
            }


            MessageBox.Show (Filepath);
            MessageBox.Show(Dts.Variables["Exists"].Value.ToString());