ASP 经典记录集在 MySQL 转换后无法看到具有 'table.column_name' 格式的列

ASP Classic recordset unable to see columns with 'table.column_name' format after MySQL conversion

我目前正在将大量 ASP classic/VBscript 页面从旧数据库 (Unify Dataserver) 转换为 MySQL。

假设您有这样的查询:

sql = "SELECT c.container_type, c_amount, c_sdate, c_edate, csrt " & _
"FROM containers c, container_chars cc"
objRS.Open sql, objConn, 3, 1

如果我想引用列 "c_edate",我可以简单地使用它并且它工作正常:

x = objRS("c_edate")

但是,当涉及到引用像 "c.container_type" 这样的列时(使用 . 将其与另一个 table 区分开来,例如:

x = objRS("c.container_type")

它会说

ADODB.Recordset error '800a0cc1'

Item cannot be found in the collection corresponding to the requested name or ordinal.

我可以改用数字来修复它:

objRS(0)

在我们切换到 MySQL 之前,这从来都不是问题。在我们的旧数据库中,使用 rs(table.column_name) 格式工作得很好。但是在 MySQL 中,一旦您在代码中添加 (.),除非您将其切换为数字,否则它无法找到该项目。

正如您所想象的,每次引用查询中的某些内容时,我手动浏览该网站的 700 多页,手动计算每一列在相应 select 语句中的位置,这非常痛苦.

有谁知道为什么会这样,或者如何使 rs(table.column_name) 格式与 MySQL 一起使用,就像它与我们的旧数据库一样?

在 SQL 服务器中,显然在 MySQL 中也是如此,在结果集中引用字段的方法是只使用名称,不带前缀。

x = objRS("container_type")

数据库需要前缀来区分同名列,但一旦将结果发送到记录集,该记录集就不知道也不关心列的来源。

别名也是如此:

SQL = "SELECT c.container_type AS ctype, [...]"
...
x = objRS("ctype")

结合这两个事实,如果您 在结果集中有同名的列,您必须至少为其中之一设置别名。如果不这样做,它不一定会出错,但您将无法使用 rs("name") 语法引用第二列。

SQL = "SELECT c1.container_type, c2.container_type AS c_type2, ..."
...
x = objRS("container_type")
y = objRS("c_type2")

[请注意,当您使用它时,您可能还应该修改 FROM 子句以使用正确的 FROM table1 INNER JOIN table2 ON table1.fieldA = table2.fieldB 类型语法。 FROM table1, table2 WHERE table1.fieldA = table2.fieldB 语法已被弃用多年。]