为什么不能将字段名称用作访问参数查询中的参数?

Why can't I use the field name as a parameter in an Access parameter query?

今天对一个应用程序进行了一些 insert/update 查询,得到了我没有预料到的结果。

查询

我的插入查询与此类似:

PARAMETERS nm TEXT(10), st TEXT(2);
INSERT INTO park(pname, pstate)
VALUES([nm],[st]);

他们的同伴更新是这样的:

PARAMETERS id LONG, nm TEXT(10), st TEXT(2);
UPDATE park
SET
pname = [nm], pstate = [st]
WHERE
ID = [id];

他们正在更新的 table 与此类似:

park
ID LONG  |  pname TEXT(10)  | pstate TEXT(2)

意外结果

通过编写查询,我通过 运行 针对数据库对每个查询进行了测试,并为各种参数提供了测试值。在插入查询之后,我将通过更新新插入的记录来测试更新。

在大多数情况下,table 是空的,因此更新只会更新就地的单个记录。

但是,一旦我运行更新了先前填充的table,我发现查询正在尝试更新 ALL 条记录,而不仅仅是通过参数提供 ID 的记录。

问题是为什么??

问题

虽然 ID 肯定是 park table 中的一个字段,但使用 id 作为参数实质上是在 WHERE 子句中说明以下内容:

WHERE ID = id;

WHERE ID = ID;

因为 ID 总是 等于它自己,UPDATE 试图更新 ALL 记录而不是只有具有提供的 ID 的预期记录。

解决方案

为了解决这个问题,我简单地使用了 table 的第一个和最后一个字母,在 id 之前更新了每个案例,我正在更新由其 ID 标识的记录.所以工作代码 - 只更新识别的记录 - 是:

PARAMETERS pkid LONG, nm TEXT(10), st TEXT(2);
UPDATE park
SET
pname = [nm], pstate = [st]
WHERE
ID = [pkid];

显然,我在编写查询时并没有密切注意——虽然我对其他参数使用了不同的名称,但当涉及到 ID 时,我并没有这样做更新查询。

底线

无论何时使用参数化查询,请确保您的参数名称不要与您的table的字段名称匹配。

这样做可以避免上述问题以及其他相关问题。

您还需要避免在 table、字段和参数名称中使用保留字。

希望这可以帮助某人在更新记录时避免可能令人讨厌的意外——或者试图弄清楚为什么他们的参数查询似乎不起作用。