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

DataSnap Client 的問題

缺席
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2014-07-09 17:12:12 IP:118.160.xxx.xxx 未訂閱
請問各位!

XE5 和 XE6 對於 DataSanp Client 的建立完全不一樣了, 請問有沒有人知道 xe6 要如何處理

xe5 產生 DataSnap Client 時在 ClientClassesUnit 如下
因為在產生時, 系統會詢問是否要包含 DataSnapSever 的 Method, 然後自動產生以下的code(完整的)

//
// Created by the DataSnap proxy generator.
// 2014/1/29 下午 11:18:19
//
unit ClientClassesUnit1;
interface
uses Data.DBXCommon, Data.DBXClient, Data.DBXDataSnap, Data.DBXJSON,
Datasnap.DSProxy, System.Classes, System.SysUtils, Data.DB,
Data.SqlExpr, Data.DBXDBReaders, Data.DBXCDSReaders, Data.DBXJSONReflect;
type
TServerMethods1Client = class(TDSAdminClient)
private
FEchoStringCommand: TDBXCommand;
FReverseStringCommand: TDBXCommand;
public
constructor Create(ADBXConnection: TDBXConnection); overload;
constructor Create(ADBXConnection: TDBXConnection; AInstanceOwner: Boolean); overload;
destructor Destroy; override;
function EchoString(Value: string): string;
function ReverseString(Value: string): string;
end;
implementation
function TServerMethods1Client.EchoString(Value: string): string;
begin
if FEchoStringCommand = nil then
begin
FEchoStringCommand := FDBXConnection.CreateCommand;
FEchoStringCommand.CommandType := TDBXCommandTypes.DSServerMethod;
FEchoStringCommand.Text := 'TServerMethods1.EchoString';
FEchoStringCommand.Prepare;
end;
FEchoStringCommand.Parameters[0].Value.SetWideString(Value);
FEchoStringCommand.ExecuteUpdate;
Result := FEchoStringCommand.Parameters[1].Value.GetWideString;
end;
function TServerMethods1Client.ReverseString(Value: string): string;
begin
if FReverseStringCommand = nil then
begin
FReverseStringCommand := FDBXConnection.CreateCommand;
FReverseStringCommand.CommandType := TDBXCommandTypes.DSServerMethod;
FReverseStringCommand.Text := 'TServerMethods1.ReverseString';
FReverseStringCommand.Prepare;
end;
FReverseStringCommand.Parameters[0].Value.SetWideString(Value);
FReverseStringCommand.ExecuteUpdate;
Result := FReverseStringCommand.Parameters[1].Value.GetWideString;
end;
constructor TServerMethods1Client.Create(ADBXConnection: TDBXConnection);
begin
inherited Create(ADBXConnection);
end;

constructor TServerMethods1Client.Create(ADBXConnection: TDBXConnection; AInstanceOwner: Boolean);
begin
inherited Create(ADBXConnection, AInstanceOwner);
end;

destructor TServerMethods1Client.Destroy;
begin
FEchoStringCommand.DisposeOf;
FReverseStringCommand.DisposeOf;
inherited;
end;
end.


但xe6在建立時, 沒有這段的詢問, 而產生出來的是這樣, 怎麼會這樣呢?

//
// Created by the DataSnap proxy generator.
// 2014/7/9 下午 03:57:47
//
unit ClientClassesUnit1;
interface
uses System.JSON, Data.DBXCommon, Data.DBXClient, Data.DBXDataSnap, Data.DBXJSON, Datasnap.DSProxy, System.Classes, System.SysUtils, Data.DB, Data.SqlExpr, Data.DBXDBReaders, Data.DBXCDSReaders, Data.DBXJSONReflect;
type
implementation
end.

P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2014-07-10 01:48:16 IP:118.160.xxx.xxx 未訂閱
已找到問題了, 

原因是我是使用 xe5 的 DataSnap 建置的, 然後移植到 xXE6(up1) 上, 我猜想 embd 對 DataSnap 做了一定幅度的改變(因為由 file 中要拉project 的名稱定義來看, xe5 與 xe6 就已經不一樣了), 所以 xe5 的 datasnap 與 xe6 的 datasnap 無法相容

而且更進一步發現 如果你原先是以 xe5 建置 DataSnap Server , 是無法移到 xe6 上來設計的(這是我遇到花了5天所得到的操作證實), 雖然 xe5 做好的 Server 與 Client 在 xe6 上是可以編譯通過及運行沒有問題的, 但如果我在 DataSnap Server上要修改 DataSetProvidor 相關的 DataSet, 在 xe5 轉上 xe6 的 DataSnap ClientDataSet 上的 Provider Name 無論如何都不會連結到 Snap Server上找到對應的 Providor, 所以我的做法只能土法練鋼, 利用 xe6 建一個新的 DataSnap Server , 取得 Server 的 TServerMethodsUnit1.pas, 把原來 xe5 上的相同的檔案給 Remove後, 把這個 xe6 產生的檔案重新加入原 xe5 的專案中, 再把 原xe5這支程式所有的內容 "剪" "貼"到新程式上,
唉! 其實寫了一堆, 也不知道在寫什麼(真的很不好表達), 但這幾天下來的心得就是

XE5 的 DataSnap Server 如果要繼續在 XE6 上設計生存下去, 不能就 XE5 原來的檔案移植上來, 要在 XE6上新建 DataSnap Server, 再把原 XE5的 CODE 全部貼到 XE6上來才會正常!
這是我操作的經驗, 不代表官方的說法, 也不一定對, 只是和各位分享一下!
GrandRURU
站務副站長


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2014-07-10 08:51:46 IP:59.120.xxx.xxx 訂閱
不一定要依賴精靈產生器

有試過底下的功能嗎?



ClientDataSet.ProviderName 找不到 DataSetProvider 這部分

是指在 XE6 底下新建的 DataSnap Server / Client 就會正常嗎?

P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2014-07-10 10:23:01 IP:118.160.xxx.xxx 未訂閱
ruru兄, DataSnap 對我來說是初學人門, 對它我是完全陌生的, 所以只能依賴產生器, 其他我不知道還有什麼較高階的方式, 所以...

另外的問題
是的, 我先前是以XE5 所產生的 DataSnap Sever, Client 專案在 XE6,下進行修改, 但不管怎樣就是抓不到 CleintDataSet 的 DataProvidor(空白),
我以為是程式有問題, 回頭再用 xe5 竟然是可以的, 回到 xe6 就不行, 還會出現 Can not found ServerMethod1.getAs.... (我忘了後面的訊息)
後來又以 XE6 直接建立一個 DataSnap Client (因為 XE5 及 XE6 的 Client 不太一樣, 懷疑是版本問題), 用XE6的 Client 建立的專案來讀取 XE5 建立的 Server,
還是抓不到, 它不出來就不出來, connect 都正常, 後來以 XE6 直接建立 Server 及 Client , 還是不行,
結果我發現在 XE5 時, 我建立的 DataSnap Server是選擇 TDataModule (有Componment, TDataModule, TDSServerMoudle),
最後我重建一個 TDSServerModule 的專案, 終於抓到了 DatasetProvidor
以上是我花了五天時間一項項去run出來的, 但不代表我的觀念或動作是絕對正確, 我不是做學術研究, 所以在可以抓到Providor 之後,
我也沒有時間再去研究 xe5 與 xe6 有何不同, 大概就是這樣了
===================引 用 GrandRURU 文 章===================
不一定要依賴精靈產生器

有試過底下的功能嗎?



ClientDataSet.ProviderName 找不到 DataSetProvider 這部分

是指在 XE6 底下新建的 DataSnap Server / Client 就會正常嗎?

GrandRURU
站務副站長


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2014-07-10 11:43:07 IP:59.120.xxx.xxx 訂閱
PD版大
我明白你的意思了。所以應該是兩個問題:

一、圖中的操作方式是帶 REST function。
按 PD 版大的需求,這步驟是多餘的

二、XE6 TClientDataSet 無法正常抓到 ProviderName
這算 Bug 吧,還是盡早回報 QC 比較好


以上

===================引 用 P.D. 文 章===================
ruru兄, DataSnap 對我來說是初學人門, 對它我是完全陌生的, 所以只能依賴產生器, 其他我不知道還有什麼較高階的方式, 所以...

另外的問題
是的, 我先前是以XE5 所產生的 DataSnap Sever, Client 專案在 XE6,下進行修改, 但不管怎樣就是抓不到 CleintDataSet 的 DataProvidor(空白),
我以為是程式有問題, 回頭再用 xe5 竟然是可以的, 回到 xe6 就不行, 還會出現 Can not found ServerMethod1.getAs.... (我忘了後面的訊息)
後來又以 XE6 直接建立一個 DataSnap Client (因為 XE5 及 XE6 的 Client 不太一樣, 懷疑是版本問題), 用XE6的 Client 建立的專案來讀取 XE5 建立的 Server,
還是抓不到, 它不出來就不出來, connect 都正常, 後來以 XE6 直接建立 Server 及 Client , 還是不行,
結果我發現在 XE5 時, 我建立的 DataSnap Server是選擇 TDataModule (有Componment, TDataModule, TDSServerMoudle),
最後我重建一個 TDSServerModule 的專案, 終於抓到了 DatasetProvidor
以上是我花了五天時間一項項去run出來的, 但不代表我的觀念或動作是絕對正確, 我不是做學術研究, 所以在可以抓到Providor 之後,
我也沒有時間再去研究 xe5 與 xe6 有何不同, 大概就是這樣了
系統時間:2024-04-16 21:32:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!