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

關於dbExpress的交易的奇妙現象.

缺席
wb3599
一般會員


發表:32
回覆:32
積分:12
註冊:2004-02-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-06 00:50:34 IP:61.230.xxx.xxx 未訂閱
請問大家: 小弟的環境:Delphi 7 dbExpress MSSQL2000 我有一筆資料要更新,使用交易的方式, 並在TDataSetProvider的BeforeUpdate自己寫處理的程式碼. 第一次都會失敗. 失敗的錯誤訊息為空白. 可是我沒有做任何事,再更新一次, 就可以. 怎麼會這樣呢? 後來我直接用ApplyUpdates而不使用交易, 結果也是一樣的奇妙. 請問前輩, Delphi 7 dbExpress MSSQL20可以做出東西嗎? 有做出來的前輩給點信心好不好呢? Bug實在是多的讓人快沒頭路了. 謝謝!
wb3599
一般會員


發表:32
回覆:32
積分:12
註冊:2004-02-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-06 01:30:37 IP:61.230.xxx.xxx 未訂閱
引言: 請問大家: 小弟的環境:Delphi 7 dbExpress MSSQL2000 我有一筆資料要更新,使用交易的方式, 並在TDataSetProvider的BeforeUpdate自己寫處理的程式碼. 第一次都會失敗. 失敗的錯誤訊息為空白. 可是我沒有做任何事,再更新一次, 就可以. 怎麼會這樣呢? 後來我直接用ApplyUpdates而不使用交易, 結果也是一樣的奇妙. 請問前輩, Delphi 7 dbExpress MSSQL20可以做出東西嗎? 有做出來的前輩給點信心好不好呢? Bug實在是多的讓人快沒頭路了. 謝謝!
後來我把這個DataModule的內容拿開, 就可以了, 這是什麼問題呢? 難道DataModule裡的資料表有限制dbexpress元件的數量?
wb3599
一般會員


