7

我正在使用 ADO 和“本机”驱动程序之一(例如SQLNCLI, SQLNCLI10SQLNCLI11连接到 SQL Server(而不是旧版SQLOLEDB驱动程序)。

ADO 不理解XML本机驱动程序公开的 SQL Server 数据类型:

field: ADOField;

field := recordset.Fields.Items["SomeXmlColumn"];

尝试访问field.Value会引发EOleException

  • 来源:微软光标引擎
  • 错误代码: 0x80040E21 (E_ITF_0E21)
  • 消息:多步操作生成错误。检查每个状态值

客户端驱动程序(例如SQLNCLI, SQLNCLI10)向 ADOSQLNCLI11呈现Xml数据类型为

field.Type_ = 141 //???

而旧版SQLOLEDB驱动程序向XmlADO 提供一种数据类型为adLongVarWChar,一个 unicode 字符串:

field.Type_ = 203 //adLongVarWChar

其中VARIANT包含的field.Value是 a WideString(技术上称为 a BSTR

TVarData(field.Value).vtype = 8 //VT_BSTR

在我看来,这是 ADO(Windows 7 SP1)中的一个错误,而不是我可以修复的问题。

我该如何解决?

奖金阅读

4

1 回答 1

10

MSDN文档

为了使 ADO 能够使用 SQL Server 最新版本的新功能,对 SQL Server Native Client OLE DB 提供程序进行了一些增强,这些提供程序扩展了 OLE DB 的核心功能。这些增强功能允许 ADO 应用程序使用较新的 SQL Server 功能并使用 SQL Server 2005 中引入的两种数据类型:xmludt。这些增强还利用了对varcharnvarcharvarbinary的增强数据类型。SQL Server Native Client 将 SSPROP_INIT_DATATYPECOMPATIBILITY 初始化属性添加到 DBPROPSET_SQLSERVERDBINIT 属性集以供 ADO 应用程序使用,以便以与 ADO 兼容的方式公开新数据类型。此外,SQL Server Native Client OLE DB 提供程序还定义了一个名为DataTypeCompatibility的新连接字符串关键字,该关键字设置在连接字符串中。

因此,要在 Native Client 中启用新的 SQL Server 功能,您需要在连接字符串中添加以下关键字:

Provider=SQLNCLI11
DataTypeCompatibility=80

其中DataTypeCompatibility

指定要使用的数据类型处理模式。对于提供程序数据类型,识别值为“0”,对于 SQL Server 2000 数据类型,识别值为“80”。

于 2013-10-02T15:24:54.670 回答