Класс CDynamicAccessor перезаписывает исходное значение DBTYPE столбца с помощью DBTYPE_UNKNOWN. Чтобы получить исходный DBTYPE, нам нужно вызвать функцию GetColumnInfo. Примером того, как это сделать, является пример приложения DynamicConsumer, включенного в примеры Visual Studio 2008:
// the following case will handle BLOBs binded as ISequentialStream/IStream pointer
if( dbtype == DBTYPE_IUNKNOWN )
{
// first we have to determine what was the column's type originally reported by the provider
CComHeapPtr<DBCOLUMNINFO> spColumnInfo;
CComHeapPtr<OLECHAR> spStringsBuffer;
DBORDINAL nColumns = 0;
HRESULT hres = rs.CDynamicAccessor::GetColumnInfo( rs.m_spRowset, &nColumns, &spColumnInfo, &spStringsBuffer );
ATLASSERT( SUCCEEDED( hres ) );
ATLASSERT( col <= nColumns );
DBTYPE wType = spColumnInfo[col-1].wType;
...
}
Альтернативное решение - установить для CDynamicAccessor значение DBBLOBHANDLING_NOSTREAMS, что, как представляется, приводит к гораздо менее сложному коду для обработки загрузки данных (вы можете увидеть это в полном примере кода VS2008).
Тем не менее, я не уверен, почему использование потока является вариантом по умолчанию, и если есть какие-либо недостатки с использованием без потоков.