影響clientdataset處理速度的乙個因素
tclientdataset是delphi開發資料庫時乙個非常好的控制項。有很強大的功能。
我常常用clientdataset做memorydataset來使用。還可以將clientdataset的資料儲存為xml,這樣就可以做簡單的本地資料庫使用。還有很多功能就不多說了。在使用clientdataset的過程中關於怎樣提高處理速度這個問題,我就我個人的一點點體會和大家分享一下。
通常情況下我們一般都是用
...clientdataset-->datasource-->dbcomponent
這樣的結構,處理資料的時候就直接操作clientdataset。但是大多dbcomponet都會立即響應clientdataset的變化。如果你是向clientdataset中插入很多資料時候,dbcomponent就要響應幾次,而且響應過程根據不同的控制項,速度,過程數量都不一樣。這樣就影響了程式的執行效率。所以在對clientdataset處理中,我是用clientdataset.disablecontrols和clientdataset.enablecontrols方法:開啟和關閉dbcomponent與clientdataset的資料顯示關係。
例如:clientdataset..disablecontrols;
...for i := 0 to 10000 do
begin
...clientdataset.post;
end;
...clientdataset.enablecontrols
...這樣做以後你會發現處理速度比以前沒有使用方法的時候有成倍的提高。
clientdataset的資料查詢。
我所介紹的心得和技巧都是用clientdataset來做範例,也可以應用於其他的一些dataset。廢話就不多說了。我們還是先看**,讓後再總結。
1.scanning 掃瞄資料查詢
這是最簡單最直接也是最慢的一種方法,遍歷所有資料:
procedure
tform1
.scanbtnclick(sender: tobject);
varfound: boolean;
begin
found := false;
clientdataset1
.disablecontrols;
start;
tryclientdataset1
.first;
while
notclientdataset1
.eof
dobegin
ifclientdataset1
.fields[fieldlistcombobox
.itemindex].value = searchtext
then
begin
found := true;
break;
end;
clientdataset1
.next;
end;
done;
finally
clientdataset1
.enablecontrols;
end;
iffound
then
showmessage(searchtext +
' found at record '
+ inttostr(clientdataset1
.recno))
else
showmessage(scanforedit
.text +
' not found'
);
end;
2.finding 尋找資料
最老,但是最快的查詢方式。
使用findkey/findnearest來查詢一條或多條符合條件的資料,當然待查詢的field必須是乙個indexfield。可以看出,這種基於index的查詢速度是非常快的。
procedure
tform1
.findkeybtnclick(sender: tobject);
begin
start;
ifclientdataset1
.findkey([searchtext])
then
begin
done;
statusbar1
.panels[
3].text := searchtext +
' found at record '
+ inttostr(clientdataset1
.recno);
endelse
begin
done;
statusbar1
.panels[
3].text := searchtext +
' not found'
; end
; end
; procedure
tform1
.findnearestbtnclick(sender: tobject);
begin
start;
clientdataset1
.findnearest([searchtext]);
done;
statusbar1
.panels[
3].text :=
'the nearest match to '
+ searchtext +
' found at record '
+ inttostr(clientdataset1
.recno);
end3.going 定位
gotokey/gotonearest 與findkey/findnearest基本上沒有什麼區別。它也是基於index的查詢。唯一的區別就是在於你是怎麼定義你的查詢了。**上也有區別:
clientdataset1.setkey;
clientdataset1.fieldbyname(indexfieldname).value := searchtext;
clientdataset1.gotokey;
就相當於
clientdataset1.findkey([searchtext]);
要用好這兩種基於index的查詢,還需要了解clientdataset和index機制。這裡就不詳細說明index機制。乙個基本的原則,要有index,才能查詢。
4.locating 查詢資料
2,3兩種查詢方式都是基於index的,但是在實際應用中,可能會查詢indexfield以外的field。那我們就可以使用locate。但是查詢速度是沒有2,3兩種快的。比如:如果你查詢一條紀錄9000/10000,locate需要500ms,scanning需要》2s,findkey只要10ms(但是當你開啟clientdata的時候,建立index需要1s)。
procedure
tform1.locatebtnclick(sender:
tobject);
begin
start;
ifclientdataset1.locate(
'field1,field2..'
,vararrayof[
'value1,value2..'
], )
then
begin
done;
statusbar1.panels[
3].text :=
'match located at record '
+ inttostr(clientdataset1.recno);
endelse
begin
done;
statusbar1.panels[
3].text :=
'no match located'
;end
;end
;clientdataset提供了好多種查詢資料的方法。但是各自有其優缺點。
scanning最簡單,但是最慢,因為比較慢,還得使用clientdataset.disablecontrols和clientdataset.enablecontrols方法(我在前面一片文章講過)。
findkey/findnearest(gotokey/gotonearest)**多,但是非常快。必須使用index,不同的是find需要的index是必須建立好的,而goto可以在第一次使用時建立index。
locate使用最方便,不需要index,但是速度沒有find快。
varsfields : string;
vresult : variant;
icount : integer;
begin
vresult := ds.lookup(
'fieldnamea, fieldnameb'
, vararraycreate([valuea, valueb], varvariant),
'fieldname1, fieldname2'
);if
(varisarray(vresult))
then
begin
sfields := '';
foricount := vararraylowbound(vresult, 1)
tovararrayhighbound(vresult, 1)
dobegin
sfields := sfields +
';'+ vresult[icount];
end;
endelse
edtreturn.text := vresult;
end;
ClientDataSet使用心得和技巧
clientdataset使用心得和技巧 影響clientdataset處理速度的乙個因素 tclientdataset是delphi開發資料庫時乙個非常好的控制項。有很強大的功能。我常常用clientdataset做memorydataset來使用。還可以將clientdataset的資料儲存為x...
ClientDataSet使用心得和技巧
影響clientdataset處理速度的乙個因素 tclientdataset是delphi開發資料庫時乙個非常好的控制項。有很強大的功能。我常常用clientdataset做memorydataset來使用。還可以將clientdataset的資料儲存為xml 這樣就可以做簡單的本地資料庫使用。還...
使用GraphEdit使用
1 註冊元件。其實乙個filter就是乙個com元件,所以使用之前需要註冊,可以有兩種方法對元件進行註冊。1.直接使用命令。命令列下輸入 regsvr32 hqtlystd.ax 編譯之後你會在工程目錄下的debug中找到hqtlystd.ax,這個就是要用的filter 即可註冊成功。2.vc6....