MSDataShape 错误,升级到 Windows 10 功能更新 1809 时损坏

MSDataShape error, broken on upgrade to Windows 10 Feature Update 1809

在我们的 VB6 应用程序中,我们使用 ADODB.Recordsets 并利用 MSDataShape 的数据提供程序使用 SHAPE 命令创建关系记录集。

在最新的 Windows 10 功能 (1809) 中,我们的代码因以下错误而中断:-

"-2147217900 Length of NEW column SiteCode cannot be zero"

来自 excel 中的以下宏(其中 MDAC 是参考)

Public Sub TestRun()
    Dim rsStockCheck As Recordset

    On Error GoTo ErrorHandler

    ' set up shape recordset
    Set rsStockCheck = New Recordset
    With rsStockCheck
        .ActiveConnection = "Provider=MSDataShape;Data Provider=None"
        .CursorLocation = adUseClient
        .CursorType = adOpenStatic
        .LockType = adLockBatchOptimistic
        .Open "SHAPE APPEND new adInteger as StockCheckID, new adInteger as SiteID, new adVarChar(8) as SiteCode"
        .ActiveConnection = Nothing
    End With

ErrorHandler:
    If Err.Number <> 0 Then
        MsgBox "failed: " & Err.Description
    Else
        MsgBox "works ok"
    End If

    Set rsStockCheck = Nothing
End Sub

这可能与此最终被删除有关 as mentioned here

...但我不确定是不是现在。有人遇到过这个问题吗?


编辑:我已经在升级的机器和全新安装的 1809 上试过这个,但两者都坏了。


编辑 2:关于此问题的其他论坛主题列表:

编辑 3:Windows 1809 的最新 11 月 13 日更新,仍未解决此问题。 然而,对于解决方法,

我也遇到同样的问题...不过,我已经找到解决此问题的方法... 用 adLongVarChar 替换 adVarChar(##) 为我完成了这项工作 ...

如有其他解决方案请回复

已编辑: 此解决方法不适用于

等查询
SHAPE APPEND NEW adLongVarChar As INVNO, NEW adLongVarChar As iCP,
((SHAPE APPEND NEW aadLongVarChar As INVNO,NEW adLongVarCharAs iCP,NEW adLongVarChar As F1,NEW adLongVarChar As F2,NEW adLongVarChar As F3)
AS Trans RELATE INVNO TO INVNO,iCP TO iCP)

寻找解决此问题的方法

编辑:此错误已在最近的 windows 更新中修复(版本:1809 OS 构建:17763.475)。 对我来说一切正常。

虽然这不能直接回答您的问题,但 MSDataShape 已过时并被删除。

建议您将查询移植到 FROM XML 并更改您的客户端以使用 SAX 或拉式解析器解析响应。

似乎要将 SHAPE APPEND new adVarChar(8) as SiteCode 更改为 SHAPE APPEND new adLongVarChar as SiteCode 导致 SiteCode 不能作为排序键。

不过 SHAPE APPEND new adLongVarChar as SiteCode,calc(Left$(SiteCode,8)) as SiteCode_Calc 中的 SiteCode_Calc 似乎可以作为排序键。

然而,当获得 SiteCode_Calc 的值时,MoveNext/EOF 似乎无法正常工作。

我找到了适用于所有情况的解决方案。

使用 OLEDB 数据类型 DBTYPE_BSTR 而不是 adVarChar(size)。例如,改为:

SHAPE APPEND NEW adVarChar(8) As INVNO, NEW adVarChar(8) As iCP,
((SHAPE APPEND NEW adVarChar(8) As INVNO,NEW adVarChar(8) As iCP...)
AS Trans RELATE INVNO TO INVNO,iCP TO iCP)

写:

SHAPE APPEND NEW DBTYPE_BSTR As INVNO, NEW DBTYPE_BSTR As iCP,
((SHAPE APPEND NEW DBTYPE_BSTR As INVNO,NEW DBTYPE_BSTR As iCP...)
AS Trans RELATE INVNO TO INVNO,iCP TO iCP)

备注:

  1. DBTYPE_BSTR不接受字段的大小,所以不完全是varchar
  2. 我必须使用 DBTYPE_BSTR 关键字,使用 adBSTR 在命令中产生错误消息 (?!)。

正如@Shrikant 所提到的,这已在最近的 windows 更新中修复(版本:1809 OS 构建:17763.475)并确认它已在 1903 中修复。