powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / IMoniker, GetDisplayName and ADO Recordset Problem
6 сообщений из 6, страница 1 из 1
IMoniker, GetDisplayName and ADO Recordset Problem
    #32487780
HitMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет

Есть необходимость получить моникер (строку) для рекордсета полученного в результате выполнения ADO Command.
Моникер типа ObjrefMoniker.
В кратце если, то делаю я это так:

IUnknown* pUnk;
_ConnectionPtr cnSQL;
_CommandPtr cmdRSGet;
_RecordsetPtr rsSQL;

... [creating objects and opening connection are skiped]

rsSQL=cmdRSGet->Execute(NULL,NULL,adCmdStoredProc);
rsSQL->QueryInterface(IID_IUnknown,(void**)&pUnk);
CreateObjRefMon(rsSQL,mon)

HRESULT CreateObjRefMon(IUnknown* pUnk, char* mon) {
HRESULT hr=S_OK;
IBindCtx* pbc=NULL;
IMoniker* pIMon=NULL;
LPOLESTR nm=NULL;

USES_CONVERSION;

if(SUCCEEDED(hr)) hr=CreateObjrefMoniker(pUnk,&pIMon);
if(SUCCEEDED(hr)) hr=CreateBindCtx(0,&pbc);
if(SUCCEEDED(hr)) hr=pIMon->GetDisplayName(pbc,NULL,&nm);
if(SUCCEEDED(hr)) strcpy(mon,OLE2T(nm));

if(pbc) pbc->Release();
return hr;
}

И вот самое интересное!
Если rsSQL->CursorLocation=adUseClient, ТО hr=pIMon->GetDisplayName(pbc,NULL,&nm); завершается с ошибкой (error code = E_INVALIDARG)
Если же rsSQL->CursorLocation=adUseServer - то все отлично отрабатывается и мы получаем строку-моникер для нашего рекордсетаe. В чем дело, почему так и что вообще происходит???

Огромное спасибо за любые предополжения, советы. ссылки, помощь. Информации по работе с моникерами, равно как и по внутреннему устройству ADO Recordsеt как мне кажется очень мало.
...
Рейтинг: 0 / 0
IMoniker, GetDisplayName and ADO Recordset Problem
    #32487790
HitMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет

Есть необходимость получить моникер (строку) для рекордсета полученного в результате выполнения ADO Command.
Моникер типа ObjrefMoniker.
В кратце если, то делаю я это так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
IUnknown*    pUnk; 
_ConnectionPtr cnSQL; 
_CommandPtr  cmdRSGet; 
_RecordsetPtr  rsSQL; 
... [creating objects and opening connection are skiped] 

rsSQL=cmdRSGet->Execute(NULL,NULL,adCmdStoredProc); 
rsSQL->QueryInterface(IID_IUnknown,(void**)&pUnk); 
CreateObjRefMon(rsSQL,mon) 

HRESULT   CreateObjRefMon(IUnknown* pUnk, char* mon) { 
   HRESULT         hr=S_OK; 
   IBindCtx*      pbc=NULL; 
   IMoniker*      pIMon=NULL; 
   LPOLESTR      nm=NULL; 

   USES_CONVERSION; 

   if(SUCCEEDED(hr)) hr=CreateObjrefMoniker(pUnk,&pIMon); 
   if(SUCCEEDED(hr)) hr=CreateBindCtx (0 ,&pbc); 
   if(SUCCEEDED(hr)) hr=pIMon->GetDisplayName(pbc,NULL,&nm); 
   if(SUCCEEDED(hr)) strcpy(mon,OLE2T(nm)); 

   if(pbc) pbc->Release(); 
   return hr; 
} 


И вот самое интересное!
Если rsSQL->CursorLocation=adUseClient, ТО hr=pIMon->GetDisplayName(pbc,NULL,&nm); завершается с ошибкой (error code = E_INVALIDARG)
Если же rsSQL->CursorLocation=adUseServer - то все отлично отрабатывается и мы получаем строку-моникер для нашего рекордсета. В чем дело, почему так и что вообще происходит???

Огромное спасибо за любые предополжения, советы. ссылки, помощь. Информации по работе с моникерами, равно как и по внутреннему устройству ADO Recordsеt как мне кажется очень мало.
...
Рейтинг: 0 / 0
IMoniker, GetDisplayName and ADO Recordset Problem
    #32488027
Tracer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда указываешь adUseClient, то ADO использует не OLE DB Provider, а Microsoft Cursor Service Provider. Потому и поведение разное. Возможно в Cursor сервисе есть бага, поэтому советую обратиться за помощью в саму Microsoft.
...
Рейтинг: 0 / 0
IMoniker, GetDisplayName and ADO Recordset Problem
    #32488115
HitMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мда, послали так послали.
Вообще все это странно. Про то, какие механизмы вступают в силу в зависимости от значения CursorLocation - я примерно догадывался. Но !!!
Я получаю у рекордсета указатель на IUnknown интерфейс и хочу для этого интерфейса получить моникер. Едва ли на получение/построение моникера должна влиять функциональность объекта, который поддерживает этот интерфейс. Вот если бы я наткнулся бы на проблемы при работе уже с этим рекордсетом, то да, тут разные механизмы, разные провайдеры, разный функционал - тут ладно, согласен. Но почему моникер строится в одном случае и не строится в другом ??? Вот что ОООООЧЕНЬ странно.

А в MS за этим обращаться - так это очень долго наверно, если вообще не безнадежно. Честно говоря я плохо даже представляют форму заявки и форму описания проблемы. И на какой адрес слать? И что, парни в Рэдмонде сидят и ждут таких вот мессаг/вопросов чтобы на них быстренько ответить. Ой едва ли.

Но все равно Спасибо за участие.

И еще, может у кого получалось сохранить рекордсет в поток, типа:

rs->Save(stm.GetInterfacePtr(),adPersistADTG);

а потом его оттуда прочитать

rsLoc->Open(stm.GetInterfacePtr(),vtMissing,adOpenDynamic,adLockOptimistic,adCmdStoredProc);

где-нибудь в другом месте и с этим всем работать ???
...
Рейтинг: 0 / 0
IMoniker, GetDisplayName and ADO Recordset Problem
    #32488697
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--А в MS за этим обращаться - так это очень долго наверно, если вообще не безнадежно.

спроси в соответствующих ньюсах

там сидят MVP и довольно быстpо отвечают
...
Рейтинг: 0 / 0
IMoniker, GetDisplayName and ADO Recordset Problem
    #32488909
HitMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за совет. Это был один из первых моих порывов - найти инфу у гуру на ньюсах. Но сайт Майкрософт - это наверно самый страшный в плане запутанности и сложности в навигации сайт в сети. Поиск по нему лично я делаю токма через google, что само по себе уже большой курьез и абнормальность.

В любом случае туда я уже заслал вопрос и жду ответа. Интересную мысль, кстати, подбросили по этому поводу на RSDN.
http://www.rsdn.ru/Forum/?mid=598373
Тоже надо провентилировать. Надеюсь я не нарушил каких-либо моральных норм, ссылаясь в одном форуме на другой аналогичный, а потому можно сказать конкурирующий :)
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / IMoniker, GetDisplayName and ADO Recordset Problem
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]