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

使用ClientDataSet 更新 NULL 值

答題得分者是:linyijen
feng
一般會員


發表:13
回覆:34
積分:14
註冊:2002-10-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-12-31 03:07:27 IP:61.231.xxx.xxx 未訂閱
使用 MSSQL2000 欄位值是 tinyint 當我使用 ClientDataSet 在前端將某些欄位清空,(譬如在DBGrid裡清空,或使用 Fields[i].clear) ,但是卻無法更新回後端資料庫。 如果是自己寫更新,應該是可以用 set null 之類的指令完成吧(沒試過) 但如果不想自己寫更新,而交給clientdataset與dataProvider完成,該如何做呢? 或者有沒有指令可以讓 sql server知道,只要post進來的欄位值是不能接受的就使用null值代替(我是說更新資料時,而不是新增) 我的測試在 datasetprovider 的 onupdatedata 裡寫碼去改,並不發生作用,因為我一直沒辦法在 COM 裡除錯,所以不知道到底執行的狀況如何,把資料庫欄位改成 varchar 也不行。
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-12-31 08:56:35 IP:218.163.xxx.xxx 未訂閱
可以在Field之onSetText
procedure TForm1.Query1field1SetText(Sender: TField; const Text: String);
begin
  if Trim(Text)='' then
    Sender.value:=null
  else
    Sender.asstring:=text; 
end;
另:自行用SetNull當然可以
feng
一般會員


發表:13
回覆:34
積分:14
註冊:2002-10-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-12-31 09:50:23 IP:61.231.xxx.xxx 未訂閱
我把您說的程式碼寫在後端 ADODataSet 裡,結果還是不行。 因為我前端AP會先呼叫 webservice 再把更新的資料傳給 COM 裡得 Clientdataset再更新,所以,我在 後端的 clientdataset裡也加入,也是不行。 我的資料庫明明就是設定為允許null,而且applyupdate(0)也沒有出現錯誤,真奇怪。
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-12-31 11:24:37 IP:218.163.xxx.xxx 未訂閱
寫在Client的ClientDataSet該欄位之onSetText上
feng
一般會員


發表:13
回覆:34
積分:14
註冊:2002-10-09

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-12-31 12:01:04 IP:61.231.xxx.xxx 未訂閱
還是不行。有沒有可能是我後端的一些設定譬如說 ADO 或 DataSetProvider 的設定有關呢?或者是傳輸過程中 XML 編碼的問題?因為就算不加上程式碼,我看 client端 clientdataset 的 delta 值,確實被改成 null 值了(用 field[].AsVariant = null 判斷)。 還是非常謝謝你。
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-01-02 09:29:42 IP:218.1.xxx.xxx 未訂閱
引言: 還是不行。有沒有可能是我後端的一些設定譬如說 ADO 或 DataSetProvider 的設定有關呢?或者是傳輸過程中 XML 編碼的問題?因為就算不加上程式碼,我看 client端 clientdataset 的 delta 值,確實被改成 null 值了(用 field[].AsVariant = null 判斷)。 還是非常謝謝你。
按Midas的资料结构,TClientDataSet的Delta,假如修改了一笔资料,delta有两笔:第一笔为修改前的,第二笔为修改的(记录了哪些值修改了,不是修改后的):
Field1  Field2  Field3
A       B       C
AA      null    CC
这样,表示Fields2没有修改,不是表示它修改成了Null,因此,这样的结构,它是没办法处理null的。或许,Borland认为,null只是一种初始状态,一旦修改就不再是null了。同时,也配合了它的TDataSetProvider的UpdateMode的upWhereChanged选项。 久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听 發表人 - mustapha.wang 於 2004/01/02 09:32:41
------
江上何人初见月,江月何年初照人
feng
一般會員


發表:13
回覆:34
積分:14
註冊:2002-10-09

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-01-02 21:27:12 IP:61.231.xxx.xxx 未訂閱
沒錯,得確是如此,原本以為消失的欄位代表的是 NULL ,其實是被視為不更新。我對XML不熟,或者是XML在傳遞 NULL 值有困難..... 總之,目前看來用 xmldata 似乎是沒辦法更新 NULL 值了。
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-01-05 10:55:47 IP:218.1.xxx.xxx 未訂閱
引言: 沒錯,得確是如此,原本以為消失的欄位代表的是 NULL ,其實是被視為不更新。我對XML不熟,或者是XML在傳遞 NULL 值有困難..... 總之,目前看來用 xmldata 似乎是沒辦法更新 NULL 值了。
据我测试,data和xmldata都不能更新null值的。 久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听
------
江上何人初见月,江月何年初照人
feng
一般會員


發表:13
回覆:34
積分:14
註冊:2002-10-09

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-01-05 22:06:52 IP:61.231.xxx.xxx 未訂閱
嗯,我目前的作法是將 cds.data 編成文字模式之後再傳送,是可以的。 也就是說,我測試的結果是 cds.data 可以更新 null 值 (後端是 sql server 2000 欄位是 int 允許 NULL)
linyijen
一般會員


發表:0
回覆:3
積分:5
註冊:2002-09-11

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-01-10 22:36:19 IP:203.144.xxx.xxx 未訂閱
用VariantArrayToString & VariantArrayToString就可以轉換ClientDataSet.Data了.程式如下: uses DSIntf; procedure TForm1.Update; var s: string; begin if cds1.ChangeCount > 0 then begin cds2.Data := cds1.Delta; s := VariantArrayToString(cds2.Data); // s 為 Binary的格式, 可以另做壓縮和編碼的動作... cds3.Data := StringToVariantArray(s); if cds3.ApplyUpdates(0) > 0 then begin ShowMessage('no'); end else begin cds1.MergeChangeLog; showmessage('yes'); end; end; end; 這樣就可以解決 Assign Null 的問題了, 不會受限於 XMLData 無法 Assign Null的問題了, 若作成WebService就不再是傳XMLData的格式了.^^.
系統時間:2024-10-06 20:42:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!