導航:首頁 > 凈水問答 > clientdateset過濾條件

clientdateset過濾條件

發布時間:2022-05-03 08:36:35

① delphi中ClientDataSet是什麼東西、

與TTable、TQuery一樣,TClientDataSet也是從TDataSet繼承下來的,它通常用於多層體系結構的客戶端。很多資料庫應用程序都用了BDE,BDE往往給發布帶來很大的不便,因而TClientDataSet最大的特點是它不依賴於BDE(Borland Database Engine),但它需要一個動態鏈接庫的支持,這個動態鏈接庫叫DBCLIENT.DLL。在客戶端,也不需要用TDatabase構件,因為客戶端並不直接連接資料庫。由於TClientDataSet是從TDataSet繼承下來的,所以,它支持諸如編輯、搜索、瀏覽、糾錯、過濾等功能。由於 TClientDataSet在內存中建立了數據的本地副本,上述操作的執行速度很快。也正是由於TClientDataSet並不直接連接資料庫,因此,客戶程序必須提供獲取數據的機制。
希望對你有幫助

② tclientdataset怎麼展示數據

你好!直接對Data屬性賦值
前面講過,客戶程序既可以通過IProvider介面獲取數據,也可以從另一個數據集獲取數據,後者就是通過Data屬性賦值的。程序示例如下:
ClientDataSet1.Data := ClientDataSet2.Data;
一旦Data被賦值,就可以用標準的數據控制項顯示這些數據。
注意:當從另一個數據集獲取數據時,另一個數據集的日誌也將被復制過來,但不包括原來的范圍和過濾條件。
如果要從另一個基於BDE的數據集中獲取數據,可以通過數據集構件的Provider屬性,程序示例如下:
ClientDataSet1.Data := Table1.Provider.Data;
如果要從一個自定義的數據集獲取數據,首先要創建一個臨時的TProvider構件,然後設置其DataSet屬性指定這個自定義的數據集。程序示例如下:
TempProvider := TDataSetProvider.Create(Form1);
TempProvider.DataSet := SourceDataSet;
ClientDataSet1.Data := TempProvider.Data;
TempProvider.Free;
直接對Data屬性賦值
客戶程序既可以通過IProvider介面獲取數據,也可以從另一個數據集獲取數據,後者就是通過Data屬性賦值的。程序示例如下:
ClientDataSet1.Data := ClientDataSet2.Data;
一旦Data被賦值,就可以用標準的數據控制項顯示這些數據。
注意:當從另一個數據集獲取數據時,另一個數據集的日誌也將被復制過來,但不包括原來的范圍和過濾條件。
如果要從另一個基於BDE的數據集中獲取數據,可以通過數據集構件的Provider屬性,程序示例如下:
ClientDataSet1.Data := Table1.Provider.Data;
如果要從一個自定義的數據集獲取數據,首先要創建一個臨時的TProvider構件,然後設置其DataSet屬性指定這個自定義的數據集。程序示例如下:
TempProvider := TDataSetProvider.Create(Form1);
TempProvider.DataSet := SourceDataSet;
ClientDataSet1.Data := TempProvider.Data;
TempProvider.Free;

謝謝!

③ delphi clientdataset多少數據

