【问题标题】:System.ArgumentException: Object is not an ADODB.RecordSet or an ADODB.RecordSystem.ArgumentException:对象不是 ADODB.RecordSet 或 ADODB.Record
【发布时间】:2013-11-04 20:19:24
【问题描述】:

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

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

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

【问题讨论】:

  • Dts 定义在哪里?
  • 好的,Dts 是在 SSIS(一个 ETL 工具)内部定义的。它实际上是一个 Object 变量,可以通过我的代码中显示的语法访问。
  • 是在该行抛出异常还是在它之前?
  • @Brian - 在那一行。我发现像这样 - 注释该行之后的所有代码 - 错误!然后,也评论该行 - 没有错误!行前的代码是可以的。没问题。

标签: c# ssis .net-3.5 etl


【解决方案1】:

在一个脚本任务中,我创建了一个名为 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

对象不是 ADODB.RecordSet 或 ADODB.Record

对我来说解决方案有两个:

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

    DataSet ds = new DataSet();
    ds.Tables.Add(DtUsers);
    Dts.Variables["User::activeDirectoryUsers"].Value = ds;
    
  2. 在 Source Script 组件中,创建一个新的 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...
    

This article 引导我找到了这个解决方案。

【讨论】:

  • 这是我的情况的解决方案,在脚本任务中填充数据表
【解决方案2】:

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

类似这样的:

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() 方法。

【讨论】:

  • 我刚刚注意到您没有将命令对象传递给您的OleDbDataAdapter。你试过吗?
  • 布赖恩 - 我不确定你的意思。请解释一下。
  • 我想知道你的命令对象是什么?我之前的评论是关于为什么你没有将命令传递给你的DataAdapter,就像这样,OleDbDataAdapter oleDA = new OleDbDataAdapter(/* Your command goes here */);
  • 我使用了这里给出的 c# 代码 - beyondrelational.com/modules/2/blogs/106/posts/11133/… 。我和那个人做同样的事情,以前也有效。现在,我不知道为什么会收到此错误。
  • 我刚刚发现了原因。您必须以图形方式连接所涉及的组件。让我来说明发生了什么。
【解决方案3】:

在我的情况下,问题已解决,更改代码并使用 DataSet 代替 DataTable

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 这个恼人的错误今天又发生了。我不得不将旧包中的一些代码复制粘贴到另一个包中。我正确地复制了它,创建了所有必要的变量和分配。然后,我得到了这个错误。我只是删除了复制的东西并重新复制了它。问题解决了。太奇怪了。
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-21
        • 1970-01-01
        • 1970-01-01
        • 2012-11-19
        • 2018-08-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多