为啥我不能在 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”的结果?