Delphi做為一個快速應用開發工具,深受程序員的喜愛。其強大的組件功能,讓程序員能夠輕松、高效地完成常見的界面開發、資料庫應用等功能。然而,幫助的相對缺乏,使得許多組件的功能並不為人們正確地使用,究其原因,仍然是認識上的問題。對於MIDAS開發中的核心部件,TClientDataSet 和TDataSetProvider,由於資料的缺乏,人們在網上大多談論的是李維的書籍內容。我有幸在BDN上見到了Cary Jensen的Professional Developer系列文章,詳細闡述了DELPHI的資料庫開發技術。現節選出其中的ClientDataSet部分,與大家共同分享。
ClientDataSet是一個功能強大的類,通過在內存中模擬表格,實現了其它數據集組件所不具備的強大功能。以往只在Delphi和C++ Builder企業版中才提供這個組件,如今,Borland的全部產品(包括最新的Kylix)都集成了TClientDataSet組件。
TClientDataSet從類的繼承關繫上來看,是TDataSet這個抽象類的子類,所以我們可以在TDataSet這個抽象層次上對其進行我們熟悉的操作,比如導航、排序、過濾、編輯。要注意的是,TClientDataSet使用了一種全新的技術,它將所有的數據均放在內存中,所以 TClientDataSet是個只存在內存中的「虛擬表」,因此對資料庫的操作是非常快的。在PIII 850,512MB的機器上對十萬條記錄進行建索引的操作,花費的時間少於半分鍾。
與一般的數據集組件不同,TClientDataSet使用的技術比較特別,本著高速度、低存儲需求的原則,TClientDataSet的內部使用了兩個數據存儲源。第一個是其Data屬性,這是當前內存數據的視圖,反映了所有的數據改變。如果用戶從數據中刪除一條記錄,則此記錄將從Data中消失,相應地,加入一條新記錄後,此記錄便存在Data屬性中了。
另一個數據源是Delta屬性,故名思義,即增量的意思,這個屬性反映了對數據的改變。無論是向Data屬性新增還是刪除記錄,都會在Delta中記錄下來,如果是修改了Data中的記錄,則會在Delta保存兩條相應的記錄,一條是原始記錄,另一條僅包含修改的欄位值。正因為Delta的存在和 TClientDataSet在內存中記錄數據的特點,所有的改變都沒有立即更新加對應的物理存儲中,可以根據這些信息在適當的時候恢復,所以 TClientDataSet天生具有緩沖更新功能。
為了使數據更新回數據存儲源,我們要調用TClientDataSet中對應的方法。如果ClientDataSet與 DataSetProvider關聯,那麼僅需調用TClientDataSet的ApplyUpdates方法即可保存數據的更新,但如果 TClientDataSet沒有對應的TDataSetProvider存在,而是直接同文件關聯,那麼,這種方式是非常有趣的,我們在 BriefCase模型中會再次講解這個問題。此時,如果使用TClientDataSet的SaveToFile和LoadFromFile,都會保留著Delta。調用MergeChangeLog和ClearChanges後,Delta的內容才會被
清空。只是前者是將Delta的數據同Data結合起來,將改變存儲到物理介質上,而ClearChanges則是一股腦兒全部清空,將數據回復到原始狀態。大部分的應用都是將TClientDataSet與TDataSetProvider結合使用的。兩者聯合使用的行為反映了Borland的設計宗旨,就是要提供一個面向分布式環境的思路。我們下面來慢慢解釋。
當我們將TClientDataSet對象的Active屬性設為True或者調用其Open方法後,ClientDataSet會向 DataSetProvider發送一個取數據包請求。於是DataSetProvider便會打開對應的數據集,將記錄指針指向第一條記錄,然後從頭到尾依次掃描。對於掃描到的每一條記錄,都會將其編碼成一個variant數組,我們通常將它稱之為數據包。完成掃描後,DataSetProvider會關閉指向的數據集,並將所有的這些數據包傳遞給ClientDataSet。在我提供的演示程序中,你可以清楚地看到這種行為(畢竟眼見為實嗎!)。程序主界面右邊的DBGrid連接到一個指向資料庫表的數據源,DataSetProvider即指向此表。當選擇了ClientDataSet | Load菜單項時,你可以看到表格的數據被依次掃描,一旦到達最後一條記錄,表格便會被關閉,右邊的DBGrid被清空,而左邊反映 ClientDataSet數據的DBGrid便出顯示出內存中的數據來。由於這個過程會在DBGrid上反映出來,所以不到1000條記錄的取出時間中,大部分都浪費在屏幕的更新顯示上了,你可以選擇ClientDataSet | View Table Loading來禁止顯示,而達到加速的目的。
在上面的描述中,我們沒有提到一個重要的環節,即數據包是如何還原成表格的。那是因為DataSetProvider會將數據包中的元數據解碼出來,根據元數據(我們可以理解為數據表的結構)便可以構造出與物理數據表一模一樣的內存虛擬表。但要注意的是,盡管DataSetProvider指向的數據表可能有多個索引,但這些信息是不會放在數據包中的,換句話說,ClientDataSet當中的數據默認情況下是無索引的。但因為 ClientDataSet具有與TDataSet一致的行為,所以我們可以在此基礎上根據需要重建索引。
在ClientDataSet中的數據被修改後,可以提交給物理數據表持久化這此改變。這個工作便是由DataSetProvider完成的。內部工作原理是:DataSetProvider創建一個TSQLResolver的實例,這個實例會生成要在底層數據上執行更改的SQL語句。詳細地說,就是對修改日誌中的每一條被刪除、插入、更改記錄生成對應的SQL語句。這個語句的生成也可以由用戶控制,DataSetProvider的 UpdateMode屬性和ClientDataSet中的ProviderFlags屬性都對SQL語句的生成有影響。
當然,你也可以換一種方式,即採取同單機或C/S結構一樣的數據直接操作機制,繞過SQL語句和緩沖更新機制來修改資料庫。只需將 ResolveToDataSet屬性設為True,那麼DataSetProvider在持久化更新時便不會使用TSQLResolve,而是直接修改物理數據源。即定位到要刪除的記錄,調用刪除語句,定位到修改記錄,調用修改語句。我們可以對演示程序稍加修改,觀察此種行為。請將演示程序中的 DataSetProvider的ResolveToDataSet屬性由False改為True,運行。在界面中修改數據並且保存,你將會看到右邊的導航按鈕會在瞬間變得可用。
更絕妙的是,Borland考慮到了應用的多樣性,為我們提供了BeforeUpdateRecord事件,這樣,當 DataSetProvider對每個修改日誌的記錄進行操作時,都會觸發此事件,我們可以在此事件中加入自己的處理,如「加密操作」、「商業敏感數據處理」等應用,從而極大地方便了程序員,讓程序員對於數據具有完全的控制能力。分布式環境的復雜性對數據的存取提出了更高的要求,所以使用事務來保證數據的完整性和一致性是非常必要的,Borland考慮到了這一點,當調用ClientDataSet的ApplyUpdates時,你可以傳遞一個整數值來指明可以容忍的錯誤數量。如果你的數據非常嚴格,則可以傳遞0值,這樣,DataSetProvider在應用修改時便會打開一個事務,如果遇到錯誤,便會回退此事務,修改日誌將保持原樣,並且將出錯的記錄標記出來,最後會觸發OnReconcileError事件。如果傳遞了一個大於0的數,則當出現的錯誤數量小於此指定值時,事務會被提交,發生錯誤而導致提交失敗的記錄會保留在Delta中,而提交成功的記錄會從修改日誌中刪除。若錯誤數量達到指定值,則事務會回退,結果同整數值為0的情況。如果值為負數,則會交所以可提交的數據都提交,不可提交的數據仍然保存在修改日誌中,並將出錯記錄標記出來。
雖然,Borland是為了滿足分布式編程的需要而設計了TClientDataSet,但在其它類型的編程環境中使用ClientDataSet 也具有積極的意義。首先,我們可以看到,由於數據均在內存中進行操作,而且僅在打開資料庫取數據時和將修改持久到回資料庫時,才有資料庫開銷,其它時間資料庫為零,這樣就極大地增加了資料庫的負荷,讓資料庫伺服器能滿足更多用戶的連接請求。其次,ClientDataSet具有其它數據集所不具備的許多高級功能,這為程序員進行復雜的編程提供了便利,可以不考慮資料庫本身是否支持這此功能,而讓ClientDataSet去處理這些復雜而繁瑣的細節。最後,ClientDataSet在數據存儲和應用程序間起到一個抽象層的作用。假如你的程序使用了TClientDataSet,那麼如果你以後要更改資料庫存儲機制。比如說由BDE移植到dbExpress,或者從ADO移植到Interbase Express,你的用戶界面和數據控制部分幾乎就不用改變,只需要將DataSetProvider指向新的數據存取組件即可。順便說一句,由於緩沖更新的存在,用戶可能非常厭惡調用ApplyUpdates操作,那麼你可以將此調用放入AfterPost和AfterDelte中,讓用戶的操作更方便。
多層結構中必不可少件TClientDataSet的全面剖析2008-12-11 15:01在三層結構中,TClientDataSet的地位是不可估量的,她的使用正確與否,是十分關鍵的,本文從以下幾個方面闡述她的使用,希望對你有所幫助.
1.動態索引
procere TForm1.DBGrid1TitleClick(Column: TColumn);
begin
if (not column.Field is Tblobfield) then//Tblobfield不能索引,二進制
ClientDataSet1.IndexFieldNames:=column.Field.FieldName;
end;
2.多層結構中主從表的實現
設主表ClientDataSet1.packetrecord為-1,所有記錄
設從表ClientDataSet1.packetrecord為0,當前記錄
3.Taggregates使用
(1)在欄位編輯中add new field類型為aggregates
後設置expression(表達試)
設置active:=true即可
使用dbEdit的field為前者即可
(2)使用Aggergates屬性add設計表達試
調用
showmessage(floattostr(ClientDataSet1.Aggregates.Count));
showmessage(ClientDataSet1.Aggregates.Items[0].Value);

