如何删除数据库中满足条件的多条记录?

jeffbee 2002-04-29 11:30:24
table中删除一条记录后,数据库指针指向何处???

假设下面程序:
table1.first;
while (not table1.eof) do
if (table1[‘列名’] = 值) then
table1.delete
else
table1.next;
又假设数据库中有连续3条记录满足条件。执行完上述代码后,发现
只删除了满足条件的第一条记录,这是什么原因????
...全文
456 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
fdian 2002-04-29
  • 打赏
  • 举报
回复
table1.first;
while (not table1.eof) do
begin
if (table1[‘列名’] = 值) then
table1.delete
table1.next;
end;
这样就可以了
fdian 2002-04-29
  • 打赏
  • 举报
回复
你可以向下面一样进行删除,你看下就可以明白了
哈哈
With Qry_tmp do
begin
Sql.Clear;
Sql.Add('Delete from tb_zl_cmzmx');
Sql.Add('Where cmzbh='+''''+Tb_cmz.fieldbyname('cmzbh').asstring+'''');
Execsql;
end;
当然也可以有table进行删除,前面的大虾已经说我 这样也可以的
naughtyboy 2002-04-29
  • 打赏
  • 举报
回复
同意
如果有相同的记录
在delete后面加table。next就行了
andylife 2002-04-29
  • 打赏
  • 举报
回复
为何不用Query 来做呢?

我试过你了以上的代码,是没有问题的

我删除了全部满足条件的记录啊

看看你数据库里面的值是不是和条件值不同,如多了个 空格
tomjoule 2002-04-29
  • 打赏
  • 举报
回复
table1.next放在table1.delete后
liubat 2002-04-29
  • 打赏
  • 举报
回复
删除后,指向下一条记录
ahuige 2002-04-29
  • 打赏
  • 举报
回复
四个''''只表示一个',前后两个'表示它们之间的东西是字符,中间的两个''表示一个'。所以,实际上最后只得一个'
Sql.Add('Where cmzbh='+''''+Tb_cmz.fieldbyname('cmzbh').asstring+'''');
最后等于Where cmzbh='@',这里@表示Tb_cmz.fieldbyname('cmzbh').asstring
的实际值
LYSSHE 2002-04-29
  • 打赏
  • 举报
回复
为何使用四个单引号来括住一个表达式呢?
有谁能解答这个问题吗?
以前用VB时还可以理解,但现在Delphi使用单引号就不是那么好理解了
例如 未日所写的这一句:
Sql.Add('Where cmzbh='+''''+Tb_cmz.fieldbyname('cmzbh').asstring+'''');
最终在的合并为什么样子的一条sql呢?
tantorplayer 2002-04-29
  • 打赏
  • 举报
回复
如果是sql server或者sybase,可以用触发器,比较简单,也很有效。
DarkXie 2002-04-29
  • 打赏
  • 举报
回复
我支持用QUERY,因为那样最简单而且,不会出错
如果有必要的话,可以用存储过程啊,也是不错的选择
TABLE最好不要用,删除多条前,你必须要过滤记录,否则你删除了有用的信息你还不知道,而且用TABLE过滤的话,数据量大会很慢!
liangzongqiang 2002-04-29
  • 打赏
  • 举报
回复
用TQuery的SQL:
Delete from 表名 where 条件
执行TQuery的SQL命令:
Query1.execsql
yuanjunjing 2002-04-29
  • 打赏
  • 举报
回复
FirmDiamond(FirmDiamond) :你这样会漏一条。

table1.first;
while (not table1.eof) do
if (table1[‘列名’] = 值) then
table1.delete
else
table1.next;
代码没错,一定是条件不满足,你一步步调试一下就知道了。
FirmDiamond 2002-04-29
  • 打赏
  • 举报
回复
用query删除了能效率好一点,
如果一定要这样的话
可以把 ‘else’ 去掉

table1.first;
while (not table1.eof) do
begin
if (table1[‘列名’] = 值) then
table1.delete;
table1.next;
end;

天行归来 2002-04-29
  • 打赏
  • 举报
回复
你的做法是真确的吧,有时候如果想直接在记录集中把记录删除,可以直接用记录集合 DataSet.delete,因为删除之后,记录指针会自动往下移动的,不能在删除之后在 DataSet.Next。出错的原因或许是其他导致,我是用TADODataSet实现这种操作,不过原理和你的一样。
jeffbee 2002-04-29
  • 打赏
  • 举报
回复
to 猫王:
还是只能删除第一条记录。数据库里面的值和条件值相同。我想我的代码应该是没有问题的,但是结果却出呼我的意料。我知道用query做方便些,但我现在已经不能再改了,时间上来不及了。


to tomjoule() :
你那样做将会漏掉一些记录。因为delete以后指针已经向下移了一位了。




luoshumeng 2002-04-29
  • 打赏
  • 举报
回复
我支持用query删除!!!!!!!!!!!!!
mars_han 2002-04-29
  • 打赏
  • 举报
回复
tomjoule() 做得很好。但我支持用query控件。
tomjoule 2002-04-29
  • 打赏
  • 举报
回复
补充
table1.first;
while (not table1.eof) do
begin
if (table1[‘列名’] = 值) then
begin
table1.delete
table1.next;
end
else
table1.next;
end;

2,496

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