SSIS 脚本任务 Excel 连接打开:调用目标抛出异常
SSIS Script Task Excel connection open: Exception has been thrown by the target of an invocation
我已经阅读了尽可能多的文章。是时候寻求帮助了。
我正在将 SSIS 包从 2008R2 升级到 2016。我正在使用 VS2019 设置为 2016。脚本任务在执行 Connection.Open();
的代码行之前工作正常
我已经尝试了这两个提供商,结果相同。我使用的是包参数,但将其注释掉并对该值进行了硬编码。
这是返回的异常:
DTS Script Task has encountered an exception in user code:
Project name: ST_6bceaa360e1d4200a203f7c688acd0fd
Exception has been thrown by the target of an invocation.
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags
invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder
binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers,
CultureInfo culture, String[] namedParams)
at
Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript()
这是我使用的代码:
public void Main()
{
Dts.TaskResult = (int)ScriptResults.Success;
string sFile;
OleDbConnection connection;
string sConnectionString;
int dataloop = 0;
//sFile = Dts.Variables["$Project::InputFilePath01"].Value.ToString();
sFile = @"C:\AccknowledgeData\InvoiceXLS.xls";
if (File.Exists(sFile))
{
if (File.GetAttributes(sFile) == FileAttributes.ReadOnly)
{
//File.SetAttributes(sFile, FileAttributes.Normal);
Dts.TaskResult = (int)ScriptResults.Failure;
return;
}
//sConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + sFile + ";Extended Properties=Excel 8.0";
sConnectionString = @"Provider = Microsoft.ACE.OLEDB.12.0;Data Source=" + sFile + @";Extended Properties=Excel 8.0;HDR=NO";
using (connection = new OleDbConnection(sConnectionString))
{
connection.Open();
try
{
DataTable tables = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
while (dataloop < tables.Rows.Count)
{
try
{
DataRow table = tables.Rows[dataloop];
OleDbDataAdapter cmdLoadExcel = new System.Data.OleDb.OleDbDataAdapter("select count(*) from [" + table["TABLE_NAME"].ToString() + "]", connection);
DataSet ldExcelDS = new DataSet();
cmdLoadExcel.Fill(ldExcelDS);
if (ldExcelDS.Tables[0].Rows[0].ItemArray[0].ToString() != "0")
{
Dts.Variables["User::Tab"].Value = table["TABLE_NAME"].ToString();
dataloop = tables.Rows.Count;
}
}
finally
{
dataloop++;
}
}
}
catch (Exception e)
{
Dts.TaskResult = (int)ScriptResults.Failure;
Dts.ExecutionValue = "Connection String = " + connection.ConnectionString;
}
finally
{
connection.Close();
}
}
}
}
提前感谢您的关注。
理查德
这可能是架构问题,您正在尝试从 64 位运行时使用 32 位驱动程序,您是否尝试过将程序包设置为 32 位运行时?
我开始使用 Microsofts OpenXML 作为与那些喷气式驱动程序斗争的替代方案,它在 VS 中运行在 32 位上,在部署时运行在 64 位上。它安装到 GAC,因此您可以轻松地从脚本组件引用它
如果您使用 sConnectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"{0}\";Extended Properties=\"Excel 8.0;HDR={1};IMEX=1\"", sFile);
行得通吗?我认为问题是您没有正确构建连接字符串。
我在这个博客中有 JET 和 ACE 示例 post SSIS Excel Source via Script
另一件事是 FireInformation 事件并记录 sConnectionString
的实际值,以便您将预期值与实际值进行比较。
我已经阅读了尽可能多的文章。是时候寻求帮助了。
我正在将 SSIS 包从 2008R2 升级到 2016。我正在使用 VS2019 设置为 2016。脚本任务在执行 Connection.Open();
我已经尝试了这两个提供商,结果相同。我使用的是包参数,但将其注释掉并对该值进行了硬编码。
这是返回的异常:
DTS Script Task has encountered an exception in user code: Project name: ST_6bceaa360e1d4200a203f7c688acd0fd Exception has been thrown by the target of an invocation. at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) at System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams) at Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript()
这是我使用的代码:
public void Main()
{
Dts.TaskResult = (int)ScriptResults.Success;
string sFile;
OleDbConnection connection;
string sConnectionString;
int dataloop = 0;
//sFile = Dts.Variables["$Project::InputFilePath01"].Value.ToString();
sFile = @"C:\AccknowledgeData\InvoiceXLS.xls";
if (File.Exists(sFile))
{
if (File.GetAttributes(sFile) == FileAttributes.ReadOnly)
{
//File.SetAttributes(sFile, FileAttributes.Normal);
Dts.TaskResult = (int)ScriptResults.Failure;
return;
}
//sConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + sFile + ";Extended Properties=Excel 8.0";
sConnectionString = @"Provider = Microsoft.ACE.OLEDB.12.0;Data Source=" + sFile + @";Extended Properties=Excel 8.0;HDR=NO";
using (connection = new OleDbConnection(sConnectionString))
{
connection.Open();
try
{
DataTable tables = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
while (dataloop < tables.Rows.Count)
{
try
{
DataRow table = tables.Rows[dataloop];
OleDbDataAdapter cmdLoadExcel = new System.Data.OleDb.OleDbDataAdapter("select count(*) from [" + table["TABLE_NAME"].ToString() + "]", connection);
DataSet ldExcelDS = new DataSet();
cmdLoadExcel.Fill(ldExcelDS);
if (ldExcelDS.Tables[0].Rows[0].ItemArray[0].ToString() != "0")
{
Dts.Variables["User::Tab"].Value = table["TABLE_NAME"].ToString();
dataloop = tables.Rows.Count;
}
}
finally
{
dataloop++;
}
}
}
catch (Exception e)
{
Dts.TaskResult = (int)ScriptResults.Failure;
Dts.ExecutionValue = "Connection String = " + connection.ConnectionString;
}
finally
{
connection.Close();
}
}
}
}
提前感谢您的关注。
理查德
这可能是架构问题,您正在尝试从 64 位运行时使用 32 位驱动程序,您是否尝试过将程序包设置为 32 位运行时?
我开始使用 Microsofts OpenXML 作为与那些喷气式驱动程序斗争的替代方案,它在 VS 中运行在 32 位上,在部署时运行在 64 位上。它安装到 GAC,因此您可以轻松地从脚本组件引用它
如果您使用 sConnectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"{0}\";Extended Properties=\"Excel 8.0;HDR={1};IMEX=1\"", sFile);
行得通吗?我认为问题是您没有正确构建连接字符串。
我在这个博客中有 JET 和 ACE 示例 post SSIS Excel Source via Script
另一件事是 FireInformation 事件并记录 sConnectionString
的实际值,以便您将预期值与实际值进行比较。