用Interface回傳DataSet |
答題得分者是:speedup
|
Darkn
一般會員 發表:5 回覆:10 積分:3 註冊:2003-02-12 發送簡訊給我 |
|
speedup
資深會員 發表:19 回覆:259 積分:280 註冊:2003-07-04 發送簡訊給我 |
利用Interface 傳的參數型態會受到限制(比方說不能傳自定型態或類別),最方便的方式莫過於利用OleVariant型態,將DataSet包成OleVariant型態
其中可利用TClientDataSet的Data屬性來包成/解出OleVariant
如
//Server ... cds:TClientDataSet; ... function GetDataSet:Olevariant; stdcall; begin result := cds.Data; end; //Client cds.data := SocketConnection1.GetDataSet;當然若要包任意TDataSet型態,可利用TDataSetProvider的Data屬性 若真的不想用TDataSetProvider 或TClientDataSet那請自行把DataSet包成OleVariant或Text的型態傳給前端 混心雜欲 棄修身~唉
------
唉~ |
Darkn
一般會員 發表:5 回覆:10 積分:3 註冊:2003-02-12 發送簡訊給我 |
|
Darkn
一般會員 發表:5 回覆:10 積分:3 註冊:2003-02-12 發送簡訊給我 |
|
speedup
資深會員 發表:19 回覆:259 積分:280 註冊:2003-07-04 發送簡訊給我 |
引言: 不好意思。 又遇到了點問題 我透過clientDataSet.data 從 Server 傳到 client 在server端傳之前我看到的確是有資料 可是傳到client時 我要使用時就出現 Can not perform opertion on a closed dataset 我是不是要先把他打開?? 可是client的dataset我並沒有指定proveider name 這樣可以開嗎?? 麻煩指導一下 謝謝請問錯誤訊息是由Server傳出或Client傳出? 當把值塞入ClentDataSet.Data時,ClentDataSet會自動Active並不需要事先Open,不過要讀出ClentDataSet.Data 時必須先確認ClentDataSet是open的 上述錯誤訊息,我的經驗通常是在對某一DataSet操作過程中(如lookup or 在事件中撰寫Code)會連帶引用另一DataSet的資料,而該DataSet尚未Active (即DataSet active 先後順序的問題) 如果還是有問題 ,把Source Code post 上來,大家研究看看 混心雜欲 棄修身~唉
------
唉~ |
Darkn
一般會員 發表:5 回覆:10 積分:3 註冊:2003-02-12 發送簡訊給我 |
錯誤訊息是發生在client端的
我也試過去active Clientdataset
可是 'miss data provider or data packet' 我並沒有指定
provider Name 因為我打算用interface抓取資料 所以我才搞不懂 [Source Code]
(Server)
function TReWorkAppServer.GetComputerInfo(const Name,
Type: WideString): OleVariant;
begin
ADOStoredProc1.Parameters[1].Value := Name;
ADOStoredProc1.Parameters[2].Value := Type;
ADOStoredProc1.Open;
Result:=ClientDataSet1.data;
end; (client)
DataModule2.SocketConnection1.Connected :=true;
DataModule2.ClientDataSet1.data:=DataModule2.SocketConnection1.AppServer.GetComputerInfo(Name,Type);
ShowMessage(IntToStr(DataModule2.ClientDataSet1.RecordCount)); 謝謝
|
speedup
資深會員 發表:19 回覆:259 積分:280 註冊:2003-07-04 發送簡訊給我 |
引言: [Source Code] (Server) function TReWorkAppServer.GetComputerInfo(const Name, Type: WideString): OleVariant; begin ADOStoredProc1.Parameters[1].Value := Name; ADOStoredProc1.Parameters[2].Value := Type; ADOStoredProc1.Open; Result:=ClientDataSet1.data; <--錯誤由此造成 end; (client) DataModule2.SocketConnection1.Connected :=true; DataModule2.ClientDataSet1.data:=DataModule2.SocketConnection1.AppServer.GetComputerInfo(Name,Type); ShowMessage(IntToStr(DataModule2.ClientDataSet1.RecordCount)); 謝謝Server 端的ClentDataSet並未猜塞資料進去 你可改寫如下試試 function TReWorkAppServer.GetComputerInfo(const Name, Type: WideString): OleVariant; var pd:TDataSetProvider; begin ADOStoredProc1.Parameters[1].Value := Name; ADOStoredProc1.Parameters[2].Value := Type; ADOStoredProc1.Open; pd := TDataSetProvider.Create(self); try pd.DataSet := ADOStoredProc1; //利用TDataSetProvider協助將ADOStoredProc1資料轉成 Olevariant Result:=pd.data; finally pd.free; end; end;混心雜欲 棄修身~唉
------
唉~ |
Darkn
一般會員 發表:5 回覆:10 積分:3 註冊:2003-02-12 發送簡訊給我 |
|
borlandor
一般會員 發表:0 回覆:2 積分:0 註冊:2003-10-31 發送簡訊給我 |
|
speedup
資深會員 發表:19 回覆:259 積分:280 註冊:2003-07-04 發送簡訊給我 |
不管你有無自行開Interface方法,基本上你所設計的DCOM(Remote Data Module) 或 COM (Transaction Data Module) 所輸出的Interface都會繼承至
IAppServer(沒忘了的話,大概有七的方法)而TDataSetProvider 基本上間接實作IAppServer的方法並將其轉成事件(Event)的方式讓一般不太懂Object Pascal也可以很容易的來變更IAppServer,且如果你把程式邏輯撰寫在TDataSetProvider事件中,基本上是不需要作任何交易控制,因為TDataSetProvider已經把相關交易控制實作完了,在把需要user自定邏輯的部份化成事件讓user自己撰寫。 TDataSetProvider 可視為用來間接實做IAppServer功能的元件
TClientDataSet 可視為用來用來運用IAppServer的元件
如果自行開Interface方法的話,我通常把上述兩者拿來將TDataSet資料包成XML或OleVariant傳資料 基本上,善用IAppServer已經可達成任何需求,且較不易出錯
除非你擔任系統架構師才要規劃Ineterface(這是須要非常多的經驗和KnowHow才可規劃出好的可以重覆使用的Ineterface架構) 如果真要自行開Ineterface方法,那在實作上要非常小心,且跟據不同狀況來判斷要不要作交易控制
如果DCOM,請自行撰寫資料庫的控制碼
如果是COM ,那麼狀況就非常複雜,因為COM 支援元件式交易,換句話說,如果系統元件切割的十分完美/或是架構很簡單(兩者差異很大),幾乎不需撰寫任何交易控制碼,只要設定COM 之元件的交易方式即可(如不須交易、支援交易、必須交易等)
實際上的狀況,如果考量企業邏輯層有作適當分層(Layer)(約2-3層),在大部分的狀況只要設定支援交易、必須交易即可,但某些關鍵方法還有須要自行寫作資料庫交易控制與元件交易控制。
也因為COM 支援元件式交易,所以可以在企業邏輯層作適當分層,讓架構有比較好的Reuse特性,
相對的如果用DCOM,那企業邏輯層會比較難寫出Reuse架構
(在此,我所說的Reuse架構可簡單想像COM元件可彼此呼叫,而不僅局限於給Client呼叫)
總之,要做到很好很難,選用COM (Transaction DataModule)有機會讓你作到很好,高效率的架構;相對於DCOM(Remote DataModule)的狀況不多,較容易寫,但也僅能規劃出扁平的架構。 ps TRemoteDataModule/TMtsDataModule直接實作IAppserver,但實作程式碼都會轉Call TDataSetProvider的對應方法,因此我只好以間接實作IAppServer方法解釋之,反正如果你去Trace MIDAS架構的話,就會發覺. 混心雜欲 棄修身~唉
------
唉~ |
borlandor
一般會員 發表:0 回覆:2 積分:0 註冊:2003-10-31 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |