C ++ / CLI Managed Wrapper和ADODB :: Recordset

时间:2009-09-27 21:15:20

标签: visual-c++ ado.net c++-cli

我有一个使用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的示例,我会建议它。

1 个答案:

答案 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));