我有一个使用COM ADO Recordsets的本机C ++ DLL,需要将其转换为.NET变体(ADODB :: Recordset)。我已经尝试了几种方法来解决这个问题而没有成功。 本机C ++ DLL动态创建并填充COM Recordset。理想情况下,我会对托管包装器中的ADODB :: Recordset执行相同的操作,但我无法访问所需的属性。 例如,当尝试使用Fields集合来附加列时(尽管智能感知告诉我),我收到:
错误C2039:'字段':不是'ADODB :: Recordset'的成员
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 Assemblies \ adodb.dll)版本7.0.3300.0 我使用Visual Studio 2005与.NET Framework 2.0.50727 SP2
如果StackOverflow社区中的某个人可以引导我使用C ++ / CLI动态填充.NET ADO Recordset的示例,我会建议它。
答案 0 :(得分:1)
我认为原始COM Recordset与.Net包装器类提供的主要区别仅在于某些内容被重命名。它只是一个基础COM对象的包装器,而不是一个新的类。
要回答您的直接示例,请尝试
RS->default->Append(...);
你可以尝试在adodb.dll上运行ILDASM,你必须看看记录集类中的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));