System.ArgumentException:Object不是ADODB.RecordSet或ADODB.Record

时间:2013-11-04 20:19:25

标签: c# ssis .net-3.5 etl

我使用下面的代码填充数据表 -

OleDbDataAdapter oleDA = new OleDbDataAdapter();
DataTable dt = new DataTable();
oleDA.Fill(dt, Dts.Variables["My_Result_Set"].Value); 

我收到了错误 -

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()

为什么会出现此错误?我之前使用过完全相同的代码,它从来没有给我任何问题。

6 个答案:

答案 0 :(得分:4)

在脚本任务中,我创建了一个名为DtUsers的数据表,在数据表中创建了列,为行单元格添加了行和赋值。然后我将这个数据表存储在一个名为activeDirectoryUsers的对象变量中:

Dts.Variables["User::activeDirectoryUsers"].Value = DtUsers;

然后我创建了一个数据流并添加了一个源脚本组件。我尝试使用Fill()并收到与OP相同的错误。

OleDbDataAdapter da = new OleDbDataAdapter();
DataTable dt = new DataTable();
da.Fill(dt, Variables.activeDirectoryUsers);  //error here
  

Object不是ADODB.RecordSet或ADODB.Record

我的解决方案有两个方面:

  1. 将DtUsers数据表添加到DataSet,然后将DataSet存储在对象变量中。

    DataSet ds = new DataSet();
    ds.Tables.Add(DtUsers);
    Dts.Variables["User::activeDirectoryUsers"].Value = ds;
    
  2. 在源脚本组件中,创建一个新的DataSet并将对象变量强制转换为类型DataSet,并将其分配给DataSet:

    DataSet ds = (DataSet)Variables.activeDirectoryUsers;
    if (ds == null || ds.Tables.Count == 0) return;
    DataTable dt = ds.Tables[0];
    //do stuff with dt...
    
  3. This article让我得到了这个解决方案。

答案 1 :(得分:1)

我认为您在执行.ToString()时需要附加.Fill()方法。

这样的事情:

OleDbDataAdapter oleDA = new OleDbDataAdapter();
DataTable dt = new DataTable();
oleDA.Fill(dt, Dts.Variables["My_Result_Set"].Value.ToString()); 

来自文档here

  

Fill(DataTable,Object)使用指定的DataTable和ADO对象,在DataTable中添加或刷新行以匹配ADO Recordset或Record对象中的行。

在您的实现中,您尝试将意外类型传递给.Fill()方法。

答案 2 :(得分:1)

在我的情况下,问题已解决,更改代码并使用DataSet for Fill而不是DataTable

OleDbDataAdapter oleDA = new OleDbDataAdapter();
DataSet ds = new DataSet();
oleDA.Fill(ds, "MyTableName"); 
DataTable dt = ds.Tables["MyTableName"];

答案 3 :(得分:0)

如果未在SSIS中连接两个组件,则会发生此错误。看图像 - 执行SQL任务生成一个ADO记录集,该记录集将由C#脚本使用。该ADO存储在一个SSIS对象变量(图中未显示)中,并由我在我的问题中提到的C#脚本获取。

enter image description here

答案 4 :(得分:0)

以下为我工作,没有填写。

OleDbDataAdapter oleDA = new OleDbDataAdapter();
DataSet ds = new DataSet();
ds = (DataSet)Dts.Variables["User::myresultSet"].Value;

答案 5 :(得分:0)

我有相同或非常相似的错误,问题出在执行SQL任务中,该任务加载了我传入的Object变量,我将ResultSet设置为Single row,并且它必须是Full结果集。