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:关于此问题的其他论坛主题列表:
- Microsoft "Data Platform Development > ADO.NET DataSet" forum
(其他人报告,它也影响服务器 2019)
- Microsoft "Windows Desktop Development > General Windows Desktop Development Issues" forum
- Microsoft "Windows 10 IT Pro > Windows 10 Insider Preview Builds" forum
- Microsoft " Windows Server Windows > Server Insiders" forum
编辑 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)
备注:
- DBTYPE_BSTR不接受字段的大小,所以不完全是varchar
- 我必须使用 DBTYPE_BSTR 关键字,使用 adBSTR 在命令中产生错误消息 (?!)。
正如@Shrikant 所提到的,这已在最近的 windows 更新中修复(版本:1809 OS 构建:17763.475)并确认它已在 1903 中修复。
在我们的 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:关于此问题的其他论坛主题列表:
- Microsoft "Data Platform Development > ADO.NET DataSet" forum
(其他人报告,它也影响服务器 2019) - Microsoft "Windows Desktop Development > General Windows Desktop Development Issues" forum
- Microsoft "Windows 10 IT Pro > Windows 10 Insider Preview Builds" forum
- Microsoft " Windows Server Windows > Server Insiders" forum
编辑 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)
备注:
- DBTYPE_BSTR不接受字段的大小,所以不完全是varchar
- 我必须使用 DBTYPE_BSTR 关键字,使用 adBSTR 在命令中产生错误消息 (?!)。
正如@Shrikant 所提到的,这已在最近的 windows 更新中修复(版本:1809 OS 构建:17763.475)并确认它已在 1903 中修复。