如何在控制流任务

时间:2017-09-27 14:44:59

标签: ssis control-flow edi

所以我现在正在制作一个SSIS包,需要我还有一些工作要做。该软件包当前只有一个For Each循环容器,它将在User :: WatchFolder中找到的文件名的值存储到变量中,然后将该文件移动到另一个文件夹以供进程选取。我的任务是增加这一点,以便.837文件的进程保持不变,该文件不包含某组字符,但重定向通过单词' RELAY'在他们中。从那里我还需要打开这个EDI文件并替换字符串' 5010'使用' 5010R',保存并移至单独的文件夹。

我已使用条件拆分基于某些条件在数据流任务中移动数据,但这不是来自表或数据库的数据,因此我不确定是否可以在控制流任务中完成此操作。此外,我假设可以通过脚本任务替换字符串,但我不确定(再次)这是否会存在于控制流或某种数据流任务中。

到目前为止这是包的样子。
SSIS Package so far

编辑:到目前为止,我已经创建了一个脚本任务,使用C#查找并使用ReadFile(FilePath)将值替换为名为FileContent的变量,然后执行FileContent.Replace(" someText",&# 34; someOtherText&#34) 然后使用StreamReader和StreamWriter将内容写回文件。这部分似乎工作正常,但我现在不确定如何移动文件取决于它是否包含FileName中的某个值。

public void Main()
    {
        String ErrInfo = "";
        String FilePath = Dts.Variables["User::FileName"].Value.ToString();
        try
        {
            String FileContent; //Variable to store File Contents
            FileContent = ReadFile(FilePath, ErrInfo);
            if (ErrInfo.Length > 0)
            {
                Dts.Log("Error while reading File " + FilePath, 0, null);
                Dts.Log(ErrInfo, 0, null);
                Dts.TaskResult = (int)ScriptResults.Failure;
                return;
            }


            //FileContent Before Replace;
            MessageBox.Show(FileContent);

            //Find and Replace --> Modify WHERE clause
            FileContent = FileContent.Replace(
               "Relay5010 ",
               "Relay5010R" 
            );

            //FileContent After Replace;
            MessageBox.Show(FileContent);
            Dts.Variables["User::FileContent"].Value = FileContent;

            //Write the contents back to File
            WriteToFile(FilePath, FileContent, ErrInfo);
            if (ErrInfo.Length > 0)
            {
                Dts.Log("Error while writing File " + FilePath, 0, null);
                Dts.Log(ErrInfo, 0, null);
                Dts.TaskResult = (int)ScriptResults.Failure;
                return;
            }
        }
        catch (Exception e)
        {
            Dts.Log(e.Message, 0, null);
            Dts.TaskResult = (int)ScriptResults.Failure;
        }
    }

    public String ReadFile(String FilePath, String ErrInfo)
    {
        String strContents;
        StreamReader sReader;
        try
        {
            sReader = File.OpenText(FilePath);
            strContents = sReader.ReadToEnd();
            sReader.Close();
            return strContents;
        }
        catch (Exception e)
        {
            MessageBox.Show(ErrInfo);
            ErrInfo = e.Message;
            return "";
        }
    }

    public void WriteToFile(String FilePath, String strContents, String ErrInfo)
    {
        StreamWriter sWriter;
        try
        {
            sWriter = new StreamWriter(FilePath);
            sWriter.Write(strContents);
            sWriter.Close();
        }
        catch (Exception e)
        {
            MessageBox.Show(ErrInfo);
            ErrInfo = e.Message;
        }
    }

    #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

  }
}    

事实是,我喜欢单独保留现有文件,让他们沿着正常路径奔跑,只是转移包含&#34; R&#34;值和那些可以应用脚本任务。除了另一个脚本任务之外,还有其他方法吗?我只是想看看SSIS是否为我提供了另一种工具,以便能够以最直接的方式完成这项工作

这是我发布的第一个问题,所以如果我在这里错过了其他的东西,如果有人指出我就不会被冒犯!

0 个答案:

没有答案