Создание ADO Recordset
От: Archie Беларусь  
Дата: 11.01.02 13:32
Оценка:
Привет, есть такая проблема — при использовании для работы с ADO используются adoid.h и adoint.h

HRESULT hr;
_ADORecordset *pRecordset = NULL;

hr = CoCreateInstance(CLSID_CADORecordset, NULL, CLSCTX_INPROC_SERVER, IID_IADORecordset, (void**) &pRecordset));

так вот: Recordset не создается !!! Проверено на SP4, SP5

аналогичное создание с использованием других средств — классов, сгенеренных из АДОшной DLL, создание по имени "ADODB.Recordset" работает без проблем. Может кто-нибудь сталкивался и знает решение проблемы ?
Re: Создание ADO Recordset
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.01.02 16:39
Оценка:
Здравствуйте Archie, Вы писали:

A>hr = CoCreateInstance(CLSID_CADORecordset, NULL, CLSCTX_INPROC_SERVER, IID_IADORecordset, (void**) &pRecordset));


Вот рабочий код на ATL:

CComPtr<_Recordset> spAdoRs;
HRESULT hr = spAdoRs.CoCreateInstance(CLSID_Recordset);



У тебя неправильные ID используются и скорее вего устаревшие хеадеры. Скачай последний PSDK или используй #import.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Создание ADO Recordset
От: Archie Беларусь  
Дата: 11.01.02 17:14
Оценка:
Здравствуйте VladD2, Вы писали:

VD>
VD>CComPtr<_Recordset> spAdoRs;
VD>HRESULT hr = spAdoRs.CoCreateInstance(CLSID_Recordset);
VD>


VD>У тебя неправильные ID используются и скорее вего устаревшие хеадеры. Скачай последний PSDK или используй #import.


PSDK у меня стоит последнее...впрочем от версии PSDK это вряд ли зависит, потому что во всех его версиях CLSID/IID Recorset'а имееют одно и то же значение.
То, что приведенный тобой код работает, я и так знаю — я ж говорю, что все возможные способы создание я проверил. Особенность в том что после выхода из функции, где этот код написан, Recordset грохнется (или я неправ ?), а мне нужно его вернуть по указателю. Альтернативное решение провлемы в использовании сгенеренных визардом классов для ADO и присвоении Recordset.m_bAutoRelease = FALSE до возврата из функции, но тогда получается, что туча кода уже написана под использование хидеров adoint.h и adoid.h и только для этой мульки нужно генерить классы.
Re[3]: Создание ADO Recordset
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.01.02 18:06
Оценка:
Здравствуйте Archie, Вы писали:

A>PSDK у меня стоит последнее...впрочем от версии PSDK это вряд ли зависит


То что идет с VC6 никуда не годится... из PSDK врде правильные.

A>...Особенность в том что после выхода из функции, где этот код написан, Recordset грохнется (или я неправ ?), а мне нужно его вернуть по указателю.


Recordset — COM-объект. Если AddRef не делать (по правилам COM-а), то грохнется, а если сделать, то должен нормально работать. Покрайней мере у нас есть функия:

[id(DISPID_LOCALCURSOR_GETADOCURSOR), helpstring("Получить ADORecordset, созданный на основе данных колонок курсора")] 
HRESULT GetADORecordset(
   [in, defaultvalue(-1)] long FirstRecord, 
   [in, defaultvalue(-1)] long RecordCount, 
   [out, retval] IDispatch **ADORecordset
);

// Реализация:

STDMETHODIMP CascCachedCursor::GetADORecordset(long FirstRecord, long RecordCount, IDispatch **ADORecordset)
{

    if(ADORecordset == NULL)
        return S_FALSE;
             
    CComPtr<_Recordset> spAdoRs;
    HRESULT hr = spAdoRs.CoCreateInstance(CLSID_Recordset);
    ASC_RETURN_FAILED(hr);


    hr = spAdoRs->put_CursorLocation(adUseClient);
    ASC_RETURN_FAILED(hr);
    
    CComPtr<IascColumns> spIascColumns;
    hr = get_Columns(&spIascColumns);
    ASC_RETURN_FAILED(hr);

    CComPtr<Fields> spFields;
    hr = spAdoRs->get_Fields(&spFields);
    ASC_RETURN_FAILED(hr);
    

    hr = InitADORecordsetFields(spFields, spIascColumns);
    ASC_RETURN_FAILED(hr);
 
    VARIANT svEmpty;
    svEmpty.vt = VT_DISPATCH;
    svEmpty.pdispVal = NULL;

    hr = spAdoRs->Open(svEmpty, svEmpty,
        adOpenUnspecified, 
        adLockUnspecified, 
        -1);
    ASC_RETURN_FAILED(hr);

    hr = InitADOFieldsValues(FirstRecord, RecordCount, spFields, spAdoRs);
    ASC_RETURN_FAILED(hr);

    hr = spAdoRs->Update(vtMissing, vtMissing);
    ASC_RETURN_FAILED(hr);
    
    hr = spAdoRs->MoveFirst();
    ASC_RETURN_FAILED(hr);

    return spAdoRs->QueryInterface(ADORecordset); // AddRef
}



