2009-09-27 64 views
0

我有一个本机C++ DLL使用COM ADO记录集,并需要将其转换为.NET变体(ADODB :: Recordset)。我尝试了几种方法来解决这个问题,但没有成功。 本地C++ DLL动态创建并填充COM记录集。理想情况下,我会为托管包装中的ADODB :: Recordset执行相同的操作,但所需的属性无法访问。 例如,试图使用Fields集合,以附加列(尽管智能感知告诉我,否则)时,我得到:C++/CLI托管包装和ADODB :: Recordset

错误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 \主互操作程序集\ adodb.dll)版本7.0.3300.0 我使用Visual Studio 2005和.NET Framework 2.0的.50727 SP2

我会appreaciate它,如果有人在StackOverflow社区c指导我使用C++/CLI动态填充.NET ADO Recordset的示例。

回答

1

我认为原始COM Recordset和.Net包装类提供的主要区别在于有些东西会被重命名。它只是一个基础COM对象的包装,并不是一个新的类。

要回答你的直接的例子,尝试

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

你可以试着在你看到记录类的API是什么adodb.dll运行ILDASM。

您可以执行以下操作太:

//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));