代码之家  ›  专栏  ›  技术社区  ›  SAMills

C++/CLI托管包装器和ADODB::记录集

  •  0
  • SAMills  · 技术社区  · 15 年前

    我有一个使用COM ADO记录集的原生C++ DLL,并且需要将它转换成.NET变体(ADODB::记录集)。我尝试了几种方法来解决这个问题,但都没有成功。 例如,当试图利用Fields集合来追加列时(尽管intellisense告诉我不是这样),我收到:

    错误C2039:“字段”:不是“ADODB::记录集”的成员

    ADODB::Recordset ^RS = gcnew ADODB::Recordset ();
    RS->Fields->Append("ID", DataTypeEnum::adInteger, 1, FieldAttributeEnum::adFldKeyColumn);
    

    我的C++/CLI解决方案包含ADODB参考(C:\Program Files\Microsoft.NET\Primary Interop Assembly\ADODB.dll)版本7.0.3300.0

    1 回复  |  直到 15 年前
        1
  •  1
  •   Colin Desmond    15 年前

    我认为原始COM记录集与.Net包装器类提供的记录集之间的主要区别在于有些东西被重命名了。它只是底层COM对象的包装器,本身并不是一个新类。

    要回答您的直接示例,请尝试

    RS->default->Append(...);
    

    您可以尝试在adodb.dll上运行ILDASM,您必须查看recordset类上的API是什么。

    您也可以执行以下操作:

    //Create instance of a recordset
    ADODB::RecordsetClass^ recordset;
    recordset = gcnew ADODB::RecordsetClass();
    
    //Set some options
    recordset->CursorLocation = ADODB::CursorLocationEnum::adUseClient ;
    recordset->CursorType = ADODB::CursorTypeEnum::adOpenDynamic;
    recordset->LockType = ADODB::LockTypeEnum::adLockBatchOptimistic;
    
    //Add columns
    recordset->default->Append("Name", ADODB::DataTypeEnum::adWChar, 50, ADODB::FieldAttributeEnum::adFldFixed, nullptr);
    recordset->default->Append("Number", ADODB::DataTypeEnum::adWChar, 20, ADODB::FieldAttributeEnum::adFldFixed, nullptr);
    
    //Build an array of field names
    fields = gcnew array<Object^>(2);
    fields[0] = gcnew String("Name");
    fields[1] = gcnew String("Number");
    
    //Add values
    array<Object^>^ values = gcnew array<Object^>(2);
    values [0] = "some name";
    values [1] = 1.2;
    recordset->AddNew(fields, values);
    
    //Get a value out again
    recordset->MoveFirst();
    ADODB::Field^ pNum= recordset->default[1];
    double num = Convert::ToDouble((pNum->default));