使用DbGrid 為何會出現兩筆以上相同的資料? |
缺席
|
weiliching
初階會員 發表:53 回覆:78 積分:31 註冊:2003-12-27 發送簡訊給我 |
|||
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
|||
weiliching
初階會員 發表:53 回覆:78 積分:31 註冊:2003-12-27 發送簡訊給我 |
|||
jieshu
版主 發表:42 回覆:894 積分:745 註冊:2002-04-15 發送簡訊給我 |
引言: 個位先進: 我把 ClientDataSet 屬性Packetrecords 設成10 然後我發現在DbGrid顯示裡第11筆的資料會重覆顯示. 但是資料庫裡確只有一筆資料.沒有兩筆重覆的資料. 為何會有這種狀況? 我把PacketRecords 設為30 ,它確開始在第30筆後開始重覆顯示出來.. 像這樣..我的設定不就要設成-1? Vincent wei請問您的Primary Key是什麼? 要不要將您的程式上傳上來看看?
------
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離 人若為惡,禍雖未至,福已遠離 http://www.taconet.com.tw/jieshu/ |
||
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
|||
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
引言: 我把 ClientDataSet 屬性Packetrecords 設成10 然後我發現在DbGrid顯示裡第11筆的資料會重覆顯示. 但是資料庫裡確只有一筆資料.沒有兩筆重覆的資料. 為何會有這種狀況? 我把PacketRecords 設為30 ,它確開始在第30筆後開始重覆顯示出來.. 像這樣..我的設定不就要設成-1?weiliching 你好 個人覺得,你應該將元件架構(ClientDataSet->DataSetProvider->DataSet的關係)及查詢資料的方法,稍加說明,大家才比較好判斷問題的發生原因,不然大家都用猜的,不知猜對了是否有獎...。 以貼出的圖來看,你應該是將 >),因為無狀態所以第一次取得 |
||
weiliching
初階會員 發表:53 回覆:78 積分:31 註冊:2003-12-27 發送簡訊給我 |
因該說他是不停的重覆下去,不只重覆一次.
我把設定大至上說一次.
我在Client 放兩個原件.一個是
ClientDataSet1 與 SocketConnection1
---------------------------------
ClientDataSet1 設定如下.
ClientDataSet1.ProviderMame := 'DataSetprovider1';
ClientDataSet1.RemodeServer = 'SocketConnection1';
ClientDataSet1.PacketRecords = 10;
----------------------------------
Socketconnection1 設定如下
Host = 10.0.2.2
ServerName = T_Server.RDM_Server
Conneted=Ture
---------------------------------
SQL 查尋語法如下:
procedure TForm1.Button1Click(Sender: TObject);
Var s_Date:String;
begin
IF not InputQuery('查尋','請輸入日期',S_Date) then exit;
SocketConnection1.Close;
With ClientDataSet1 do begin
close;
CommandText := 'Select * from M_processD where M_Date >=:kk Order by M_Date';
Params.Clear;
Params.CreateParam(ftDateTime, 'kk', ptInput).asDateTime := StrToDate(S_Date);
Open;
end; end; =======================================
=======================================
在Server端的設定 開一個Remote Data module
放了三個元件,分別是
AdoConnention1, AdoQuery1 ,與DataSetProvider1 AdoQuery1.設定連到 AdoConnection1
AdoConnection 連到SQL Server7.0 DataSetProvider1.DataSet := 'AdoQuery1';
DataSetProvider1.option.poallowcommandText := True;
DataSetProvider1.poincFieldProps := True; 不知道以上的資料是否夠大哥們幫我查原因?
|
||
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
|||
weiliching
初階會員 發表:53 回覆:78 積分:31 註冊:2003-12-27 發送簡訊給我 |
引言: weiliching 你好 個人覺得,你應該將元件架構(ClientDataSet->DataSetProvider->DataSet的關係)及查詢資料的方法,稍加說明,大家才比較好判斷問題的發生原因,不然大家都用猜的,不知猜對了是否有獎...。 以貼出的圖來看,你應該是將 >),因為無狀態所以第一次取得>>< face="Verdana, Arial, Helvetica"> 其實我比較不瞭解何為無狀況物件!但是我發現..重覆狀況不是只有一次. 我只查尋一次..然後一直往下拉..發現他是不停的重覆...我只查尋一次而已 我確定資料庫是沒有相同的資料.且我還設定了key ,資料庫更不可能有重覆狀況 所以這問題.我一直抓不出原因. 因為我只是照書本上試做一個3- tier的東西看看而已.. |
||
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
weiliching 你好 提供兩個疑點,你試看看
1.ClientDataSet1.FetchOnDemand 是否為true(這點可能性不大)或者重拉元件然後只設定必須的屬性。
2.下列程式片段寫法修改一下 SQL 查尋語法如下: procedure TForm1.Button1Click(Sender: TObject); Var s_Date:String; begin IF not InputQuery('查尋','請輸入日期',S_Date) then exit; SocketConnection1.Close; With ClientDataSet1 do begin close; CommandText := 'Select * from M_processD where M_Date >=:kk Order by M_Date'; // Params.Clear; Params.ParamByName('kk').AsDate := StrToDate(S_Date); 或 Params.ParamValues['kk'] := StrToDate(S_Date); Open; end; ..... End; |
||
weiliching
初階會員 發表:53 回覆:78 積分:31 註冊:2003-12-27 發送簡訊給我 |
|||
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
你的情况,如果你的DBGird对应的ClientDataSet是个单独的表,没有和其它ClientDataSet构成Master/Detail关系,也没有做Filter,那么,我猜,多半是向Server取数据的时候,Server每次都从第一条开始的缘故。 比如你有1000条,如果不想一次把所有1000条全部取到ClientDataSet里,最好的办法是自己多写几行代码,当ClientDataSet滚动到结尾(EOF)的时候,取得最后一条的KEY,然后把这个KEY送给Server。Server在送数据前,先定位到这个Key,就不会送重复的Record给你了。
|
||
weiliching
初階會員 發表:53 回覆:78 積分:31 註冊:2003-12-27 發送簡訊給我 |
這部份就聽的比較含糊點..
有實例或是書嗎?
有哪本書可以讓我參考的.
我想知道送key 的指令為何..? Vincent wei
引言: 你的情况,如果你的DBGird对应的ClientDataSet是个单独的表,没有和其它ClientDataSet构成Master/Detail关系,也没有做Filter,那么,我猜,多半是向Server取数据的时候,Server每次都从第一条开始的缘故。 比如你有1000条,如果不想一次把所有1000条全部取到ClientDataSet里,最好的办法是自己多写几行代码,当ClientDataSet滚动到结尾(EOF)的时候,取得最后一条的KEY,然后把这个KEY送给Server。Server在送数据前,先定位到这个Key,就不会送重复的Record给你了。 |
||
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
|||
weiliching
初階會員 發表:53 回覆:78 積分:31 註冊:2003-12-27 發送簡訊給我 |
|||
jieshu
版主 發表:42 回覆:894 積分:745 註冊:2002-04-15 發送簡訊給我 |
引言: 我發現一個狀況,我把整台Notebook拿去給其他人試. 發現到.如果使用Delphi 5,是不會有這狀況. 而我的版本是Delphi 7 sql server 7.0 (Service 1.0) 也聽說Delphi 7 (Service pack 1.1) 不會有我上述的狀況. 請問這是不是D7 版本的問題呢? Vincent wei只能說是有可能, 最好能更新到最新的再試試. <iFrame src="http://www.coss.com.tw/jieshu/sign.htm" width=400 height=105 scolling="NO" border="0"></iFrame> 廣告一下: http://www.971.idv.tw/
------
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離 人若為惡,禍雖未至,福已遠離 http://www.taconet.com.tw/jieshu/ |
||
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
我猜,还是前面提到的 Stateless 的问题。 在观念上,你的 ClientDataSet 是维护一个在Client端的内存里的表。而APP SERVER是维护一个在 Server 端的表,这个表是从 DataBase Server取出来的。 如果是有状态的模式,Client从 APP SERVER取了N条数据,APP SERVER就会把表的游标走到第N 1条数据的位置。因此如果 ClientDataSet 继续向下滚动,它会自动请求APP SERVER送后面的数据,这时候APP SERVER就会从第N 1条开始送数据给Client,一切正常。 但如果这时候是无状态模式(Stateless),则APP SERVER的游标可能还是在第一条(在哪一条上,不知道),那么它送给ClientDataSet的数据可能还是从第一条开始的,到了ClientDataSet里,就重复了。 无状态模式下,自己要多写几行程式来解决这个问题。
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |