Как определить, является ли столбец текстовым или нетекстовым при подключении к базе данных с помощью CDynamicAccessor? - PullRequest
0 голосов
/ 25 августа 2009

У меня есть приложение C ++, подключающееся к MS SQL Server 2005 с использованием CDynamicAccessor. Когда мой столбец имеет текст или ntext, CDynamicAccessor :: GetColumnType всегда возвращает DBTYPE_IUNKNOWN. Я могу связать данные как ISequentialStream и прочитать поток байтов. Однако как я могу определить, является ли столбец, который я читаю, текстовым или текстовым, и, следовательно, интерпретировать поток байтов как ASCII или Unicode?

1 Ответ

0 голосов
/ 26 августа 2009

Класс 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). Тем не менее, я не уверен, почему использование потока является вариантом по умолчанию, и если есть какие-либо недостатки с использованием без потоков.

...