情况:使用遗留的经典 ASP 代码,尝试将代码库从旧服务器移动到新服务器。
该代码尝试使用 MySQL ODBC 5.1 驱动程序和 ADODB.Connection 对象连接到 Windows 服务器上的 MySQL 数据库。
Connection String = "Driver={MySQL ODBC 5.1 Driver};Server=dbserver;Database=dbname;Uid=username;Password=password;Option=3"
查询结果在 ADODB.RecordSet 对象中返回。 当我尝试访问包含标准 MySQL 整数的字段时,出现以下错误:
Microsoft VBScript runtime error '800a01ca'
Variable uses an Automation type not supported in VBScript
如果我使用 cLng() 手动转换字段,则会消除错误并返回正确的值。但是,手动查找每个对整数的引用并手动转换它的代码太多。
VarType() 对这些值返回 19,这似乎是 VB 无法理解的某种 Long 数据类型。 (See here) ODBC 驱动程序不是应该为长整数返回 VarType 3 吗? (see here)
我尝试在连接字符串的“option=”参数中传递选项 16384 (NO_BIGINT),但没有任何区别。
知道如何纠正这个问题吗?似乎应该有一个选项可以传递给 MySQL ODBC 驱动程序以将 long 作为 Long Integer 数据类型返回,但我找不到它。
在任何人提到之前:是的,我们知道经典 ASP 很糟糕。不,我们现在没有资源将此代码移植到其他地方。目前我们只需要它来继续开发经典 ASP。
最佳答案
通过排除法我终于发现了问题所在。不确定为什么会发生这种情况,但它一定是 MySQL ODBC 驱动程序中的错误。
具有 UNSIGNED 属性的整数字段会导致错误。删除此属性会导致字段值作为标准整数类型返回。显然 ODBC 驱动程序没有正确处理从 unsigned int 到 vbscript Integer 类型的转换,而是返回一个指向 Long 的指针。
我还在我用作 bool 值的tinyint(1) 字段上注意到了这个问题。将数据类型从 tinyint(1) 更改为 int(11) [默认] 也消除了此错误。
希望这对其他人有帮助。仅供引用,我也在 MySQL ODBC 驱动程序论坛中发布了这个问题,但没有人愿意回应。
关于MySQL ODBC 5.1 驱动程序向 ADODB 返回错误的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37032330/