昨天搞了一个小软件,主要分析多对多关系的数据,刚开始一直没有想到办法,后来想到了通过数据库数据读取来循环操作,功能实现了,但是要读取数据库很多次,效率感觉不行,于是又重新想了想,用动态数组的方法来实现,不读写数据库,速度也很快,而且充分发挥了CS客户端的效率,可以交由客户端来完成一些事务处理,这个是BS无法比的,哈哈。现将demo分享一下。
1、两张表,一个是学生信息表UserInfo,一个学科信息Project表
UserInfo信息如下
id, name, myProject
1 tom 1,2,3,4
2 jim 1,3
3 sam 2,4
Project信息如下
id,name
1 math
2 english
3 chinese
4 Japanese
myProject字段信息记录学生的科目信息,现在是需要在listview列表里显示某个学生的科目信息,所学科目打钩。
1、首先将所有科目信息填充到listview,第一列为科目ID
2、取出某学生的学科信息myProject值temp
第一种实现方法,通过数据库循环操作:
for i:=0 to lv_hdtc.Items.Count-1 do
begin
//通过数据循环操作获取相关信息
mysql:='select id from Project where id in ('+temp+')';
with data do
begin
qry_temp.Close;
qry_temp.SQL.Clear;
qry_temp.SQL.Add(mysql);
qry_temp.Open;
for j:=0 to qry_temp.RecordCount-1 do
begin
if Trim(qry_temp.fieldbyname('id').AsString)=lvtxt then
lv_hdtc.Items.Item[i].Checked:=True;
qry_temp.FindNext;
end;
end;
end;
第二种实现方法,使用动态数组:
//mytc: array of string;
i:=0;
SetLength(mytc,Length(temp));
while True do
begin
if Pos(',',temp)>0 then
begin
SplitString(temp,',',l,r);
mytc[i]:=Trim(l);
temp:=Trim(r);
i:=i+1;
end
else
begin
if i=0 then
mytc[0]:=Trim(temp)
else
mytc[i]:=Trim(temp);
Break;
end;
end;
for i:=0 to lv_hdtc.Items.Count-1 do
begin
//通过本地数组格式化进行操作
lvtxt:=Trim(lv_hdtc.Items.Item[i].Caption);
for j:=0 to Length(mytc)-1 do
begin
if Trim(mytc[j])=lvtxt then
lv_hdtc.Items.Item[i].Checked:=True;
end;
end;