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

datasnap + clientdataset 無法新增資料

缺席
firesu
中階會員


發表:26
回覆:28
積分:55
註冊:2004-12-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2018-05-07 09:19:03 IP:60.248.xxx.xxx 未訂閱
datasnap server 有個getdata的function, 回傳OleVariant

[code delphi]
function TServerMethods1.GetData(sql: string): OleVariant;
begin
result := null;
Qry.close;
DSP1.DataSet := Qry;
Qry.SQL.Text := sql;
Qry.Open;
Result := DSP1.Data;
Qry.Close;
end;
[/code]

client端用clientdataset.data接收這個OleVariant
[code delphi]
procedure TuserF.GetUser;
var Server:TServerMethods1Client;
v: OleVariant;
sqls:string;
begin
ClientModule1.DSProviderConnection1.Connected := False;
ClientModule1.SQLConnection1.Connected := False;
ClientModule1.SQLConnection1.Params.Values['HostName'] := serverip;//Trim(Edit3.Text);
ClientModule1.SQLConnection1.Connected := true;
ClientModule1.DSProviderConnection1.Connected := true;
server := TServerMethods1Client.Create(ClientModule1.SQLConnection1.DBXConnection);
ClientModule1.cds_user.Close;
sqls := 'select * from xxxxxxxxxxxxxxxx';
v := server.GetData(sqls);
if not VarIsNull(v) then begin
ClientModule1.cds_user.Data := v;
end;
ClientModule1.cds_user.Open;
ClientModule1.cds_user.CancelUpdates;
freeandnil(server);
end;
[/code]

修改 / 刪除 沒問題,但是新增時會有 invalid value for field 'xxxx' 的錯誤...?
(單一clientdataset元件, 沒有與datasetprovider連接)
[code delphi]
ClientModule1.cds_user.Append;
ClientModule1.cds_user.FieldByName('uname').Value :='123';
ClientModule1.cds_user.Post;
[/code]
編輯記錄
firesu 重新編輯於 2018-05-07 09:22:15, 註解 無‧
firesu 重新編輯於 2018-05-07 09:25:15, 註解 無‧
firesu 重新編輯於 2018-05-07 09:48:32, 註解 無‧
firesu 重新編輯於 2018-05-07 09:50:34, 註解 無‧
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2018-05-07 13:38:04 IP:59.120.xxx.xxx 未訂閱
直接用 .Value 在潛式轉換中可能會發生錯誤,有看到您已先建立 Fields,故可使用 ClientModule1.cds_useruname.Value,這裡的 Value 將會是硬型別,就能知道是哪邊出問題。

另外,Field 的 Size 也要確認長度是否足夠。
===================引 用 firesu 文 章===================
datasnap server 有個getdata的function, 回傳OleVariant

[code delphi]
function TServerMethods1.GetData(sql: string): OleVariant;
begin
result := null;
Qry.close;
DSP1.DataSet := Qry;
Qry.SQL.Text := sql;
Qry.Open;
Result := DSP1.Data;
Qry.Close;
end;
[/code]

client端用clientdataset.data接收這個OleVariant
[code delphi]
procedure TuserF.GetUser;
var Server:TServerMethods1Client;
v: OleVariant;
sqls:string;
begin
ClientModule1.DSProviderConnection1.Connected := False;
ClientModule1.SQLConnection1.Connected := False;
ClientModule1.SQLConnection1.Params.Values['HostName'] := serverip;//Trim(Edit3.Text);
ClientModule1.SQLConnection1.Connected := true;
ClientModule1.DSProviderConnection1.Connected := true;
server := TServerMethods1Client.Create(ClientModule1.SQLConnection1.DBXConnection);
ClientModule1.cds_user.Close;
sqls := 'select * from xxxxxxxxxxxxxxxx';
v := server.GetData(sqls);
if not VarIsNull(v) then begin
ClientModule1.cds_user.Data := v;
end;
ClientModule1.cds_user.Open;
ClientModule1.cds_user.CancelUpdates;
freeandnil(server);
end;
[/code]

修改 / 刪除 沒問題,但是新增時會有 invalid value for field 'xxxx' 的錯誤...?
(單一clientdataset元件, 沒有與datasetprovider連接)
[code delphi]
ClientModule1.cds_user.Append;
ClientModule1.cds_user.FieldByName('uname').Value :='123';
ClientModule1.cds_user.Post;
[/code]
firesu
中階會員


發表:26
回覆:28
積分:55
註冊:2004-12-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2018-05-07 14:49:55 IP:60.248.xxx.xxx 未訂閱
補充一下
這個是 XE7 Multi-Device Application, complier成win32的程式

原先寫法
ClientModule1.cds_user.Append;
ClientModule1.cds_user.FieldByName('upw').Value :='123';
debug會依序出現2個錯誤訊息

改成版主的寫法
ClientModule1.cds_useruname.Value := '123';
只出現上面的第1個錯誤訊息

另外測試開1個win32的專案


[code delphi]
procedure TForm1.Button1Click(Sender: TObject);
begin
//clientdataset1.Active := true;
clientdataset1.Append;
clientdataset1.FieldByName('uname').Value := '123';
clientdataset1.Post;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ADOQuery2.Close;
ADOQuery2.Open;
clientdataset1.Data := DSP2.Data;
ADOQuery2.close;
end;
[/code]
button2, ClientDataSet讀入data


該不會是Multi-Device 的專案不能這樣子用...@@

===================引 用 GrandRURU 文 章===================
直接用 .Value 在潛式轉換中可能會發生錯誤,有看到您已先建立 Fields,故可使用 ClientModule1.cds_useruname.Value,這裡的 Value 將會是硬型別,就能知道是哪邊出問題。

另外,Field 的 Size 也要確認長度是否足夠。
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2018-05-07 16:46:30 IP:59.120.xxx.xxx 未訂閱
XE7 + FMX Server + FMX Client

無法重現您的問題,能再詳述您的專案嗎?
===================引 用 firesu 文 章===================
補充一下
這個是 XE7 Multi-Device Application, complier成win32的程式

原先寫法
ClientModule1.cds_user.Append;
ClientModule1.cds_user.FieldByName('upw').Value :='123';
debug會依序出現2個錯誤訊息

改成版主的寫法
ClientModule1.cds_useruname.Value := '123';
只出現上面的第1個錯誤訊息

另外測試開1個win32的專案


[code delphi]
procedure TForm1.Button1Click(Sender: TObject);
begin
//clientdataset1.Active := true;
clientdataset1.Append;
clientdataset1.FieldByName('uname').Value := '123';
clientdataset1.Post;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ADOQuery2.Close;
ADOQuery2.Open;
clientdataset1.Data := DSP2.Data;
ADOQuery2.close;
end;
[/code]
button2, ClientDataSet讀入data


該不會是Multi-Device 的專案不能這樣子用...@@

===================引 用 GrandRURU 文 章===================
直接用 .Value 在潛式轉換中可能會發生錯誤,有看到您已先建立 Fields,故可使用 ClientModule1.cds_useruname.Value,這裡的 Value 將會是硬型別,就能知道是哪邊出問題。

另外,Field 的 Size 也要確認長度是否足夠。
firesu
中階會員


發表:26
回覆:28
積分:55
註冊:2004-12-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2018-05-07 17:21:21 IP:60.248.xxx.xxx 未訂閱
找到原因了...
name2是ListView要用來LiveBindings的計算欄位

===================引 用 GrandRURU 文 章===================
XE7 FMX Server FMX Client

無法重現您的問題,能再詳述您的專案嗎?
系統時間:2024-04-27 13:58:23
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!