首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSIS脚本任务不适用于ForEach循环容器的第二次迭代

问SSIS脚本任务不适用于ForEach循环容器的第二次迭代
EN

Stack Overflow用户
提问于 2017-09-07 10:37:46
回答 1查看 1.9K关注 0票数 1

这是我关于堆栈溢出的第一篇文章,肯定不会是最后一篇。我经历了一个非常艰难的一周,试图在SSDT for VS2015中修复我的SSIS脚本任务。

问题如下:

我在控制流中有一个ForEach循环容器。我映射了一个变量USER::FileName。这个变量用于处理Script Task中的excel文件(用圆点替换逗号),然后保存处理后的文件并在数据流任务中将其转换为平面文件。到目前一切尚好。但是在ForEach循环容器的第二个循环中,原始的excel文件没有得到正确的处理。名称被正确设置,但逗号没有被替换。我不知道该怎么做了。也许有人有什么建议?

​

​

编辑2:这就是Script Task Code的样子:

代码语言:javascript
复制
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;
        }
 }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-05 11:02:31

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46094233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档