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

NWd*_*dev 0 sql syntax ms-access jet parameterized-query

今天在应用程序上完成一些插入/更新查询并遇到了我没想到的结果.

查询

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

PARAMETERS nm TEXT(10), st TEXT(2);
INSERT INTO park(pname, pstate)
VALUES([nm],[st]);
Run Code Online (Sandbox Code Playgroud)

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

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

他们更新的表与此类似:

park
ID LONG  |  pname TEXT(10)  | pstate TEXT(2)
Run Code Online (Sandbox Code Playgroud)

意外结果

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

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

但是,只要我在先前填充的表上运行更新,我就发现查询正在尝试更新所有记录,而不仅仅是通过参数提供其ID的记录.

问题是为什么??

NWd*_*dev 5

问题

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

WHERE ID = id;
Run Code Online (Sandbox Code Playgroud)

要么

WHERE ID = ID;
Run Code Online (Sandbox Code Playgroud)

由于ID总是等于本身,UPDATE试图更新所有记录,而不是只与所提供的ID预期的记录.

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

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

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

底线

每当使用参数化查询时,请确保您的参数名称与表的字段名称匹配.

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

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

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