使用CDynamicAccessor连接到数据库时如何告诉列是text还是ntext?

时间:2009-08-25 05:08:47

标签: c++ sql-server oledb

我正在使用CDynamicAccessor连接到MS SQL Server 2005的C ++应用程序。 当我的列是text或ntext时,CDynamicAccessor :: GetColumnType始终返回DBTYPE_IUNKNOWN。我可以将数据绑定为ISequentialStream并读出字节流。但是,如何判断我正在读取的列是text还是ntext,从而将字节流解释为ASCII还是Unicode?

1 个答案:

答案 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示例代码中看到这一点)。 但是,我不确定为什么使用流是默认选项,如果使用没有流有任何缺点。