SSIS 脚本任务不适用于 ForEach 循环容器的第二次迭代
SSIS Script Task does not work on second iteration of ForEach Loop Container
这是我在 Stack Overflow 上的第一个 post,肯定不会是最后一个。我度过了一个非常艰难的一周,试图在 VS2015 的 SSDT 中解决我的 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;
}
}
好的,我知道这个 Post 有点旧,但我在几周后找到了解决问题的方法,并希望很快与大家分享。要调试代码,我必须在 VM 上安装 Windows 10 和 VS2017,因为在 SSIS 中运行脚本任务的 Visual Studio 应用程序工具 (VSTA) 调试器在 VS2015 上不起作用,SSDT 不适用于Windows 7 上的 VS2017。所以我能够在 VS2017 中调试 Windows 10 上的脚本,发现我的代码没有打开正确的 excel sheet。希望它可以帮助其他人解决调试 SSIS 脚本任务的问题。
这是我在 Stack Overflow 上的第一个 post,肯定不会是最后一个。我度过了一个非常艰难的一周,试图在 VS2015 的 SSDT 中解决我的 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;
}
}
好的,我知道这个 Post 有点旧,但我在几周后找到了解决问题的方法,并希望很快与大家分享。要调试代码,我必须在 VM 上安装 Windows 10 和 VS2017,因为在 SSIS 中运行脚本任务的 Visual Studio 应用程序工具 (VSTA) 调试器在 VS2015 上不起作用,SSDT 不适用于Windows 7 上的 VS2017。所以我能够在 VS2017 中调试 Windows 10 上的脚本,发现我的代码没有打开正确的 excel sheet。希望它可以帮助其他人解决调试 SSIS 脚本任务的问题。