从一个表里过滤另一个表里的字段. [2004-12-4] [ from 本站原创 ] | ![]() ![]() |
Edit1->Text 是输入一个想要拿来进行对比的表名 Edit3->Text 是对相同的单词记数 Memo1 把比较后相同的单词列表,以识别对错 ADOTable1 指向要对其进行操作的表 ADOTable2 指向要拿来对比的表 最初的写法是: void __fastcall TForm1::Button1Click(TObject *Sender) { ADOTable1->Close(); ADOTable2->Close(); ADOTable2->TableName=Edit1->Text; Form1->Caption="正在检测表"+Edit1->Text; int AA=0; ADOTable1->Open(); ADOTable2->Open(); int ii=ADOTable1->RecordCount; int ij=ADOTable2->RecordCount; ADOTable1->First(); ADOTable2->First(); for(int i11=1;i11<=ii;i11++) { ADOTable1->RecNo=i11; Refresh(); for(int i31=1;i31<=ij;i31++) { ADOTable2->RecNo=i31; Refresh(); if (ADOTable1->FieldByName("英")->AsString==ADOTable2->FieldByName("英")->AsString) { Refresh(); AA==AA++; Edit3->Text=IntToStr(AA); Memo1->Lines->Append(ADOTable1->FieldByName("英")->AsString); Memo1->Lines->Append(ADOTable2->FieldByName("英")->AsString); ADOTable1->Delete(); break; } else { } } } Form1->Caption=Edit1->Text+"表检测结束...."; } 问题分析:执行后重新执行还会发现有相同的字段,这就说明过滤得不干净彻底,想破了头终于想出一个最合理的解释,在对数据进行删除时,也就是执行ADOTable1->Delete();时,程序并没有停止,还在运行,如果删除没有完成就又过滤出新的单词会把ADOTable2的数据指针指向新的相同的字段上,所以就漏掉了一些相同字段,而且在进行删除时改变指针还会引起数据错误,所以总结前因得出解决办法如下: 1.把所有相同字段的指针写入到数组. 2.在检测相同字段结束后执行循环删除,直到数组里的值为空时. 3.这让我有了新的发现,就是如果想实现多线程,数组似乎是最直接的方式,可以实现多线程删除 |