为啥我不能在 Access 参数查询中使用字段名称作为参数?

Posted

技术标签:

【中文标题】为啥我不能在 Access 参数查询中使用字段名称作为参数?【英文标题】:Why can't I use the field name as a parameter in an Access parameter query?为什么我不能在 Access 参数查询中使用字段名称作为参数? 【发布时间】:2016-08-25 19:26:44 【问题描述】:

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

查询

我的插入查询类似于:

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)

意外结果

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

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

然而当我在之前填充的表上运行更新时,我发现查询正在尝试更新 ALL 记录,而不仅仅是 ID 为通过参数提供。

问题是为什么?

【问题讨论】:

【参考方案1】:

问题

虽然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 时我没有这样做。

底线

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

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

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

希望这可以帮助人们在更新记录时避免可能令人讨厌的意外——或者试图找出他们的参数查询似乎不起作用的原因。

【讨论】:

以上是关于为啥我不能在 Access 参数查询中使用字段名称作为参数?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在两个类型转换字段上连接的 Access 查询中会出现“#Error”的结果?

C#中为啥使用字段封装

access 查询条件 能否用自定义的函数

Access 规定,哪种字段不能出现在查询结果中

Access 2016 - 我可以使用 1 个用户输入的参数来搜索查询中的 2 个字段吗?

如何在 Access 中进行查询将 tempvar 识别为有效字段(参数)