4.在單層資料庫中不要BDE
使用ClientDataSet代替table,使用ClientDataSet的loadfilename裝入cds
代替table的tablename的db或者dbf
原來的程序改造方法:
加一個ClientDataSet,使用右鍵assign locate data
後savetofile,再loadfromfile,後刪除table
將原連table的datasource設為ClientDataSet
唯一注意的是:要將midas.dll拷到system或者當前目錄
5.三層結構的公文包的實現方法
同時設定1:filename(*.cds)2.remote server
6.可以對data賦值(從另一個數據集取值)
ClientDataSet2.Data:=ClientDataSet1.Data;
ClientDataSet2.Open;
或者
ClientDataSet2.CloneCursor(ClientDataSet1,true);
ClientDataSet2.Open;
7.附加數據取得
客戶程序向應用伺服器請求數據。如果TClientDataSet 的
FetchOnDemand 屬性設為True,
客戶程序會根據需要自動檢索附加的數據包如BLOB欄位的值或嵌套表的內容。
否則,
客戶程序需要顯式地調用GetNextPacket 才能獲得這些附加的數據包。
ClientDataSet的packetrecords設置一次取得的記錄個數
8.ClientDataSet與伺服器端query連接方法
(1)sql內容為空
ClientDataSet1.Close;
ClientDataSet1.CommandText:=edit1.Text;//即sql內容
ClientDataSet1.Open;
對於沒有應用伺服器設置filter 如:country like 'A%'
filtered=true可實現sql功能
(2)有參數
如服務端query的sql為
select * from animals
where name like :dd
則:客戶端ClientDataSet
var
pm:Tparam;
begin
ClientDataSet1.Close;
ClientDataSet1.ProviderName:='DataSetProvider1';
pm:=Tparam.Create(nil);
pm.Name:='dd';
pm.DataType:=ftString;
ClientDataSet1.Params.Clear;
ClientDataSet1.Params.AddParam(pm);
ClientDataSet1.Params.ParamByName('dd').AsString:=edit1.Text ;
ClientDataSet1.Open;
pm.Free;
end;
9.數據的更新管理
(1)savepoint 保存目前為止數據狀態,可以恢復到這個狀態
var
pp:integer;
begin
pp:=ClientDataSet1.SavePoint;
ClientDataSet1.Edit;
ClientDataSet1.FieldByName('姓名').asstring:='古話';
ClientDataSet1.Post;
table1.Refresh;
end;
恢復點
ClientDataSet1.SavePoint:=pp;
(2)cancel,RevertRecord
取消對當前記錄的修改,只適合沒有post的,如果post,調用
RevertRecord
(3)cancelupdate
取消對資料庫所有的修改
(4)UndoLastChange(boolean),changecount
取消上一次的修改,可以實現連續撤消
參數為true:游標到恢復處
false:游標在當前位置不動
changecount返回修改記錄的次數,一個記錄修改多次,返回只一次
但UndoLastChange只撤消一次
10.可寫的recno
對於Ttable和Tquery的recno是只讀的,而TClientDataSet的recno可讀可寫
ClientDataSet1.recno:=5;是設第五個記錄為當前記錄
11.數據保存
對於table使用post可更新數據
而ClientDataSet1的post只更新內存數據,要更新伺服器數據要使用
ApplyUpdates(MaxErrors: Integer),他有一個參數,是允許發出錯誤的
次數,-1表示無數次,使用simpleobjectbroker時常設為0,實現自動容錯和負載平衡
ClientDataSet排序
1、簡單排序
ClientDataSet1.IndexFieldNames:='排序欄位'
2、復雜排序(建立索引)

