MSDatashape 被弃用

MSDatashape being deprecated

在以下微软文档中:-

https://docs.microsoft.com/en-us/sql/ado/guide/appendixes/microsoft-data-shaping-service-for-ole-db-ado-service-provider?view=sql-server-2017

正在删除此功能,建议使用 XML。有没有人这样做过?我想知道它们是什么意思,就使用 XML 加载 MSDataShape 的结构而言,还是仅使用 XML 个对象?

TIA

我相信这是指 T-SQL 的 FOR XML 子句,它执行与 MSDataShape 相同的工作,因为它 returns 分层嵌套数据。

将您的 MSDataShape 查询移植到 FOR XML 查询并更改客户端以解析结果而不是使用 MSDataShape OLEDB 提供程序。

在客户端,SAX 或拉式解析最适合移植以前使用 MSDataShape 的代码(它也有一个基于移动记录游标的模型)。

这是我的一些有用的代码。我的 MSDataShape 代码仍然有效,因此我建议使用它来生成您的 XML 作为模板,然后使用它继续加载它们:-

Dim objShapeMaker   As clsShapeMaker
Dim rsoTemp         As ADODB.Recordset
Dim strXMLTemplate  As String

' Template file
strXMLTemplate = "C:\Temp\Template_GI.xml"

' Create the MSDataShape and save it to XML
Set rsoTemp = objShapeMaker.CreateGI()
rsoTemp.Save strXMLTemplate, adPersistXML

' Now we have the XML in a file going forward, load it in my recordset
Set rsoTemp = New ADODB.Recordset
rsoTemp.Open strXMLTemplate, , , , adCmdFile

' Cleanup
Set rsoTemp = Nothing
Set objShapeMaker = Nothing

如果您不喜欢生成 XML 模板文件进行维护的想法,您可以通过 .NET 执行此操作并将其公开给 COM 以在您的 VB6/VBA 应用程序中使用,如前所述 here.

我制作了一个 .NET 应用程序,它可以从简单的代码行生成这些 XML 文件,如果任何人想要继续前进,它类似于列出的博客,但是它处理具有关系的子记录集。

编辑 1:如果您在不返回数据的情况下设置了架构,这将非常有用。据我所知,为了有效地填充这些,最好先编写代码来加载结构,然后再从单独的记录集中填充它(这样更慢!)

编辑 2:这是我们在 .NET Interop 中进行替换所采用的方法。最初考虑从 SQL 引入 XML 并根据需要解析它。这可以买回一个 DataSet 并且也被解析到目标记录集中,但是结果数据集中的表之间的关系需要在代码中设置而不是 T-SQL 中的一个地方 XML 输出.