VB6数组和类型不匹配

3
我有一个VB6程序,其中填充了一个二维数组,将该数组传递到COM DLL的一个函数中,然后COM DLL执行VBScript,将该数组分配给VBScript中的变量。
我同意,这听起来很复杂和过时,但我的工作是修复错误,而不是重写大量代码。
在VB6程序和VBScript中,数组变量名为“packageDetails”。在VBScript和VB6中,它被声明为:
dim packageDetails

在VB6和VBScript中,我观察到以下情况:
msgbox isArray(packageDetails) ' True
msgbox ubound(packageDetails, 1) ' 37
msgbox ubound(packageDetails, 2) ' 1

......这是预期的结果。

我有一个由CMS生成的包含10,000条记录的TXT文件。我使用VB6解析TXT文件。对于每个记录,我从TXT文件中解析数据,填充数组“packageDetails”,然后将其传递给我的DLL。其中 9,999 条记录没有错误,但在其中一条记录中出现了以下问题:

在VB6中,packageDetails(3,0) 存储字符串“EA”,这是预期值。但是,在VBScript中当我对同一数组执行 msgbox packageDetails(3,0) 时,会抛出异常并显示“Type mismatch: 'packageDetails'”。

Windows日志/应用程序下的事件查看器没有任何关于此问题的消息。

第一维的最大索引为37,第二维的最大索引为1,为什么在VBScript中使用 (3,0) 会导致类型不匹配的问题,而在VB6中却没有?

该数组是通过读取CMS操作系统生成的文本文件进行填充的。我已经在十六进制编辑器中观察到了该文本文件,并且文件中没有不可打印字符(没有ASCII NUL字节等)。

对于可能导致此问题的原因,您有什么想法吗?


还有其他的错误信息吗?比如事件查看器>应用程序错误。另外,vb6和vbscript中packageDetails的声明是什么? - Mukul Varshney
packageDetails是VB6和VBScript中的一种变量类型。它的声明方式为“dim packageDetails”。我在Windows日志>应用程序下没有看到任何内容。 - Developer Webs
展示一下数组的内容是如何被解析并存储到数组中的。 - derloopkat
@derloopkat 我们分别为每列分配。packageDetails(0, 0) = 'EA',packageDetails(0, 0) = '123',等等。正如所提到的,源数据是由CMS生成的文本文件。该文件是一个固定宽度的文本文件。 - Developer Webs
对不起,我应该在最初的工单中提到这一点。我以为我已经提到了,现在我已经更新了它。我正在通过从固定宽度文本文件中读取来填充数组。文本文件有10,000条记录。其中9,999条记录可以无错误更新,只有一个记录会引起问题。我仔细观察了那个记录,它具有我所期望的正确值。 - Developer Webs
显示剩余11条评论
2个回答

0
解决了。在VB6中创建的原始数组是variant类型。在VB6中,填充数组后我们使用redim添加/删除行。当我们redim时,意外地也使用了"As String()"。在VB6中,红尘之后,索引符号仍然可以正确返回数组中的值。然而,在VBScript中,似乎尝试对以"as string"重新定义大小的数组使用索引符号会导致"type mismatch"错误。当我从VB6的redim中移除"AS String()"时,VBScript不再出现类型不匹配的错误。

干得好,你找到了问题并发布了答案,这样其他人如果遇到同样的问题就可以受益了。我猜测它与数组的声明有关,但没有代码就是纯粹的猜测。不管怎样,干得好。+1 - Zeddy
我还是无法理解你的陈述:“这段代码适用于10,000条记录中的9,999条”。 - deblocker
@deblocker 我使用相同的逻辑处理了10,000条记录,其中9,999条没有错误。我认为只有其中一条使用了reDim。当我更正reDim语句并删除"as string"部分时,就没有错误了。 - Developer Webs

-1

你链接的页面上的第三种方法不使用括号 :) 声明变量的方式并没有错误。dim x 然后稍后执行 redim x(0, 0) 来创建一个数组是有效的。实际上,在我的情况下,这更可取。如果我没有一个或多个记录需要存储,我希望变量为 Empty(我正在通信的 API 需要这种行为)。 - Developer Webs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接