可能與前面的筆記有重復的地方
ClientDataSet組件支持很多特性,其中一些與三級結構有關,而且還可以用在其他環境中。該組件說明了一個資料庫完全映象在內存中,這使得可以進行動態的操作,如建立一個索引,其他數據集合通常不支持該特性。例如,為了對查詢分類,我們通常是重新執行它。為了索引一個局部表格,需要定義索引。只有ADO數據集合有一些與ClientDataSet一樣的動態索引功能。
索引並不是ClientDataSet提供的全部功能。當我們擁有了索引之後,可以基於它定義組,可能是多級別的分組。對於確定一個記錄在組中的位置(頭、尾或中間位置),甚至有專門的支持。在組或整個數據表格中,我們可以定義總計;也就是說,可以動態計算整個表格或當前組中一列的總和或平均值。數據不需要發送給物理伺服器,因為這些總計操作發生在內存中。我們甚至可以定義新的總計欄位,可以直接與數據敏感控制項相連。
注意,所有這些特性不但可以用與MIDAS應用程序,還可以用與客戶機/伺服器,甚至是局部瘦應用程序。事實上,ClientDataSet組件可以從遠程MIDAS連接、局部數據集合(建立起數據的快照)、或局部文件(就象在公文包模式中一樣,但使用的只是在客戶機數據集合中定義的整個表格)中獲得起數據。

