ClientDataset更新實驗 |
缺席
|
feng
一般會員 發表:13 回覆:34 積分:14 註冊:2002-10-09 發送簡訊給我 |
最近在使用 ClientDataSet時發生一些問題,做了一個實驗,結果蠻奇怪的,如果大家有空的話,是否可以看看會不會跟我發生一樣的現象: 1.ADOConnect 連 mssql
2.adodatsset1 連 ADOConnect
3.dataprovider 連 adodataset1
3.clientdataset1 連 dataProvider
3.datasource 連 clientdataset1
4.dbgrid 連 datasorce
就是(ADOConnect -> ADODataSet -> DataProvider -> ClientDataSet -> Datasource -> dbgrid)
(其中 dataprovider 的 ResolveToDataSet := TRUE,餘皆預設) 執行時,如果在dbgrid裡變更資料(包括改成 null),只要執行 clientdataset1.applyupdate ,更新完全沒問題。 <問題>
承接上面的設計,多加上 一組 (clientdataset2 -> datasource2 -> dbgird2) 當 clientdataset1 開啟之後 執行
clientdataset2.xmldata := clientdataset1.xmldata
接著可以在 dbgrid2 裡編輯沒問題,但如果要將資料更新,則執行以下
clientdataset1.xmldata := clientdataset2.xmldata;
這時候去觀察 clientdataset1 的資料,確實也保含了 clientdataset2 內的資料(包括更新的) 可是這時候執行 clientdataset1.applyupdate
我發現,只要是資料新值裡含有 null 的那筆資料,就不會被更新。
直接觀察 sql server ,含有null值的那筆更新敘述並不會被產生。 一樣的情況,如果改成 clientdataset2.data := clientdata1.data 就 ok 夠詭異吧,如果有人願意花點時間實驗,麻煩跟我講一下結果,謝謝。 發表人 - feng 於 2004/01/01 11:43:39
|
feng
一般會員 發表:13 回覆:34 積分:14 註冊:2002-10-09 發送簡訊給我 |
|
mustapha.wang
資深會員 發表:89 回覆:409 積分:274 註冊:2002-03-13 發送簡訊給我 |
|
feng
一般會員 發表:13 回覆:34 積分:14 註冊:2002-10-09 發送簡訊給我 |
|
linyijen
一般會員 發表:0 回覆:3 積分:5 註冊:2002-09-11 發送簡訊給我 |
|
linyijen
一般會員 發表:0 回覆:3 積分:5 註冊:2002-09-11 發送簡訊給我 |
我知道了, 用VariantArrayToString & VariantArrayToString就可以轉換了程式如下: 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的格式了.^^.
|
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
引言: 我知道了, 用VariantArrayToString & VariantArrayToString就可以轉換了程式如下: 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的格式了.^^.请问 VariantArrayToString 这个function是DELPHI提供的吗?我在D7的HELP里怎么查不到? 發表人 - pcplayer99 於 2004/05/26 00:10:52 |
feng
一般會員 發表:13 回覆:34 積分:14 註冊:2002-10-09 發送簡訊給我 |
以下2個Fnction給您參考,
主要是將 ClientDataSet.Data 的屬性轉成 Base64編碼的文字格式以利在網路上傳送與接收。
function Str2Var(const InputString: string): OleVariant; function HexToInt(Value: Char): integer; begin result := 0; case Value of '0'..'9': result := Ord(Value) - 48; 'A'..'F': result := Ord(Value) - 55; 'a'..'f': result := Ord(Value) - 87; end; end; var oVarStream: TVariantStream; oDataOut: TMemoryStream; P: PByteArray; Flags: TVarFlags; i, j: integer; begin if Length(InputString) > 0 then begin oVarStream := TVariantStream.Create; oDataOut := TMemoryStream.Create; try oDataOut.SetSize(Length(InputString) div 2); P := oDataOut.Memory; j := 1; for i := 0 to oDataOut.Size - 1 do begin P^[i] := Byte(HexToInt(InputString[j]) * 16 HexToInt(InputString[j 1])); Inc(j, 2); end; result := oVarStream.ReadVariant(Flags, oDataOut); finally oDataOut.Free; oVarStream.Free; end; end else result := Null; end; function Var2Str(const InputVariant: OleVariant): string; var oVarStream: TVariantStream; oDataOut: TMemoryStream; P: Pchar; sHex: string; i, j: integer; begin result := ''; oVarStream := TVariantStream.Create; oDataOut := TMemoryStream.Create; try oVarStream.WriteVariant(InputVariant, oDataOut); SetLength(result, oDataOut.Size * 2); P := oDataOut.Memory; j := 1; for i := 1 to oDataOut.Size do begin sHex := IntToHex(Integer(P^), 2); result[j] := sHex[1]; Inc(j); result[j] := sHex[2]; Inc(j); Inc(P); end; finally oDataOut.Free; oVarStream.Free; end; end; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |