Ste*_*eam 5 c# ssis etl .net-3.5
我使用下面的代码填充数据表-
OleDbDataAdapter oleDA = new OleDbDataAdapter();
DataTable dt = new DataTable();
oleDA.Fill(dt, Dts.Variables["My_Result_Set"].Value);
Run Code Online (Sandbox Code Playgroud)
我得到了错误-
Error: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.ArgumentException: Object is not an ADODB.RecordSet or an ADODB.Record.
Parameter name: adodb
at System.Data.OleDb.OleDbDataAdapter.FillFromADODB(Object data, Object adodb, String srcTable, Boolean multipleResults)
at System.Data.OleDb.OleDbDataAdapter.Fill(DataTable dataTable, Object ADODBRecordSet)
at ST_34944nkdfnfkdffk333333.csproj.ScriptMain.Main()
--- End of inner exception stack trace ---
at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
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()
Run Code Online (Sandbox Code Playgroud)
为什么会出现此错误?我以前使用过完全相同的代码,但从来没有给我任何问题。
在脚本任务中,我创建了一个名为DtUsers的数据表,在该数据表中创建了列,添加了行并为行单元分配了值。然后,我将此数据表存储在一个名为activeDirectoryUsers的对象变量中:
Dts.Variables["User::activeDirectoryUsers"].Value = DtUsers;
Run Code Online (Sandbox Code Playgroud)
然后,我创建了一个数据流并添加了一个源脚本组件。我尝试使用Fill()并收到与OP相同的错误。
OleDbDataAdapter da = new OleDbDataAdapter();
DataTable dt = new DataTable();
da.Fill(dt, Variables.activeDirectoryUsers); //error here
Run Code Online (Sandbox Code Playgroud)
对象不是ADODB.RecordSet或ADODB.Record
对我来说,解决方案是双重的:
将DtUsers数据表添加到数据集,然后将数据集存储在对象变量中。
DataSet ds = new DataSet();
ds.Tables.Add(DtUsers);
Dts.Variables["User::activeDirectoryUsers"].Value = ds;
Run Code Online (Sandbox Code Playgroud)在源脚本组件中,创建一个新的数据集,并将对象变量转换为数据集类型,然后将其分配给该数据集:
DataSet ds = (DataSet)Variables.activeDirectoryUsers;
if (ds == null || ds.Tables.Count == 0) return;
DataTable dt = ds.Tables[0];
//do stuff with dt...
Run Code Online (Sandbox Code Playgroud)本文将我引向这个解决方案。
当您未在 SSIS 中连接两个组件时,会发生此错误。请参见图像 - 执行 SQL 任务会生成一个 ADO 记录集,该记录集将由 C# 脚本使用。该 ADO 存储在 SSIS 对象变量中(图像中未显示),并由我在问题中提到的 C# 脚本获取。

| 归档时间: |
|
| 查看次数: |
10586 次 |
| 最近记录: |