④ ClientDataSet 過濾後復制給另一個ClientDataSet

你查看cdsA是快照屬性,還是動態數據集屬性,別外cdsA對過濾後的動作是怎麼設置的。

⑤ delphi ClientDataSet怎麼用

你可以拖一個TDataSetProvider控制項,然後將查詢到TADOQuery控制項中的數據通過TDataSetProvider控制項載入到數據集中。
qry3.SQL.Text:=sql;
qry3.Open;
DataSetProvider2.DataSet:=qry3;
Mem1.Data:=DataSetProvider2.Data;
sql是sql語句,qry3是TADOQuery控制項名,DataSetProvider2是TDataSetProvider控制項名,Mem1是數據集名

⑥ TClientData用法delphi

可以最好加分,謝謝 TClientDataSet控制項繼承自TDataSet,其數據存儲文件格式擴展名為 .cds,是基於文件型數據存儲和操作的控制項。該控制項封裝了對數據進行操作處理的介面和功能,而本身並不依賴上述幾種資料庫驅動程序,基本上能滿足單機"瘦"資料庫應用程序的需要。1.TClientDataSet的基本屬性和方法介紹1).FieldDefs: 欄位定義列表屬性開發者可通過單擊屬性編輯器中該屬性編輯按鈕,或在該控制項上單擊右鍵選擇彈出菜單中的"Fields Editor"菜單進行欄位編輯。設置完此屬性後,實際上就相當於定義了表的結構;如果想裝入已有的數據表的結構和數據,可通過單擊右鍵選擇彈出菜單中的"Assign Local Data"菜單,從彈出對話框中選取當前窗體中已與資料庫連接好的數據集控制項名稱即可(當前窗體中必須已放置好要套用的數據集控制項並打開激活)。使用注意:對於自定義的欄位名表,該屬性編輯完後,該控制項仍然無法打開。必須右鍵單擊該控制項,選擇彈出菜單中的"Create DataSet"菜單,讓該控制項以上述編輯的欄位列表為依據,創建數據集後,才能夠被激活打開和使用。否則,會出現類似"ClientDataSet1: Missing data provider or data packet."的錯誤(包括在運行期,運行期可調用該控制項的CreateDataSet方法,從而動態定義欄位和表)。
2).FileName屬性說明:數據存儲文件的名稱。因該控制項是基於文件型的數據操作控制項,因此,必須指定所操作的數據文件名稱(默認擴展名稱.cds),從而打開和激活該控制項,進而進行數據編輯。例1:利用此屬性打開指定的.cds文件var
Path: string;
begin
Path := ExtractFilePath(Application.ExeName); //取得可執行文件路徑
CDataSet1.FileName := Path + 'test.cds';
CDataSet1.Open;
end;3).CreateDataSet方法說明:該方法以FieldDefs中的欄位名表為結構建立數據集,常用來進行動態定義表。例2:動態創建一具有姓名和年齡兩個欄位的數據集。//創建欄位名表
CDataSet.FieldDefs.Clear;
with CDataSet.FieldDefs.AddFieldDef do
begin
Name := 'Name';
Size := 10;
DataType := ftString;
end;
with CDataSet.FieldDefs.AddFieldDef do
begin
Name := 'Age';
DataType := ftInteger;
end;
//動態創建數據集
CDataSet.CreateDataSet;
//激活和打開該數據集
CDataSet.Open;4).Open方法說明: 打開和激活數據集控制項,從而進行數據編輯。a. 如果指定了FileName屬性,則直接用Open方法即可打開和激活該控制項,見例1。b. 如果未指定FileName屬性,可使用例2方法動態創建和打開數據集,進而操作數據。5).LoadFromFile和SaveToFile說明:從文件中裝入表結構和數據以及存儲數據到文件。該方法類似於Word中的打開新文件和另存為的功能。例3:將數據集的數據存儲到指定文件中CDataSet.SaveToFile('c:\windows\desktop\test.cds');6).First(到首),Prior(向前),Next(向後),Last(到尾),Edit(編輯),CanCel(取消編輯),Post(保存),Insert(插入記錄),Append(添加記錄),Delete(刪除),Refresh(數據刷新)等數據集常用方法說明:當指定了FileName屬性時,其Post方法可將數據存入指定的文件中,類似其SaveToFile方法;如果未指定存儲文件名,則Post方法只將數據存儲在RAM中。其它方法,同一般數據集控制項使用方法,略。7).Filter, Filtered: 過濾篩選屬性說明:用於篩選指定條件的記錄,用法同一般數據集控制項,略。例4:在已經激活打開的數據集中篩選性別為男性的記錄CDataSet.Close;
CDataSet.Filter := '性別=''' + '男' + '''';
CDataSet.Filtered := True;
CDataSet.Open;2.使用TClientDataSet控制項的應用程序發布的注意事項:如前所述,使用TClientDataSet控制項的程序發布時不需要任何資料庫驅動程序,大大節省了安裝文件的大小。但是,在發布程序時別忘了將Windows系統目錄下midas.dll(257KB)與應用程序一起發布(運行必須),否則,程序仍然無法正常運行。三、結束語通過使用Delphi中TClientDataSet控制項,既實現了應用程序可徹底脫離資料庫驅動程序,也實現了常規數據集控制項簡單易用的特性,為編寫"瘦"資料庫應用程序提供了一種技術方法和手段。上述程序在Pwindows98,Delphi5下測試通過。
TClientDataSet在三層結構中,TClientDataSet的地位是不可估量的,她的使用正確與否,是十分關鍵的,本文從以下幾個方面闡述她的使用,希望對你有所幫助.
1.動態索引
procere TForm1.DBGrid1TitleClick(Column: TColumn);
begin
if (not column.Field is Tblobfield) then//Tblobfield不能索引,二進制
ClientDataSet1.IndexFieldNames:=column.Field.FieldName;
end;
2.多層結構中主從表的實現
設主表ClientDataSet1.packetrecord為-1,所有記錄
設從表ClientDataSet1.packetrecord為0,當前記錄
3.Taggregates使用
(1)在欄位編輯中add new field類型為aggregates
後設置expression(表達試)
設置active:=true即可
使用dbedit的field為前者即可
(2)使用Aggergates屬性add設計表達試
調用
showmessage(floattostr(ClientDataSet1.Aggregates.Count));
showmessage(ClientDataSet1.Aggregates.Items[0].Value);
4.在單層資料庫中不要BDE
使用ClientDataSet代替table,使用ClientDataSet的loadfilename裝入cds
代替table的tablename的db或者dbf
原來的程序改造方法:
加一個ClientDataSet,使用右鍵assign locate data
後savetofile,再loadfromfile,後刪除table
將原連table的datasource設為ClientDataSet
唯一注意的是:要將midas.dll拷到system或者當前目錄
5.三層結構的公文包的實現方法
同時設定1:filename(*.cds)2.remote server
6.可以對data賦值(從另一個數據集取值)
ClientDataSet2.Data:=ClientDataSet1.Data;
ClientDataSet2.Open;
或者
ClientDataSet2.CloneCursor(ClientDataSet1,true);
ClientDataSet2.Open;
7.附加數據取得
客戶程序向應用伺服器請求數據。如果TClientDataSet 的
FetchOnDemand 屬性設為True,
客戶程序會根據需要自動檢索附加的數據包如BLOB欄位的值或嵌套表的內容。
否則,
客戶程序需要顯式地調用GetNextPacket 才能獲得這些附加的數據包。
ClientDataSet的packetrecords設置一次取得的記錄個數
8.ClientDataSet與伺服器端query連接方法
(1)sql內容為空
ClientDataSet1.Close;
ClientDataSet1.CommandText:=edit1.Text;//即sql內容
ClientDataSet1.Open;
對於沒有應用伺服器設置filter 如:country like 'A%'
filtered=true可實現sql功能
(2)有參數
如服務端query的sql為
select * from animals
where name like :dd
則:客戶端ClientDataSet
var
pm:Tparam;
begin
ClientDataSet1.Close;
ClientDataSet1.ProviderName:='DataSetProvider1';
pm:=Tparam.Create(nil);
pm.Name:='dd';
pm.DataType:=ftString;
ClientDataSet1.Params.Clear;
ClientDataSet1.Params.AddParam(pm);
ClientDataSet1.Params.ParamByName('dd').AsString:=edit1.Text ;
ClientDataSet1.Open;
pm.Free;
end;9.數據的更新管理
(1)savepoint 保存目前為止數據狀態,可以恢復到這個狀態
var
pp:integer;
begin
pp:=ClientDataSet1.SavePoint;
ClientDataSet1.Edit;
ClientDataSet1.FieldByName('姓名').asstring:='古話';
ClientDataSet1.Post;
table1.Refresh;
end;
恢復點
ClientDataSet1.SavePoint:=pp;
(2)cancel,RevertRecord
取消對當前記錄的修改,只適合沒有post的,如果post,調用
RevertRecord
(3)cancelupdate
取消對資料庫所有的修改
(4)UndoLastChange(boolean),changecount
取消上一次的修改,可以實現連續撤消
參數為true:游標到恢復處
false:游標在當前位置不動
changecount返回修改記錄的次數,一個記錄修改多次,返回只一次
但UndoLastChange只撤消一次

10.可寫的recno
對於Ttable和Tquery的recno是只讀的,而TClientDataSet的recno可讀可寫
ClientDataSet1.recno:=5;是設第五個記錄為當前記錄
11.數據保存
對於table使用post可更新數據
而ClientDataSet1的post只更新內存數據,要更新伺服器數據要使用
ApplyUpdates(MaxErrors: Integer),他有一個參數,是允許發出錯誤的
次數,-1表示無數次,使用simpleobjectbroker時常設為0,實現自動容錯和負載平衡
====================================================== 影響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.Append;
...
ClientDataSet.Post;
end;
...
ClientDataSet.EnableControls
...
這樣做以後你會發現處理速度比以前沒有使用方法的時候有成倍的提高。

ClientDataSet的數據查找。
我所介紹的心得和技巧都是用ClientDataSet來做範例,也可以應用於其他的一些DataSet。廢話就不多說了。我們還是先看代碼,讓後再總結。
1.Scanning 掃描數據查找
這是最簡單最直接也是最慢的一種方法,遍歷所有數據:
procere TForm1.ScanBtnClick(Sender: TObject);
var
Found: Boolean;
begin
Found := False;
ClientDataSet1.DisableControls;
Start;
try
ClientDataSet1.First;
while not ClientDataSet1.Eof do
begin
if ClientDataSet1.Fields[FieldListComboBox.ItemIndex].value =
SearchText then
begin
Found := True;
Break;
end;
ClientDataSet1.Next;
end;
Done;
finally
ClientDataSet1.EnableControls;
end;
if Found then ShowMessage(SearchText +
' found at record ' + IntToStr(ClientDataSet1.RecNo))
else
ShowMessage(ScanForEdit.Text + ' not found');
end;

2.Finding 尋找數據
最老,但是最快的查找方式。
使用FindKey/FindNearest來查找一條或多條符合條件的數據,當然待查找的Field必須是一個IndexField。可以看出,這種基於Index的查找速度是非常快的。
procere TForm1.FindKeyBtnClick(Sender:
TObject);
begin
Start;
if ClientDataSet1.FindKey([SearchText]) then
begin
Done;
StatusBar1.Panels[3].Text := SearchText +
' found at record ' +
IntToStr(ClientDataSet1.RecNo);
end
else
begin
Done;
StatusBar1.Panels[3].Text :=
SearchText + ' not found';
end;
end;

procere 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);
end

3.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)。
procere TForm1.LocateBtnClick(Sender:
TObject);
begin
Start;
if ClientDataSet1.Locate('Field1,Field2..',VarArrayOf['value1,value2..'], []) then
begin
Done;
StatusBar1.Panels[3].Text :=
'Match located at record ' +
IntToStr(ClientDataSet1.RecNo);
end
else
begin
Done;
StatusBar1.Panels[3].Text := 'No match located';
end;
end;

小結:
ClientDataSet提供了好多種查找數據的方法。但是各自有其優缺點。
上面的例子中有Start;和Done,如果你有興趣,可以加入計時點進行速度測試。
Scanning最簡單,但是最慢,因為比較慢,還得使用ClientDataSet.DisableControls和ClientDataSet.EnableControls方法(我在前面一片文章講過)。
Findkey/FindNearest(GotoKey/GotoNearest)代碼多,但是非常快。必須使用Index,不同的是Find需要的Index是必須建立好的,而Goto可以在第一次使用時建立Index。
Locate使用最方便,不需要Index,但是速度沒有Find快。

⑦ 在使用ClientDataSet作過濾時,發現它不支持中文,有解決的辦法嗎

MIDAS怎麼可能會不支持中文,CLIENTDATASET 採用的是XML格式,而XML支持UNICODE字元集,所以也支持中文了,而且更多!

ClientDataSet1.Filtered:=true;//你為什麼沒加??
ClientDataSet1.Filter:='property=''年報''';//你的引號是不是沒有加上?

