|
|
|
IMoniker, GetDisplayName and ADO Recordset Problem
|
|||
|---|---|---|---|
|
#18+
Всем привет Есть необходимость получить моникер (строку) для рекордсета полученного в результате выполнения 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 как мне кажется очень мало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2004, 13:54 |
|
||
|
IMoniker, GetDisplayName and ADO Recordset Problem
|
|||
|---|---|---|---|
|
#18+
Всем привет Есть необходимость получить моникер (строку) для рекордсета полученного в результате выполнения 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. И вот самое интересное! Если rsSQL->CursorLocation=adUseClient, ТО hr=pIMon->GetDisplayName(pbc,NULL,&nm); завершается с ошибкой (error code = E_INVALIDARG) Если же rsSQL->CursorLocation=adUseServer - то все отлично отрабатывается и мы получаем строку-моникер для нашего рекордсета. В чем дело, почему так и что вообще происходит??? Огромное спасибо за любые предополжения, советы. ссылки, помощь. Информации по работе с моникерами, равно как и по внутреннему устройству ADO Recordsеt как мне кажется очень мало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2004, 13:57 |
|
||
|
IMoniker, GetDisplayName and ADO Recordset Problem
|
|||
|---|---|---|---|
|
#18+
Когда указываешь adUseClient, то ADO использует не OLE DB Provider, а Microsoft Cursor Service Provider. Потому и поведение разное. Возможно в Cursor сервисе есть бага, поэтому советую обратиться за помощью в саму Microsoft. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2004, 15:33 |
|
||
|
IMoniker, GetDisplayName and ADO Recordset Problem
|
|||
|---|---|---|---|
|
#18+
Мда, послали так послали. Вообще все это странно. Про то, какие механизмы вступают в силу в зависимости от значения CursorLocation - я примерно догадывался. Но !!! Я получаю у рекордсета указатель на IUnknown интерфейс и хочу для этого интерфейса получить моникер. Едва ли на получение/построение моникера должна влиять функциональность объекта, который поддерживает этот интерфейс. Вот если бы я наткнулся бы на проблемы при работе уже с этим рекордсетом, то да, тут разные механизмы, разные провайдеры, разный функционал - тут ладно, согласен. Но почему моникер строится в одном случае и не строится в другом ??? Вот что ОООООЧЕНЬ странно. А в MS за этим обращаться - так это очень долго наверно, если вообще не безнадежно. Честно говоря я плохо даже представляют форму заявки и форму описания проблемы. И на какой адрес слать? И что, парни в Рэдмонде сидят и ждут таких вот мессаг/вопросов чтобы на них быстренько ответить. Ой едва ли. Но все равно Спасибо за участие. И еще, может у кого получалось сохранить рекордсет в поток, типа: rs->Save(stm.GetInterfacePtr(),adPersistADTG); а потом его оттуда прочитать rsLoc->Open(stm.GetInterfacePtr(),vtMissing,adOpenDynamic,adLockOptimistic,adCmdStoredProc); где-нибудь в другом месте и с этим всем работать ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2004, 16:02 |
|
||
|
IMoniker, GetDisplayName and ADO Recordset Problem
|
|||
|---|---|---|---|
|
#18+
--А в MS за этим обращаться - так это очень долго наверно, если вообще не безнадежно. спроси в соответствующих ньюсах там сидят MVP и довольно быстpо отвечают ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2004, 21:24 |
|
||
|
IMoniker, GetDisplayName and ADO Recordset Problem
|
|||
|---|---|---|---|
|
#18+
Спасибо за совет. Это был один из первых моих порывов - найти инфу у гуру на ньюсах. Но сайт Майкрософт - это наверно самый страшный в плане запутанности и сложности в навигации сайт в сети. Поиск по нему лично я делаю токма через google, что само по себе уже большой курьез и абнормальность. В любом случае туда я уже заслал вопрос и жду ответа. Интересную мысль, кстати, подбросили по этому поводу на RSDN. http://www.rsdn.ru/Forum/?mid=598373 Тоже надо провентилировать. Надеюсь я не нарушил каких-либо моральных норм, ссылаясь в одном форуме на другой аналогичный, а потому можно сказать конкурирующий :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2004, 09:30 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=32488909&tid=2035100]: |
0ms |
get settings: |
8ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
55ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
| others: | 197ms |
| total: | 368ms |

| 0 / 0 |
