全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3010
推到 Plurk!
推到 Facebook!

ClientDataSet.Delta 資料如何顯示出來 ?

答題得分者是:Brian77
stillalive
初階會員


發表:7
回覆:148
積分:41
註冊:2004-04-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-04-10 02:03:43 IP:211.75.xxx.xxx 未訂閱
在下CLIENT端發出UPDATE指令 , 結果跑出 dismatch packetdata 錯誤訊息 . 我是用 tree tier 假構 , 在DCOM.APPSERVER.APPLYUPDATE 出問題 . 我懷疑是CLIENTDATASET.DELTA內容有誤 , 但其值為OLEVARIANT , 用WATCH DEBUG也看不出來 , 請問各位先進該如何是好 ?????
Brian77
中階會員


發表:8
回覆:114
積分:94
註冊:2002-05-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-04-10 03:24:23 IP:61.221.xxx.xxx 未訂閱
再另設一 TClientDataSet 將其 Data:=要看的delta; (記得觀察它的 UpdateStatus)
jieshu
版主


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-04-10 08:44:22 IP:61.70.xxx.xxx 未訂閱
引言: 在下CLIENT端發出UPDATE指令 , 結果跑出 dismatch packetdata 錯誤訊息 . 我是用 tree tier 假構 , 在DCOM.APPSERVER.APPLYUPDATE 出問題 . 我懷疑是CLIENTDATASET.DELTA內容有誤 , 但其值為OLEVARIANT , 用WATCH DEBUG也看不出來 , 請問各位先進該如何是好 ?????
可能是沒有異動資料,Delta是Null所以出現錯誤,可先判斷是否有異動: 1.ChangeCount要大於零。 2.VarIsNull(ClientDataSet1.Delta)要是False。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.coss.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
stillalive
初階會員


發表:7
回覆:148
積分:41
註冊:2004-04-07

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-04-10 09:28:35 IP:211.75.xxx.xxx 未訂閱
TO Brian77 再另設一 TClientDataSet 將其 Data:=要看的delta; (記得觀察它的 UpdateStatus) ============================================================== 不了 , 是否能說明更詳盡 ? TO JieShu 可能是沒有異動資料,Delta是Null所以出現錯誤,可先判斷是否有異動: 1.ChangeCount要大於零。 2.VarIsNull(ClientDataSet1.Delta)要是False ================================================================== changecount > 0 , delta is not null .
stillalive
初階會員


發表:7
回覆:148
積分:41
註冊:2004-04-07

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-04-10 10:39:15 IP:211.75.xxx.xxx 未訂閱
更正 , 應是ClientDataSet.Reconclie(Delta) 時出問題 . 如光只DCOM.APPSERVER.APPLYUPDATE 資料庫無UPDATE .
Brian77
中階會員


發表:8
回覆:114
積分:94
註冊:2002-05-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-04-10 11:42:13 IP:61.221.xxx.xxx 未訂閱
先針對觀察 Delta 這件事說明:
procedure xxxx(delta:OLEVARIANT);
var qrWork:TClientDataSet;
begin
  try qrWork:=TClientDataSet.Create;
  except ShowMessage('Err') exit;
  end;
  try
    try qrWork.Data:=delta; qrWork.First;
    except ShowMessage('空的, 沒有異動資料'); exit;
    end;
    Memo1.Lines.Clear;
    while not qrWork.EoF do
    begin
      case qrWork.UpdateStatus of
        usInsearted: Memo1.Lines.Add('新增');
        usModified: Memo1.Lines.Add('修改後的值');
        usDeleted: Memo1.Lines.Add('刪除');
        else Memo1.Lines.Add('修改前的值');
      end;
      // qrWork 擁有原 ClientDataSet 所有的欄位
      // 各欄位有 OldValue 和 NewValue
      // 沒有異動的欄位的 NewValue 可用 VarIsEmpty 檢測出 true
      qrWork.Next;
    end;
  finally
    try qrWork.Destroy; except end;
  end;
end;
Brian77
中階會員


發表:8
回覆:114
積分:94
註冊:2002-05-17

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-04-10 11:47:31 IP:61.221.xxx.xxx 未訂閱
ClientDataSet 的資料回寫: if ClientDataSet.ApplyUpdates(0)>0 then 更新時發生錯誤; (可置於 AfterPost 或儲存後的適當位置) 當發生錯誤時, 會觸發 ClientDataSet.onReconcileError 事件, 請撰寫該事件內容 另外, 也可以自行利用 Delta 的內容來將資料回寫到資料庫
Brian77
中階會員


