MySQL ODBC 5.1 驱动程序向 ADODB 返回错误的数据类型

标签 mysql asp-classic odbc type-conversion

情况:使用遗留的经典 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/

相关文章:

asp-classic - IE7 经典 ASP 缓存

经典 ASP 中的 VBScript

ruby - 与 ruby​​ 的简单远程 ODBC 数据库连接

MySQL DataConnections 未关闭/合并

java - 使用play-framework 2.5连接MySQL数据库

PHP PDO 更新有 2 个表

php - 为 cronjobs 使用单独的网络服务器,也是 : MySQL concurrent connections from 2 different servers

php - 查询成员(member)姓名和分数

mysql - 如何同时上传文件和插入语句到数据库

mysql - SSIS ODBC 源未在 SQL Server 代理作业中保存密码