从一个表里过滤另一个表里的字段. [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.这让我有了新的发现,就是如果想实现多线程,数组似乎是最直接的方式,可以实现多线程删除