Она создает и возвращает ADO-Recordset. Ну, и вроде работае.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Создание ADO Recordset
От: Archie Беларусь  
Дата: 14.01.02 08:58
Оценка:
Здравствуйте VladD2, Вы писали:

VD>Recordset — COM-объект. Если AddRef не делать (по правилам COM-а), то грохнется, а если сделать, то должен нормально работать.


Спасибо! Я просто ошибочно считал что CComPtr<> не обращая внимания на счетчмк ссылок уничтожит объект в деструкторе.

Вот поправочка, чтобы не зависеть от версии PSDK.

HRESULT hr;
CComPtr<_ADORecordset> pRec;
CLSID clsid;

hr = CLSIDFromString(L"ADODB.Recordset", &clsid);
hr = pRec.CoCreateInstance(clsid);
Re[5]: Создание ADO Recordset
От: Archie Беларусь  
Дата: 14.01.02 14:01
Оценка:
Ну и окончательная поправочка

CComPtr<_ADORecordset> pRec;
HRESULT hr = pRec.CoCreateInstance(L"ADODB.Recordset");
Re[6]: Создание ADO Recordset
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.01.02 19:59
Оценка:
Здравствуйте Archie, Вы писали:

A>Ну и окончательная поправочка


A>
A>CComPtr<_ADORecordset> pRec;
A>HRESULT hr = pRec.CoCreateInstance(L"ADODB.Recordset");
A>


Лучше все таки

CComPtr<_ADORecordset> pRec;
HRESULT hr = pRec.CoCreateInstance(OLESTR("ADODB.Recordset"));



PS

А что в разных версиях ADO изменяются CLSID?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Создание ADO Recordset
От: Archie Беларусь  
Дата: 15.01.02 08:08
Оценка:
Здравствуйте VladD2, Вы писали:

VD>Лучше все таки


VD>
VD>CComPtr<_ADORecordset> pRec;
VD>HRESULT hr = pRec.CoCreateInstance(OLESTR("ADODB.Recordset"));
VD>



VD>PS


VD>А что в разных версиях ADO изменяются CLSID?


В том-то и дело что они не изменяются — я это писал в предыдущем сообщении. Это один из базовых принципов COM. Только не понятно одно — почему так трудно было засунуть в VC корректные их значения...значение, получаемое CLSIDFromString(L"ADODB.Recordset", &clsid) отличается от CLSID_CADORecordset
А насчет OLESTR — писать дольше Вот вместо _T писать TEXT я себя еще заставляю, но это...
Re[8]: Создание ADO Recordset
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.01.02 10:53
Оценка:
Здравствуйте Archie, Вы писали:

A>Здравствуйте VladD2, Вы писали:


VD>>Лучше все таки


VD>>
VD>>CComPtr<_ADORecordset> pRec;
VD>>HRESULT hr = pRec.CoCreateInstance(OLESTR("ADODB.Recordset"));
VD>>



VD>>PS


VD>>А что в разных версиях ADO изменяются CLSID?


A>В том-то и дело что они не изменяются — я это писал в предыдущем сообщении. Это один из базовых принципов COM. Только не понятно одно — почему так трудно было засунуть в VC корректные их значения...значение, получаемое CLSIDFromString(L"ADODB.Recordset", &clsid) отличается от CLSID_CADORecordset


У нас все работает, только хеадеры не из VC6, а из PSDK.

A>А насчет OLESTR — писать дольше


Так сделай дефайн.

A>Вот вместо _T писать TEXT я себя еще заставляю, но это...


А зачем?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Создание ADO Recordset
От: Archie Беларусь  
Дата: 15.01.02 11:35
Оценка:
Здравствуйте VladD2, Вы писали:

A>>А насчет OLESTR — писать дольше


дефайн на дефайн ? глумно это...

A>>Вот вместо _T писать TEXT я себя еще заставляю, но это...


VD>А зачем?


так нагляднее
Re[10]: Создание ADO Recordset
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.01.02 13:00
Оценка:
Здравствуйте Archie, Вы писали:

A>>>А насчет OLESTR — писать дольше


A>дефайн на дефайн ? глумно это...


Ну, тогда посмотри реализацию _T

A>>>Вот вместо _T писать TEXT я себя еще заставляю, но это...


VD>>А зачем?


A>так нагляднее


Особо нагладно становится когда их штук пять в одно строке.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Создание ADO Recordset
От: Archie Беларусь  
Дата: 15.01.02 13:23
Оценка:
Здравствуйте VladD2, Вы писали:

VD>Здравствуйте Archie, Вы писали:


A>>>>А насчет OLESTR — писать дольше


A>>дефайн на дефайн ? глумно это...


VD>Ну, тогда посмотри реализацию _T


да знаю я как она релизована — я ж и говорю глумно это.

A>>>>Вот вместо _T писать TEXT я себя еще заставляю, но это...


VD>>>А зачем?


A>>так нагляднее


VD>Особо нагладно становится когда их штук пять в одно строке.


да, тут рассуждать и спорить можно до бесконечности — и что _T определен в tchar а TEXT в winnt, и что еще Страуструп рекомендовал использовать идентификаторы напрямую без дефайнов дабы не запутывать код...и каждый будет прав по-своему. У буржиуев на такие вопросы вообще ответ стандартный — "it's not my style"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.