对 adNumeric 字段类型执行数字比较时出现 VBScript 运行时错误(类型不匹配)

本文帮助你解决使用 Visual Basic Scripting Edition(VBScript) 对 adNumeric (131) 字段类型执行数字比较或计算时出现的错误(类型不匹配)。

原始产品版本: Visual Basic 脚本
原始 KB 数: 306916

现象

当使用 VBScript 对 adNumeric (131) 字段类型执行数字比较或计算时,可能会收到以下错误消息:

  • 错误消息 1

    Microsoft VBScript 运行时错误 '800a000d'
    类型不匹配

  • 错误消息 2

    Microsoft VBScript 运行时错误 '800a01ca'
    变量使用了 VBScript 不支持的自动化类型

原因

出现这些错误消息是因为 VBScript 无法正确转换 adNumeric 值转换为有效的数字类型。 此为有意行为。

解决方法

您可以使用以下两种可能的解决方法之一:

  • 使用CDbl或者CInt函数来转换adNumeric字段。
  • 使用 JScript,它不会表现出这种行为。

您可以在 Active Server Pages (ASP) 页中或通过简单的 Visual Basic 脚本 (.vbs) 文件复制此行为。 以下步骤演示了如何在简单的 .vbs 文件中复制该问题。

重现行为的步骤 1:创建 Oracle 表

在您的 Oracle 服务器上运行以下脚本以创建示例表:

DROP TABLE Cust;
CREATE TABLE Cust (CustID NUMBER(22,6) PRIMARY KEY, Name VARCHAR2(50));
INSERT INTO Cust VALUES(222,'Kent');
INSERT INTO Cust VALUES(333,'Sally');
COMMIT;

重现行为的步骤 2:创建 VBS 文件

  1. 在记事本中,创建一个名为 Test.vbs 的新文本文档, 并将以下代码粘贴到 test。

    Set oConn = CreateObject("ADODB.Connection")
    oConn.open "Provider=MSDAORA;user id=User;" & _
    "password=password;data source=Oracle816Server;"
    
    set oRS = oConn.Execute("Select CustID FROM Cust")
    MsgBox "Numeric field type is 131." & vbcrlf & _
    "Field Type = " & ors.fields("CustID").type
    
    MsgBox "Numeric field * 100 = " & oRS("CustID") * 100
    MsgBox "Numeric field * 100 = " & cdbl(oRS("Custid")) * 100
    
  2. 修改连接字符串,使其指向您的 Oracle 服务器并提供有效的用户名和密码。

  3. Test.vbs 保存到您的桌面。 您会收到一条警告,更改扩展名可能会使文件不稳定。 单击 “确定” 继续。 如果您没有看到此警告,您需要确保显示的是已知文件类型的扩展名。

  4. 关闭 Test.vbs

  5. 在桌面上,双击 Test.vbs 以运行代码。 您会收到 类型不匹配 的错误信息。

  6. 取消对以下代码行的注释,该代码将 adNumeric 字段转换为双数据类型:

    MsgBox "Numeric field * 100 = " & cdbl(oRS("Custid")) * 100
    
  7. 注释以下代码行:

    MsgBox "Numeric field * 100 = " & oRS("CustID") * 100
    
  8. 关闭并保存 Test.vbs

  9. 在桌面上,双击 Test.vbs 再次运行代码,然后您会收到两个消息框并且没有错误消息。