gpt4 book ai didi

c++ - 使用 CDynamicAccessor 连接到数据库时如何判断列是文本还是 ntext?

转载 作者:太空宇宙 更新时间:2023-11-04 12:27:35 26 4
gpt4 key购买 nike

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

关于c++ - 使用 CDynamicAccessor 连接到数据库时如何判断列是文本还是 ntext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1326163/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com