我正在使用CDynamicAccessor连接到MS SQL Server 2005的C++应用程序。
当我的列是text或ntext时,CDynamicAccessor::GetColumnType总是返回DBTYPE_IUNKNOWN。我可以将数据绑定(bind)为ISequentialStream并读取字节流。但是,如何判断我正在读取的列是text还是ntext,从而将字节流解释为ASCII还是Unicode?
最佳答案
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示例代码中看到)。
但是,我不确定为什么使用流是默认选项,以及不使用流是否有任何缺点。