發表:8
回覆:114
積分:94
註冊:2002-05-17

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-04-10 11:50:41 IP:61.221.xxx.xxx 未訂閱
重看一次問題, 看到 dismatch packetdata 似曾相識... 之前用 D7 dbExpress MSSQL 使用 PacketRecords 時, ApplyUpdate 會出現這個訊息... dbExpress FOR MSSQL 有蠻多 Bug 的, 不知你的是不是也匠
stillalive
初階會員


發表:7
回覆:148
積分:41
註冊:2004-04-07

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-04-10 13:31:51 IP:211.75.xxx.xxx 未訂閱
To Brain 大大 重看一次問題, 看到 dismatch packetdata 似曾相識... 之前用 D7 dbExpress MSSQL 使用 PacketRecords 時, ApplyUpdate 會出現這個訊息... dbExpress FOR MSSQL 有蠻多 Bug 的, 不知你的是不是也匠 =================================================================== 我已放棄用dbexpress元件 , 這case沒用dbexpress , 3-tier struture list below TDatabase TSeesion TQuery TDataProvider (AppServer Component) TDataProvider TClientDataSet TDataSource TDBGrid (Client Component) 另外大大所附code 尚有疑問 procedure xxxx(delta:OLEVARIANT); var qrWork:TClientDataSet; begin try qrWork:=TClientDataSet.Create; except ShowMessage('Err') exit; end; try try qrWork.Data:=delta; qrWork.First; except ShowMessage('空的, 沒有異動資料'); exit; end; Memo1.Lines.Clear; while not qrWork.EoF do begin case qrWork.UpdateStatus of usInsearted: Memo1.Lines.Add('新增'); usModified: Memo1.Lines.Add('修改後的值'); usDeleted: Memo1.Lines.Add('刪除'); else Memo1.Lines.Add('修改前的值'); ======================================================= Memo1.Lines.Add(?) , 這裡面變數該如何去擺 ???? 不好意思 , 真是太囉嗦了 .
jieshu
版主


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-04-11 08:57:04 IP:61.70.xxx.xxx 未訂閱
引言: 更正 , 應是ClientDataSet.Reconclie(Delta) 時出問題 . 如光只DCOM.APPSERVER.APPLYUPDATE 資料庫無UPDATE .
那就先判斷
if not VarIsNull(Delta) then
  ClientDataSet.Reconclie(Delta);
應該是你Update過程中有問題,不然做完DataSetProvider.ApplyUpdates應該資料就會寫入資料庫,你可用SQL Monitor看一下更新的SQL。 另外Delta應該是DataSetProvider.ApplyUpdates所傳回的值,詳細請參考這篇 【問題】多層架構的自動編號 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=46216
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.coss.com.tw/jieshu/
發表人 - jieshu 於 2004/04/11 09:15:20
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
Brian77
中階會員


發表:8
回覆:114
積分:94
註冊:2002-05-17

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-04-11 13:20:34 IP:61.221.xxx.xxx 未訂閱
常遇到的 ApplyUpdates 後資料庫沒有異動的原因是下 ApplyUpdates 時沒有判斷傳回值是否大於 0 又沒寫 onReconcileError 事件 當發生錯誤時, 並不會有例外發生, 因此雖然沒有回寫成功, 程式還是往下跑了    顯示各欄位的方法:
var i:integer; mStr:String;
for i:=0 to qrWork.Fields.Count-1 do
begin
  if VarIsEmpty(qrWork.Fields[0].NewValue) then mStr:='[不變]'
  else if VarIsNull(qrWork.Fields[0].NewValue) then mStr:='[NULL]'
  else mStr:=qrWork.Fields[0].NewValue;
  Memo1.Lines.Add(qrWork.Fields[0].FieldName '=' mStr);
end;
stillalive
初階會員


發表:7
回覆:148
積分:41
註冊:2004-04-07

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-04-12 15:03:09 IP:211.75.xxx.xxx 未訂閱
多謝 BRAIN77 網友熱心解答 . 再次感謝 .
系統時間:2024-05-04 13:27:25
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!