發表:32
回覆:32
積分:12
註冊:2004-02-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-06 18:06:24 IP:61.230.xxx.xxx 未訂閱
引言:
引言: 請問大家: 小弟的環境:Delphi 7 dbExpress MSSQL2000 我有一筆資料要更新,使用交易的方式, 並在TDataSetProvider的BeforeUpdate自己寫處理的程式碼. 第一次都會失敗. 失敗的錯誤訊息為空白. 可是我沒有做任何事,再更新一次, 就可以. 怎麼會這樣呢? 後來我直接用ApplyUpdates而不使用交易, 結果也是一樣的奇妙. 請問前輩, Delphi 7 dbExpress MSSQL20可以做出東西嗎? 有做出來的前輩給點信心好不好呢? Bug實在是多的讓人快沒頭路了. 謝謝!
後來我把這個DataModule的內容拿開, 就可以了, 這是什麼問題呢? 難道DataModule裡的資料表有限制dbexpress元件的數量?
以下是我自網友互動區再轉貼過來, 讓大家幫幫忙, 如果有看過的前輩, 請見諒, 謝謝! 後來我發現, 不是DataModule裡的物件數量的問題. 應該是dbExpress本身單向cursor的問題吧, 我猜測的啦. why? 1.我在設計模式的時候, 所有的資料集物件都已開啟. 但我在程式執行的時候, 又不管它們有沒有開啟, 就全部Open一次. 2.後來我在設計模式把所有的dbExpress關閉, 就ok了. *--------------------------------------------------------------* "2.把這個DataModule的內容拿開, 就可以了,????????不了解這句," 裡面是一個Master/Detail的資料表,有放入用來Lookup的參考資料表.譬如說, 我把商品編號參考到商品主檔的商品編號, 然後Result商品名稱的欄位.
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-07 00:48:50 IP:211.76.xxx.xxx 未訂閱
引言: 後來我發現, 不是DataModule裡的物件數量的問題. 應該是dbExpress本身單向cursor的問題吧, 我猜測的啦. why? 1.我在設計模式的時候, 所有的資料集物件都已開啟. 但我在程式執行的時候, 又不管它們有沒有開啟, 就全部Open一次. 2.後來我在設計模式把所有的dbExpress關閉, 就ok了. *--------------------------------------------------------------* "2.把這個DataModule的內容拿開, 就可以了,????????不了解這句," 裡面是一個Master/Detail的資料表,有放入用來Lookup的參考資料表.譬如說, 我把商品編號參考到商品主檔的商品編號, 然後Result商品名稱的欄位.
我認為不是單向 cursor 的問題,因為 TClientDataSet 透過 TDataProvider 去將 Delta 的 Data Packet 轉成相對應的 SQL Command 再傳給 SQL Server 從觀察 TSQLMonitor 的訊息便可以觀察出許多互動.. 我在 Client/Server 架構 (use DataModule) 實驗都沒什麼問題,不過轉到 Multi-Tier 遇到重重障礙... 簡單提供您一個 Debug 方向,您可以將 TSQLMonitor 的訊息 log 起來 .. 發生錯誤的時候,去檢視 log 的訊息,裡面就是實際上送給 SQL Server 的 Command .. 如果發現,根本沒有出現 log ,那就是在 ClientDataSet 產生一些限制或錯誤 停止了送出 Data 與 Command.. 如果發現送出的 log 內,有 SQL Server 回傳的 Error Code,可以以此為線索查詢 .. 如果發現 log 內, 送出 SQL Server 的 Command 都有執行且 Server 正常回應,此時應該可以合理懷疑 dbExpress 可能有些 bug .. 我認為 dbExpress 在與 MSSQL 連接時的許多 bug 應該與底層是呼叫 M$ 的 OLE DB 有關.. 從 Delphi/BCB/Kylix Windows <-> Linux 跨平台,設計架構,微調效能與 TSQLConnection 監控能力,與 DataSnap 技術緊密結合,Borland 放棄 BDE ,全力支援 dbExpress , 精簡實作 Driver Engine 架構的角度來看, dbExpress 是相當有彈性與發展潛力的... ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ----
wb3599
一般會員


發表:32
回覆:32
積分:12
註冊:2004-02-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-08 03:01:47 IP:61.230.xxx.xxx 未訂閱
有Log,但不多, Debug程式後, 發現是錯在StartTransaction(X)這一行. 我剛開始有在論壇看到說要把MSSQL的餐數加上一行Multiple Transaction = True; 後來我試了之後, 剛開始可以, 但後來也無效了. 為什麼我會覺得是單向 cursor 的問題呢? 因為我把DataModule裡的其它與該作業無關的TClientDataSet打開之後, 若沒有移到最後一筆, 就是會出錯. 我就驗證是不是PacketRecords有問題呢? 結果我設-1沒事, 設一個大於0的數字, 會錯. 但, 我利用TSimpleDataSet來做相同的事, 就沒有問題. TSimpleDataSet與TSQLQuery差在哪裡呢? 而我的TSQLQuery還有配合TDataSetProvider與TClientDataSet, 理論上不是要與TSimpleDataSet相同嗎? 為什麼會這樣呢?
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-08 13:29:08 IP:211.76.xxx.xxx 未訂閱
引言: 有Log,但不多, Debug程式後, 發現是錯在StartTransaction(X)這一行. 我剛開始有在論壇看到說要把MSSQL的餐數加上一行Multiple Transaction = True; 後來我試了之後, 剛開始可以, 但後來也無效了. 為什麼我會覺得是單向 cursor 的問題呢? 因為我把DataModule裡的其它與該作業無關的TClientDataSet打開之後, 若沒有移到最後一筆, 就是會出錯. 我就驗證是不是PacketRecords有問題呢? 結果我設-1沒事, 設一個大於0的數字, 會錯. 但, 我利用TSimpleDataSet來做相同的事, 就沒有問題. TSimpleDataSet與TSQLQuery差在哪裡呢? 而我的TSQLQuery還有配合TDataSetProvider與TClientDataSet, 理論上不是要與TSimpleDataSet相同嗎? 為什麼會這樣呢?
wb3599 您好: 要不要上傳您的 Code ,因為不了解您在下 Transaction 的地方是做了什麼特別的處理,我自己做的一些實驗都還沒有碰到這樣的問題 (可能是我的實驗太簡單了) ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ---- 發表人 - SouthWind 於 2004/05/08 13:32:58
wb3599
一般會員


