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. Ну, и вроде работае.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.