Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为什么可以';我是否在Access参数查询中将字段名用作参数?_Sql_Ms Access_Syntax_Jet_Parameterized Query - Fatal编程技术网

Sql 为什么可以';我是否在Access参数查询中将字段名用作参数?

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

今天在一个应用程序上执行一些插入/更新查询,结果出乎意料

查询

我的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 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
,我没有这样做

底线

无论何时处理参数化查询,请确保参数名与表的字段名不匹配

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

您还需要避免为表、字段和参数名保留字

希望这有助于人们在更新记录时避免可能令人不快的意外,或者试图找出他们的参数查询似乎不起作用的原因