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

时间:2016-08-25 19:26:44

标签: sql ms-access syntax jet parameterized-query

今天在应用程序上处理一些插入/更新查询,并且遇到了我没想到的结果。

查询

我的插入查询看起来与此类似:

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];

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

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

意外结果

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

在大多数情况下,表格都是空的,因此更新只会更新单个记录。

然而我在以前填充的表上运行更新时,发现查询试图更新所有记录,而不仅仅是ID正在更新的记录通过参数提供。

问题是为什么??

1 个答案:

答案 0 :(得分:5)

<强>问题

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

WHERE ID = id;

WHERE ID = ID;

由于ID 总是等于自身,UPDATE尝试更新所有记录,而不是仅使用提供的ID更新预期记录

<强>解决方案

要解决这个问题,我只是在id之前使用正在更新的表的第一个和最后一个字母来更新由ID标识的每个案例。因此,工作代码 - 仅更新已识别的记录 - 是:

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

显然,当我编写查询时,我没有密切关注 - 虽然我为其他参数使用了不同的名称,但是当更新查询的ID时我没有这样做

底线

每当使用参数化查询时,请确保参数名称不要与表格的字段名称匹配。

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

您还需要避免使用表,字段和参数名称的保留字。

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