ADO无法使用本机客户端(SQLNCLI)访问SQL Server XML类型列

Ian*_*oyd 7 xml delphi sql-server-2005 ado delphi-5

我使用ADO和一个"原生"的驱动程序(例如SQLNCLI,SQLNCLI10,SQLNCLI11),以连接到SQL Server(而不是传统SQLOLEDB驱动程序).

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

field: ADOField;

field := recordset.Fields.Items["SomeXmlColumn"];
Run Code Online (Sandbox Code Playgroud)

试图访问field.Value投掷EOleException:

  • 来源: Microsoft Cursor Engine
  • ErrorCode: 0x80040E21(E_ITF_0E21)
  • 消息:多步操作生成错误.检查每个状态值

所述本地客户端驱动程序(例如SQLNCLI,SQLNCLI10,SQLNCLI11)呈现Xml数据类型ADO作为

field.Type_ = 141 //???
Run Code Online (Sandbox Code Playgroud)

旧版SQLOLEDB驱动程序将Xml数据类型作为adLongVarWChar呈现给ADO ,这是一个unicode字符串:

field.Type_ = 203 //adLongVarWChar
Run Code Online (Sandbox Code Playgroud)

VARIANT包含的field.ValueWideString(技术上称为a BSTR):

TVarData(field.Value).vtype = 8 //VT_BSTR
Run Code Online (Sandbox Code Playgroud)

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

我该如何解决?

奖金阅读

RRU*_*RUZ 10

MSDN文档说:

为了使ADO能够使用最新版本的SQL Server的新功能,对SQL Server Native Client OLE DB提供程序进行了一些增强,扩展了OLE DB的核心功能.这些增强功能允许ADO应用程序使用较新的SQL Server功能并使用SQL Server 2005中引入的两种数据类型:xmludt.这些增强功能还利用了varchar, nvarchar varbinary的数据类型.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
Run Code Online (Sandbox Code Playgroud)

其中DataTypeCompatibility:

指定要使用的数据类型处理模式.提供者数据类型的识别值为"0",SQL Server 2000数据类型的识别值为"80".