2009-09-27 2 views
0

У меня есть родная C++ DLL, которая использует COM ADO Recordsets и мне нужно преобразовать ее в .NET-вариант (ADODB :: Recordset). Я пробовал несколько подходов к решению этой проблемы без успеха. Среда C++ DLL динамически создает и заполняет набор записей COM. В идеале я бы сделал то же самое для ADODB :: Recordset в управляемой оболочке, но необходимые свойства мне недоступны. Например, при попытке использовать коллекцию полей для того, чтобы добавить столбцы (несмотря на то IntelliSense говорил мне в противном случае), я получаю: C2039C++/CLI Managed Wrapper и ADODB :: Recordset

об ошибке: «Поля»: не является членом «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 Ассамблей \ adodb.dll) версия 7.0.3300.0 Я использую Visual Studio 2005 с .NET Framework 2.0 .50727 SP2

Я бы воспринял это, если кто-то из сообщества StackOverflow c прямо меня к образцу, который динамически заполняет набор записей ADO .NET, используя C++/CLI.

ответ

1

Я думаю, что основное различие между необработанным набором записей COM и тем, что предоставляется классами оболочки .Net, это то, что некоторые вещи переименовываются. Это просто оболочка вокруг базового COM-объекта, а не новый класс.

Чтобы ответить на ваш непосредственный пример, попробуйте

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

Вы можете попробовать запустить ILDASM над adodb.dll вы должны увидеть, что 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)); 
Смежные вопросы