Foreach 循环容器在 5 次迭代后给出错误。 SSIS
Foreach Loop Container gives an error after 5 iterations. SSIS
我创建了 SSIS 包,它循环访问 Excel 电子表格并将数据加载到 SQL。
使用 ForEach 循环容器。
出于某种原因,在 5 次迭代后我得到了一个错误。
我试过了:
- 在 Foreach 循环容器上将
MaximumErrorCount
设置为 0
ValidateExternaMetadata
在 OLE DB Destination
上设置为 Off
为什么它迭代了 5 次之后就报错了??
他们的主要问题是
Opening a rowset for "New_Val$A3:C10000" failed. Check that the object exists in the database
它与目标无关,看起来 New_Val$
sheet 在所有作品中都找不到 sheets
您可以在DataFlow Task 之前添加脚本任务以检索第一个sheet 名称,类似于以下逻辑:
using System;
using System.Data;
using System.Data.OleDb;
using Microsoft.SqlServer.Dts.Runtime;
public class ScriptMain
{
public void Main()
{
string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\excelfile.xlsx;Extended Properties=\"Excel 8.0;HDR=YES\";";
using (OleDbConnection conn = new OleDbConnection(connectionString))
{
conn.Open();
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = conn;
// Get all Sheets in Excel File
DataTable dtSheet = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
DataRow dr= dtSheet .Rows[0];
string sheetName = dr["TABLE_NAME"].ToString();
// You have to assign value to variable (assuming sheetName is created in SSIS)
Dts.Variables["sheetName"].Value = sheetName ;
}
cmd = null;
conn.Close();
}
}
在 Excel 源代码中,从变量中读取 sheet 名称,从 SQL 命令中使用表达式中的此变量
注意所有的worksheet必须结构相同,否则永远不会成功
根据我的评论:
我认为迭代次数与它没有任何关系,这里的错误很清楚:
Opening a rowset for "New_Val$A3:C10000" failed. Check that the object exists in the database.
告诉您,您的文档中没有名为 New_Val 的工作表,或者该文档不存在。如果您在文件上使用循环,我猜测它正在处理的第 5 个文件是缺少工作表的文件。
如果您的工作表具有已知的工作表名称,并且可以派生(例如,因为文件名),我会建议不同的数据流任务,哪些逻辑指向导致任务流执行正确的任务,取决于文件名。
我创建了 SSIS 包,它循环访问 Excel 电子表格并将数据加载到 SQL。 使用 ForEach 循环容器。
出于某种原因,在 5 次迭代后我得到了一个错误。
我试过了:
- 在 Foreach 循环容器上将
MaximumErrorCount
设置为0
ValidateExternaMetadata
在OLE DB Destination
上设置为
Off
为什么它迭代了 5 次之后就报错了??
他们的主要问题是
Opening a rowset for "New_Val$A3:C10000" failed. Check that the object exists in the database
它与目标无关,看起来 New_Val$
sheet 在所有作品中都找不到 sheets
您可以在DataFlow Task 之前添加脚本任务以检索第一个sheet 名称,类似于以下逻辑:
using System;
using System.Data;
using System.Data.OleDb;
using Microsoft.SqlServer.Dts.Runtime;
public class ScriptMain
{
public void Main()
{
string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\excelfile.xlsx;Extended Properties=\"Excel 8.0;HDR=YES\";";
using (OleDbConnection conn = new OleDbConnection(connectionString))
{
conn.Open();
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = conn;
// Get all Sheets in Excel File
DataTable dtSheet = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
DataRow dr= dtSheet .Rows[0];
string sheetName = dr["TABLE_NAME"].ToString();
// You have to assign value to variable (assuming sheetName is created in SSIS)
Dts.Variables["sheetName"].Value = sheetName ;
}
cmd = null;
conn.Close();
}
}
在 Excel 源代码中,从变量中读取 sheet 名称,从 SQL 命令中使用表达式中的此变量
注意所有的worksheet必须结构相同,否则永远不会成功
根据我的评论:
我认为迭代次数与它没有任何关系,这里的错误很清楚:
Opening a rowset for "New_Val$A3:C10000" failed. Check that the object exists in the database.
告诉您,您的文档中没有名为 New_Val 的工作表,或者该文档不存在。如果您在文件上使用循环,我猜测它正在处理的第 5 个文件是缺少工作表的文件。
如果您的工作表具有已知的工作表名称,并且可以派生(例如,因为文件名),我会建议不同的数据流任务,哪些逻辑指向导致任务流执行正确的任务,取决于文件名。