【问题标题】:SSIS Script Task does not work on second iteration of ForEach Loop ContainerSSIS 脚本任务不适用于 ForEach 循环容器的第二次迭代
【发布时间】:2017-09-07 10:37:46
【问题描述】:


这是我在 Stack Overflow 上的第一篇文章,而且肯定不会是最后一篇。我度过了非常艰难的一周,试图解决我在 SSDT 中针对 VS2015 的 SSIS 脚本任务的问题。
问题如下:
我在控制流中有一个 ForEach 循环容器。我映射了一个变量USER::FileName。我确实使用此变量来处理 Script Task 中的 excel 文件(用点替换逗号),然后保存处理后的文件并将其转换为数据流任务中的平面文件。到现在为止还挺好。但是在 ForEach 循环容器的第二个循环中,原始的 excel 文件没有被正确处理。名称设置正确,但逗号未替换。我不知道该尝试什么了。也许有人有什么建议?

编辑 2:Script Task Code 的外观如下:

using Excel = Microsoft.Office.Interop.Excel;
[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{

    public void Main()
    {
        Excel._Application oApp = new Excel.Application();
        Excel.Workbook oWorkbook = oApp.Workbooks.Open(Dts.Variables["User::SourcePath"].Value.ToString() + "\\" + Dts.Variables["User::FileName"].Value.ToString() + ".xls");
        Excel.Worksheet oWorksheet = oWorkbook.Worksheets[1];
        try
        {
            ChangeValues(oWorksheet);
            oWorkbook.SaveAs("C:\\TEMP\\" + Dts.Variables["User::FileName"].Value.ToString() + ".xls");
            oWorkbook.Close();
            oApp.Quit();
            oWorksheet = null;
            oWorkbook = null;
            oApp = null;

            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();
            GC.WaitForPendingFinalizers();

            Dts.TaskResult = (int)ScriptResults.Success;
        } 
        catch (Exception e)
        {
            Dts.Events.FireError(0, "Script task", e.Message + "\r" + e.StackTrace, String.Empty, 0);
        }
    }

    private static void ChangeValues(Excel.Worksheet oWorksheet)
    {
        Excel.Range range = oWorksheet.UsedRange;
        int colNo = range.Columns.Count;
        int rowNo = range.Rows.Count;
        // read the values into an array.
        object[,] cells = range.Value;
            for (int j = 1; j <= colNo; j++)
            {
                for (int i = 1; i <= rowNo; i++)
                {
                    if (j > 3 && cells[i, j] != null)
                    {
                        cells[i, j] = cells[i, j].ToString().Replace(",", ".");
                    }
                }
            }
            // set the values back into the range.
            range.Value = cells;
            return;
        }
 }

【问题讨论】:

  • 在 if 语句上打断点,检查 colNo 变量是否大于 3。是否有一个空的隐藏列使范围小于您的预期?
  • “未正确处理”是什么意思?脚本任务是成功运行还是出错?如果有错误,报告什么错误?
  • 脚本任务确实成功了,但在第二次迭代中它没有用点交换逗号。没有错误输出,如果我设置断点,它不会在断点处停止,而是在断点上运行,就好像它不存在一样......
  • @billinkc 你有什么发现吗?我真的不接受这个......:/

标签: ssis foreach-loop-container script-task


【解决方案1】:

好的,我知道这篇文章有点老了,但几周后我找到了解决问题的方法,并想尽快与你们分享。为了调试代码,我必须在 VM 上安装 Windows 10 和 VS2017,因为在 SSIS 中运行脚本任务的 Visual Studio Tools for Application (VSTA) 调试器在 VS2015 上不起作用,并且 SSDT 在 Windows 7 上不适用于 VS2017。所以我能够在 VS2017 中调试 Windows 10 上的脚本,发现我的代码没有打开正确的 excel 表。希望它可以帮助其他在调试 SSIS 脚本任务时遇到问题的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多