我正在使用CDynamicAccessor连接到MS SQL Server 2005的C ++应用程序。 当我的列是text或ntext时,CDynamicAccessor :: GetColumnType始终返回DBTYPE_IUNKNOWN。我可以将数据绑定为ISequentialStream并读出字节流。但是,如何判断我正在读取的列是text还是ntext,从而将字节流解释为ASCII还是Unicode? p>
答案 0 :(得分:0)
CDynamicAccessor类使用DBTYPE_UNKNOWN覆盖列的原始DBTYPE值。为了获得原始的DBTYPE,我们需要调用GetColumnInfo函数。如何执行此操作的示例是Visual Studio 2008示例中包含的DynamicConsumer示例应用程序:
// 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示例代码中看到这一点)。 但是,我不确定为什么使用流是默认选项,如果使用没有流有任何缺点。