Проблема - знатокам COM
Добавлено: 13 ноя 2003, 09:57
Есть SAS OLEDB провайдер.
Простенькая функция
Она вызывается из ATL COM out-of-proc сервера. Если она вызывается в Main, в конструкторе COM объекта или в FinalConstruct все проходит нормально, если же ее вызывать из метода этого СОМ объекта (сам метод взывается внешним скриптом), то при попытке выполнить adoInputRS->UpdateBatch
возвращается hr=0x800a0cb3 "Current Recordset does not support updating. This may be a limitation of the provider, or of the selected locktype."
Причем перед этим при исполнении f->Value=0; в дебаг аутпут выдается First-chance exception at 0x77e73887 in Worker.exe: 0x8001010E: The application called an interface that was marshalled for a different thread.
Когда исходная функция вызывается успешно (Main, Contructor или FinalConstruct) этого сообщения не наблюдается.
Вопрос очевидный - где собака порылась?
Простенькая функция
Код: Выделить всё
ADODB::_ConnectionPtr adoConnection;
adoConnection.CreateInstance(__uuidof(ADODB::Connection));
adoConnection->Provider=L"sas.IOMProvider.1";
ADODB::PropertyPtr spDSProp=adoConnection->Properties->Item[L"Data Source"];
spDSProp->Value=L"_LOCAL_";
adoConnection->Open("","","",ADODB::adModeUnknown);
_bstr_t bsSQL;
ADODB::_CommandPtr spCommand;
spCommand.CreateInstance(__uuidof(ADODB::Command));
spCommand->ActiveConnection=adoConnection;
spCommand->CommandType=ADODB::adCmdText;
bsSQL="libname mylib 'C:\\Alex\\Work\\TestSASProviders'";
spCommand->CommandText=bsSQL;
spCommand->Execute(&vtMissing,&vtMissing,ADODB::adCmdText);
ADODB::_RecordsetPtr adoInputRS;
adoInputRS.CreateInstance(__uuidof(ADODB::Recordset));
adoInputRS->Open("mylib.prediction_test",(IDispatch*)adoConnection,(ADODB::CursorTypeEnum),(ADODB::LockTypeEnum)3,0x200); //adOpenDynamic, adLockOptimistic, adCmdTableDirect
ADODB::FieldPtr f=adoInputRS->Fields->GetItem(_variant_t(long(0)));
f->Value=0;
adoInputRS->UpdateBatch(ADODB::adAffectAll);
adoConnection->Close();
возвращается hr=0x800a0cb3 "Current Recordset does not support updating. This may be a limitation of the provider, or of the selected locktype."
Причем перед этим при исполнении f->Value=0; в дебаг аутпут выдается First-chance exception at 0x77e73887 in Worker.exe: 0x8001010E: The application called an interface that was marshalled for a different thread.
Когда исходная функция вызывается успешно (Main, Contructor или FinalConstruct) этого сообщения не наблюдается.
Вопрос очевидный - где собака порылась?