5

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

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

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

4

6 回答 6

8

在一个脚本任务中,我创建了一个名为 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. 在源脚本组件中,创建一个新的 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...
    

这篇文章让我找到了这个解决方案。

于 2016-06-22T20:41:41.993 回答
1

我认为您需要.ToString()在执行.Fill().

像这样的东西:

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

这里的文档:

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

看起来在您的实现中,您正试图将意外的类型传递给该.Fill()方法。

于 2013-11-04T20:34:04.903 回答
1

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

OleDbDataAdapter oleDA = new OleDbDataAdapter();
DataSet ds = new DataSet();
oleDA.Fill(ds, "MyTableName"); 
DataTable dt = ds.Tables["MyTableName"];
于 2014-11-03T12:34:17.463 回答
0

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

在此处输入图像描述

于 2013-11-04T21:15:18.660 回答
0

下面对我有用,没有填充。

OleDbDataAdapter oleDA = new OleDbDataAdapter();
DataSet ds = new DataSet();
ds = (DataSet)Dts.Variables["User::myresultSet"].Value;
于 2016-12-26T19:42:42.930 回答
0

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

于 2019-03-19T15:27:14.287 回答