發表:32
回覆:32
積分:12
註冊:2004-02-11

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-05-10 23:52:44 IP:61.230.xxx.xxx 未訂閱
引言:
引言: 有Log,但不多, Debug程式後, 發現是錯在StartTransaction(X)這一行. 我剛開始有在論壇看到說要把MSSQL的餐數加上一行Multiple Transaction = True; 後來我試了之後, 剛開始可以, 但後來也無效了. 為什麼我會覺得是單向 cursor 的問題呢? 因為我把DataModule裡的其它與該作業無關的TClientDataSet打開之後, 若沒有移到最後一筆, 就是會出錯. 我就驗證是不是PacketRecords有問題呢? 結果我設-1沒事, 設一個大於0的數字, 會錯. 但, 我利用TSimpleDataSet來做相同的事, 就沒有問題. TSimpleDataSet與TSQLQuery差在哪裡呢? 而我的TSQLQuery還有配合TDataSetProvider與TClientDataSet, 理論上不是要與TSimpleDataSet相同嗎? 為什麼會這樣呢?
wb3599 您好: 要不要上傳您的 Code ,因為不了解您在下 Transaction 的地方是做了什麼特別的處理,我自己做的一些實驗都還沒有碰到這樣的問題 (可能是我的實驗太簡單了) ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ---- 發表人 - SouthWind 於 2004/05/08 13:32:58
假設若都是使用TSQLQuery, 我發現在交易中, 開啟了與交易不相關的檔案, 就會有問題. 例如, 我有一個出貨主檔, 出貨明細檔, 這兩個在同一個交易, 不會有問題, 但主檔會參考到的客戶檔(要用來做Lookup Field)如果還在的同一Form或DataModule中的話, 就會有問題. 解決的方式, 通通換成TSimpleDataSet就沒事了. 謝謝SouthWind的幫助!
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-05-17 10:48:28 IP:203.66.xxx.xxx 未訂閱
引言: 假設若都是使用TSQLQuery, 我發現在交易中, 開啟了與交易不相關的檔案, 就會有問題. 例如, 我有一個出貨主檔, 出貨明細檔, 這兩個在同一個交易, 不會有問題, 但主檔會參考到的客戶檔(要用來做Lookup Field)如果還在的同一Form或DataModule中的話, 就會有問題. 解決的方式, 通通換成TSimpleDataSet就沒事了. 謝謝SouthWind的幫助!
wb3599 您好: 你寄來的 mail 我收到了,幫你 debug 完了,不是 Transaction 的問題.. 是您 Details 的 ClientDataSet 內的 PacketRecords 不小心設成 0 .. 另外. Design Time 將元件 Active ,如果執行 raise Exception ,有時候元件會自動 close , ClientDataSet 元件又有 cache 住 data ,容易造成 debug 時的混亂,所以我在 DataModule OnCreate/OnDestory 做了元件 Open 與 Close 的動作,您可以參考看看.. 節錄 Delphi On-Line Help 的一段話.. To retrieve the metadata for a dataset, set PacketRecords to 0. When PacketRecords is zero, the provider returns only information from its dataset that defines the databaset structure, such as table, column, constraint, and domain definitions. 您誤會了 dbExpress 了,要使用 dbExpress DataSnap 雖然可以微調效能,不過也代表很多東西要手工打造... ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ----
系統時間:2024-09-09 18:19:33
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!