線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2225
推到 Plurk!
推到 Facebook!

使用DbGrid 為何會出現兩筆以上相同的資料?

缺席
weiliching
初階會員


發表:53
回覆:78
積分:31
註冊:2003-12-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-06 16:05:41 IP:210.243.xxx.xxx 未訂閱
個位先進: 我把 ClientDataSet 屬性Packetrecords 設成10 然後我發現在DbGrid顯示裡第11筆的資料會重覆顯示. 但是資料庫裡確只有一筆資料.沒有兩筆重覆的資料. 為何會有這種狀況? 我把PacketRecords 設為30 ,它確開始在第30筆後開始重覆顯示出來.. 像這樣..我的設定不就要設成-1? Vincent wei
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-06 16:38:25 IP:218.170.xxx.xxx 未訂閱
weiliching 你好: 我試...沒有這情況. 你是否在相關的 Event (如 DataSource.OnDataChange / DataSet.AfterScroll...等), 有寫可能造成 Data Cursor 錯亂(如 Locate)的程式. 發表人 - Mickey 於 2004/07/06 16:39:40
weiliching
初階會員


發表:53
回覆:78
積分:31
註冊:2003-12-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-06 17:23:49 IP:210.243.xxx.xxx 未訂閱
其實我的設定很簡單.. 跟本沒有在認何的事件裡面寫東西.. 只是簡單的把他Show出來..但是這問題以前就有了. 只是不知道出問題在哪裡.    我把圖上傳上來給大家參考看看 第11筆開始後資料就重覆了..
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-07-06 18:56:04 IP:203.204.xxx.xxx 未訂閱
引言: 個位先進: 我把 ClientDataSet 屬性Packetrecords 設成10 然後我發現在DbGrid顯示裡第11筆的資料會重覆顯示. 但是資料庫裡確只有一筆資料.沒有兩筆重覆的資料. 為何會有這種狀況? 我把PacketRecords 設為30 ,它確開始在第30筆後開始重覆顯示出來.. 像這樣..我的設定不就要設成-1? Vincent wei
請問您的Primary Key是什麼? 要不要將您的程式上傳上來看看?
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.coss.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-07-06 21:52:23 IP:218.169.xxx.xxx 未訂閱
hi,weiliching: 依您所描述的情況及post上來的圖,我在猜是否您的sql指令下錯的關係.請問一下,您ClientDataSet裡的資料,是否有用到JOIN(也就是一道sql指令讀取一個以上的table的資料),建議您加個distinct指令,(即select distinct ....),看看資料是否仍然重覆.如果重覆的狀況消失了,而您也確定table裡就是沒有重覆的資料,那99%就是您的sql指令在join部分,欄位加的不夠的關係.您參考一下
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-07-06 22:39:34 IP:211.20.xxx.xxx 未訂閱
引言: 我把 ClientDataSet 屬性Packetrecords 設成10 然後我發現在DbGrid顯示裡第11筆的資料會重覆顯示. 但是資料庫裡確只有一筆資料.沒有兩筆重覆的資料. 為何會有這種狀況? 我把PacketRecords 設為30 ,它確開始在第30筆後開始重覆顯示出來.. 像這樣..我的設定不就要設成-1?
weiliching 你好 個人覺得,你應該將元件架構(ClientDataSet->DataSetProvider->DataSet的關係)及查詢資料的方法,稍加說明,大家才比較好判斷問題的發生原因,不然大家都用猜的,不知猜對了是否有獎...。 以貼出的圖來看,你應該是將 >),因為無狀態所以第一次取得
weiliching
初階會員


發表:53
回覆:78
積分:31
註冊:2003-12-27

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-07-07 08:36:41 IP:210.243.xxx.xxx 未訂閱
因該說他是不停的重覆下去,不只重覆一次. 我把設定大至上說一次. 我在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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-07-07 09:56:47 IP:147.8.xxx.xxx 未訂閱
I agree with Change36 大大. MIDAS/DataSnap is stateless now, and you need to pass the page number somewhere (e.g. OwnerData in some events), and move the db cursor on the server before returning the dataset.
weiliching
初階會員


發表:53
回覆:78
積分:31
註冊:2003-12-27

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-07-07 13:49:15 IP:210.243.xxx.xxx 未訂閱
引言: weiliching 你好 個人覺得,你應該將元件架構(ClientDataSet->DataSetProvider->DataSet的關係)及查詢資料的方法,稍加說明,大家才比較好判斷問題的發生原因,不然大家都用猜的,不知猜對了是否有獎...。 以貼出的圖來看,你應該是將 >),因為無狀態所以第一次取得>< face="Verdana, Arial, Helvetica"> 其實我比較不瞭解何為無狀況物件!但是我發現..重覆狀況不是只有一次. 我只查尋一次..然後一直往下拉..發現他是不停的重覆...我只查尋一次而已 我確定資料庫是沒有相同的資料.且我還設定了key ,資料庫更不可能有重覆狀況 所以這問題.我一直抓不出原因. 因為我只是照書本上試做一個3- tier的東西看看而已..
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-07-07 14:30:05 IP:211.20.xxx.xxx 未訂閱
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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-07-08 08:42:03 IP:210.243.xxx.xxx 未訂閱
ClientDataSet1.FetchOnDemand 是為 true 另外我也改了程式如chance36 所列的部份.. 但是程式一樣是發生同一樣的情況..
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-07-08 15:28:47 IP:219.133.xxx.xxx 未訂閱
你的情况,如果你的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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-07-09 13:32:47 IP:210.243.xxx.xxx 未訂閱
這部份就聽的比較含糊點.. 有實例或是書嗎? 有哪本書可以讓我參考的. 我想知道送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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-07-10 17:11:52 IP:219.133.xxx.xxx 未訂閱
送KEY的办法很多。 你可以参考李维的书。
weiliching
初階會員


發表:53
回覆:78
積分:31
註冊:2003-12-27

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-08-01 12:37:23 IP:210.243.xxx.xxx 未訂閱
我發現一個狀況,我把整台Notebook拿去給其他人試. 發現到.如果使用Delphi 5,是不會有這狀況. 而我的版本是Delphi 7 sql server 7.0 (Service 1.0) 也聽說Delphi 7 (Service pack 1.1) 不會有我上述的狀況. 請問這是不是D7 版本的問題呢? Vincent wei
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-08-01 14:54:47 IP:61.70.xxx.xxx 未訂閱
引言: 我發現一個狀況,我把整台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

發送簡訊給我
#17 引用回覆 回覆 發表時間:2004-08-02 12:40:37 IP:219.133.xxx.xxx 未訂閱
我猜,还是前面提到的 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里,就重复了。 无状态模式下,自己要多写几行程式来解决这个问题。
系統時間:2024-04-26 19:41:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!