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

ClientDataSet 的ApplyUpdate問題

缺席
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-18 10:41:01 IP:61.221.xxx.xxx 未訂閱
小弟是用delphi 7 ,使用DBExpress和ClientDataSet搭配,架構還是2-Tier, 但是小弟在修改某一筆資料的時候,若ClientDataSet的PacketRecords屬性設定為-1的時候,下ApplyUpdate(-1),是可以成功的,但是若有限制每次抓取筆數,則會出現Unable to find record,No key specified.的錯誤訊息,請問如何解決??
------
ivankuo
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-18 12:14:42 IP:61.221.xxx.xxx 未訂閱
小弟現在不管PacketRecords設定為-1或其他數字,都會發生錯誤~~怎麼這麼奇怪阿~~~~
------
ivankuo
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-08-18 13:42:52 IP:61.221.xxx.xxx 未訂閱
引言: 小弟現在不管PacketRecords設定為-1或其他數字,都會發生錯誤~~怎麼這麼奇怪阿~~~~
小弟改用ADO元件來測試是ok的,這是DBExpress的Bug嗎??
------
ivankuo
pcplayer99
尊榮會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-08-18 20:02:29 IP:61.144.xxx.xxx 未訂閱
引言:
引言: 小弟現在不管PacketRecords設定為-1或其他數字,都會發生錯誤~~怎麼這麼奇怪阿~~~~
小弟改用ADO元件來測試是ok的,這是DBExpress的Bug嗎??
你是不是这样的: select top 100 * from yourTable 这样一来的话,你ApplyUpdates过去的记录,可能当前不在这个Select语句的结果集里,结果就是找不到!!
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-08-19 09:11:55 IP:61.221.xxx.xxx 未訂閱
我的SQL並沒有下select top 100 ,我去深度論壇的李維討論區發現很多人都有這樣的問題,問題出在DBExpress的身上,現在好像還沒有patch出來,不知道要等到何時。
------
ivankuo
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-08-21 16:48:59 IP:218.16.xxx.xxx 未訂閱
應該是你有 Date 或 Float 的 Field 罷 DBEXPRESS 有一個大 Bug 就是 update 時自動做的 where datefield=value 及 where floatfield=value 的 value 與 select 回來的值會有極少的偏差,以至找不回原先的 record 暫時的解法方法是在 TSQLDataSet / TSQLQuery / TSQLTable Add 上 Field 並將 date field / float field 的 ProviderFlags.pfInWhere 設成 false ,這樣dbexpress 便不會為這個 Field 產生 where clause 也就跳過這個 BUG 你若有 Unique Key 也可在 DataSetProvider 將 UpdateMode 改成 upWhereKeyOnly 並在 TSQLDataSet / TSQLQuery / TSQLTable Add 上 Field 並將 Key Field 的 ProviderFlags.pfInKey 設 True DBEXPRESS 的 update 正在一些一些的放在 Borland 的 Code Central, 可自行留意一下,正式的 update 應不會這麼快。 http://codecentral.borland.com/codecentral/ccweb.exe/home -> Database - Delphi 留意 Ramesh Theivendran 出的東東,他現在是唯一維護 DBExpress 的 Borland 員工。
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-08-22 16:37:37 IP:61.221.xxx.xxx 未訂閱
等了好久終於有人在回應,真是高興,感謝版主。 不過小弟有幾個問題請教: 1.您所指的(Date 或 Float 的 Field ),這不就全部field欄位都是?? 2.小弟不是很了解前輩所指的(Date 或 Float 的 Field )意義,所以把所有欄位的ProviderFlags.pfInWhere 設成 false ,把Key Field 的ProviderFlags.pfInKey 設 True,結果還是會出現錯誤訊息Unable to find record,No key specified。 不曉得我有沒有會錯意。
------
ivankuo
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-08-23 13:23:14 IP:218.16.xxx.xxx 未訂閱
1. Date 是日期 Float 是浮點數甚會是所有?? String / integer 等其他 Field 沒這個問題。 2. 我上文已說過,要使用 ProviderFlags.pfInKey 要同時在 DataSetProvider 將 UpdateMode 改成 upWhereKeyOnly 否則他會看你 ProviderFlags.pfInWhere 的值,而由於你所有 Feild 都是 False, 即是沒 where, 那甚能找到在 update 那個 record 呢 ?
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-08-25 09:59:02 IP:61.221.xxx.xxx 未訂閱
阿~~~前輩真是不好意思~~可能那天眼花了~~把Date看成Data,真是不好意思~~小弟該去看看眼科了~~~ 小弟今天依造前輩所說的方式來寫,發現還是不行,於是我將欄位只select key field ,這些欄位都是varchar,不管是將DataSetProvider 的 UpdateMode 用 upWhereKeyOnly 方式或用upWhereAll方式,都會出現錯誤訊息,但是是另一個訊息 小弟的資料庫是 SQL Server 2000
------
ivankuo
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-08-25 10:47:15 IP:218.16.xxx.xxx 未訂閱
1. 記得 ProviderFlags 要在 TSQLDataSet 系裡設定,在 ClientDataSet 設是沒用的。 2. 你新的錯誤沒訊息我不清楚,我自己用時在 ProviderFlags 及 updateMode 設好便沒有了 Unable to find record 的問題。
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-08-25 11:30:56 IP:61.221.xxx.xxx 未訂閱
ProviderFlags 我是在 TSQLDataSet 系裡設定的,我去code Central看,並沒有for SQL Server 2000的Update,不曉得這是不是專屬SQL Server的bug,我的dbexpmss.dll的版本是7.0.2.113 -2002/10/10 ,應該是目前最新的吧?? 現在只能希望borland趕快修正了。
------
ivankuo
kensoong
初階會員


