2009-09-27 68 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));