我用得好好的。我的資料庫是sqlserver2000,delphi6.連接方式是webservie SoapConnection1.
另外你的資料庫是什麼?
如果是access解決方法是:
Access資料庫你加入欄位時它默認字元串是TWideStringField型。把所有的TWideStringField統統地改為 TStringField型就行了!

⑧ 救命!!!delphi clientdataset分頁

select top 10 * from table1 where fid not in (select top 30 fid from table1 order by st desc) order by st desc
你可以先去掉其他條件用SQL語句在其他工具里嘗試,一定能找到SQL語句的錯誤。
另,差集計算使用排序是無意義的,因為 order by 是對 top N 結果的排序,而不是你理解的排序之後的top N。
供參考。
如果你一定要使用SQL語句分頁並且是對全集排序分頁,那麼可以參考如下:
data_all='select * from table1 where ... order by st desc';
if(page_n=1)then begin

s = 'select top ' + inttostr(page_size) + ' * from (' + data_all + ')';//已經排序過,不用再排序。
end else if(page_n>1)begin
s1 = 'select top ' + inttostr((page_n * page_size)) + ' * from (' + data_all + ')';

s2 = 'select top ' + inttostr(((page_n - 1) * page_size)) + ' * from (' + data_all + ')';

s = 'select * from (' + s1 + ') where fid not in (select fid from (' + s2 + ')) order by st desc';
//其實最後的排序子句是多餘的

