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

用Interface回傳DataSet

答題得分者是:speedup
Darkn
一般會員


發表:5
回覆:10
積分:3
註冊:2003-02-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-28 08:59:36 IP:210.192.xxx.xxx 未訂閱
請教各位.. 我最近在用SocketConnection來寫3-tier. 目前的想法是透過Interface來抓取資料,不是用DataSetProvider和 Clientdataset ,因為這樣感覺上彈性比較大 可是我現在有個問題,就是我沒辦法用透過interface回傳dataset (有時需要同時抓回多筆資料),請問一下各位前輩 , 我該怎麼做才能 讓dataset透過interface回傳??謝謝各位
speedup
資深會員


發表:19
回覆:259
積分:280
註冊:2003-07-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-28 09:30:29 IP:210.243.xxx.xxx 未訂閱
利用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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-28 10:05:48 IP:210.192.xxx.xxx 未訂閱
想不到那麼快就有答案了, 謝謝你的幫忙
Darkn
一般會員


發表:5
回覆:10
積分:3
註冊:2003-02-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-29 09:33:01 IP:210.192.xxx.xxx 未訂閱
不好意思。 又遇到了點問題 我透過clientDataSet.data 從 Server 傳到 client 在server端傳之前我看到的確是有資料 可是傳到client時 我要使用時就出現 Can not perform opertion on a closed dataset 我是不是要先把他打開?? 可是client的dataset我並沒有指定proveider name 這樣可以開嗎?? 麻煩指導一下 謝謝
speedup
資深會員


發表:19
回覆:259
積分:280
註冊:2003-07-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-29 10:17:24 IP:210.243.xxx.xxx 未訂閱
引言: 不好意思。 又遇到了點問題 我透過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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-10-29 10:32:48 IP:210.192.xxx.xxx 未訂閱
錯誤訊息是發生在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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-10-29 12:08:44 IP:210.243.xxx.xxx 未訂閱
引言: [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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-10-29 15:56:57 IP:210.192.xxx.xxx 未訂閱
真的可以了 謝謝你的幫忙 解決我很多的問題
borlandor
一般會員


發表:0
回覆:2
積分:0
註冊:2003-10-31

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-10-31 12:38:15 IP:210.51.xxx.xxx 未訂閱
想问speedup兄: 这种籍由interface抓取数据資料与籍由ClientDataSet DataSetProvider抓取数据資料有何区别?如果籍由interfaced对资料进行更新时,需不需要进行Transaction或Thread保护?谢谢!
speedup
資深會員


發表:19
回覆:259
積分:280
註冊:2003-07-04

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-10-31 14:32:12 IP:210.243.xxx.xxx 未訂閱
不管你有無自行開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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-11-01 14:54:01 IP:210.51.xxx.xxx 未訂閱
Thanks a lot! 我是内蒙古人,台湾话我说得不太好,但仁兄还是给了满意的回答,谢谢!
系統時間:2024-05-02 15:27:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!