發表:31
回覆:70
積分:45
註冊:2003-05-28

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-08-25 13:04:25 IP:61.222.xxx.xxx 未訂閱
1.將DataSetProvider之UpdateMode設為upWherekeyOnly 2.再將key欄位設為pfinKey(doubleclick TQuery->選取field->於Object Inspector中providerFlag設pfInkey為True).若沒fields,先加fields進去即可選取. PS:7.0.2.113應是目前最新的...
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-08-26 09:43:32 IP:61.221.xxx.xxx 未訂閱
小弟都是按照Justmade前輩的方式去做,應該是kensoong兄一樣的,但不知為何我測試了好多次就是不行~~真怪,
------
ivankuo
kensoong
初階會員


發表:31
回覆:70
積分:45
註冊:2003-05-28

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-08-26 11:59:44 IP:61.222.xxx.xxx 未訂閱
建議你弄個SQL Monitor元件將過程錄製下來, 或許可發現一些問題,進而找出其它對策.解決它...
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-08-26 13:31:28 IP:61.221.xxx.xxx 未訂閱
為何抓出來的update語法 為update table1 set F001=? where F001=? and F002=? and F003=? 哪裡出了問題??真怪~~
------
ivankuo
kensoong
初階會員


發表:31
回覆:70
積分:45
註冊:2003-05-28

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-08-26 18:11:43 IP:61.222.xxx.xxx 未訂閱
所以說這就是問題了吧~~~ 如果說你有將1.將DataSetProvider之UpdateMode設為upWherekeyOnly的話, F001=? and F002=? and F003=?就是PK. 但我推測,一般不會設那麼多欄位當PKey,應該是沒設好或是設了Schema Metadata沒refresh.請再檢查...
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#17 引用回覆 回覆 發表時間:2003-08-27 09:55:55 IP:61.221.xxx.xxx 未訂閱
小弟是將DataSetProvider之UpdateMode設為upWherekeyOnly,且沒有設定Schema Metadata,GetMetadata為false,NoMetadata為true,這兩個屬性應該是預設值吧,我也更換另一個table,只有一個PK欄位,結果還是一樣。您有範例程式嗎??還是我把程式給您看(如果您有空的話)
------
ivankuo
系統時間:2024-07-06 9:39:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!