c# - System.ArgumentException : Object is not an ADODB. RecordSet 或 ADODB.Record

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

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

最佳答案

在脚本任务中,我创建了一个名为 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 is not an ADODB.RecordSet or an ADODB.Record

我的解决方案有两个:

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

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

    DataSet ds = (DataSet)Variables.activeDirectoryUsers;
    if (ds == null || ds.Tables.Count == 0) return;
    DataTable dt = ds.Tables[0];
    //do stuff with dt...
    

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

关于c# - System.ArgumentException : Object is not an ADODB. RecordSet 或 ADODB.Record,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19776364/

相关文章:

ssis - SSIS派生列(如果然后…否则)

sql-server - SSIS : Unwanted line return on a dynamic connection string

visual-studio-2008 - Windows 7 x64 上的 WCF 调试

c# - 从数据库中检索多行

sql - Microsoft.SqlServer.BatchParser 问题

c# - 给定一个作为字符串的 T-SQL 类型,将其评估为 .Net 类型的最简单方法是什么?

c# - 为什么 C# 编译器会第二次启动?

c# - int 的隐式运算符?

c# - 表单在 for 循环期间卡住

c# - ShouldSerialize 模式和 DataContractSerializer