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的记录.
问题是为什么??
问题
虽然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在更新查询时我并没有这样做.
底线
每当使用参数化查询时,请确保您的参数名称与表的字段名称不匹配.
这样做可以避免上述问题以及其他相关问题.
您还需要避免使用表,字段和参数名称的保留字.
希望这有助于有人在更新记录时避免可能令人讨厌的意外 - 或者试图弄清楚为什么他们的参数查询似乎不起作用.
| 归档时间: |
|
| 查看次数: |
483 次 |
| 最近记录: |