//說明:先獲得第1頁到第n頁的集合,再獲得第1頁到第n-1頁的集合,

//然後獲得差集就是第n頁。

//如果還有錯,那麼就是你的運氣不好了。

end;

⑨ Delphi2007 不同clientdataset之間的賦值

procere TForm1.Button1Click(Sender: TObject);
var
k:integer;
begin
//前提條件是ClientDataSet1、ClientDataSet2所打開的表的結構必須相同哦
while not ClientDataSet1.Eof do
begin
ClientDataSet2.Append;
for k:=0 to ClientDataSet1.FieldCount -1 do
ClientDataSet2.Fields[k].Value:=ClientDataSet1.Fields[k].Value;
ClientDataSet2.Post;
ClientDataSet1.Next;
end;
end;

閱讀全文

與clientdateset過濾條件相關的資料

熱點內容
24k純水怎麼喝 瀏覽:471
ro膜反滲透凈 瀏覽:352
燃油濾芯保養怎麼做 瀏覽:141
水處理除鐵錳設備價格 瀏覽:957
永川區污水處理廠電話 瀏覽:753
純水機進水電磁閥為什麼不出水 瀏覽:86
瓦爾塔免維護電池加蒸餾水 瀏覽:455
空調濾芯積灰怎麼清理 瀏覽:575
圍岩突水處理 瀏覽:614
飲水機怎麼放在水槽 瀏覽:629
釀酒為什麼不能用純凈水 瀏覽:923
污水管路下面能用什麼 瀏覽:842
屠宰養殖廢水處理計劃書 瀏覽:196
bt方式合同污水 瀏覽:734
福克斯原廠汽油濾芯是什麼牌子的 瀏覽:391
浙江環氧樹脂板 瀏覽:48
好美凈水器沒有水怎麼辦 瀏覽:214
優化工廠廢水周邊環境 瀏覽:557
離子交換能力 瀏覽:448
泡茶用礦泉水還是蒸餾水 瀏覽:457