Sql 为什么可以';我是否在Access参数查询中将字段名用作参数?
今天在一个应用程序上执行一些插入/更新查询,结果出乎意料 查询 我的insert查询与此类似:Sql 为什么可以';我是否在Access参数查询中将字段名用作参数?,sql,ms-access,syntax,jet,parameterized-query,Sql,Ms Access,Syntax,Jet,Parameterized Query,今天在一个应用程序上执行一些插入/更新查询,结果出乎意料 查询 我的insert查询与此类似: PARAMETERS nm TEXT(10), st TEXT(2); INSERT INTO park(pname, pstate) VALUES([nm],[st]); park ID LONG | pname TEXT(10) | pstate TEXT(2) 他们的配套更新如下: PARAMETERS id LONG, nm TEXT(10), st TEXT(2); UPDATE
PARAMETERS nm TEXT(10), st TEXT(2);
INSERT INTO park(pname, pstate)
VALUES([nm],[st]);
park
ID LONG | pname TEXT(10) | pstate TEXT(2)
他们的配套更新如下:
PARAMETERS id LONG, nm TEXT(10), st TEXT(2);
UPDATE park
SET
pname = [nm], pstate = [st]
WHERE
ID = [id];
他们正在更新的表与此类似:
PARAMETERS nm TEXT(10), st TEXT(2);
INSERT INTO park(pname, pstate)
VALUES([nm],[st]);
park
ID LONG | pname TEXT(10) | pstate TEXT(2)
意外结果
通过编写查询,我通过在数据库中运行查询并为各种参数提供测试值来测试每个查询。在插入查询之后,我将通过更新新插入的记录来测试更新
在大多数情况下,表都是空的,因此更新只需就地更新单个记录
但是,当我对以前填充的表运行更新时,我发现查询正在尝试更新所有记录,而不仅仅是通过参数提供ID的记录
问题是为什么?问题 虽然
ID
肯定是park
表中的一个字段,但使用ID
作为参数基本上是在WHERE
子句中说明以下内容:
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
,我没有这样做
底线
无论何时处理参数化查询,请确保参数名与表的字段名不匹配
这样做将避免上述问题以及其他相关问题
您还需要避免为表、字段和参数名保留字
希望这有助于人们在更新记录时避免可能令人不快的意外,或者试图找出他们的参数查询似乎不起作用的原因。问题 虽然
ID
肯定是park
表中的一个字段,但使用ID
作为参数基本上是在WHERE
子句中说明以下内容:
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
,我没有这样做
底线
无论何时处理参数化查询,请确保参数名与表的字段名不匹配
这样做将避免上述问题以及其他相关问题
您还需要避免为表、字段和参数名保留字
希望这有助于人们在更新记录时避免可能令人不快的意外,或者试图找出他们的参数查询似乎不起作用的原因