我正在使用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示例代码中看到)。
但是,我不确定为什么使用流是默认选项,以及不使用流是否有任何缺点。

09-05 01:12