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

Server端的procedure Client端呼叫的問題

答題得分者是:jieshu
terrychen
尊榮會員


發表:90
回覆:794
積分:501
註冊:2003-05-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-12-09 15:13:36 IP:61.221.xxx.xxx 未訂閱
再次請教前輩 前人留下的程式D3 Server端
procedure TScAppSbr.SetSQL(Value: OleVariant);
begin
  if UpperCase(Value[0]) = 'PD010' then
     With Pd010 do begin Close; SQL.Clear; SQL.Add(Value[1]); end;
.....
end
Client端
         sSQL  := 'Select *'
               '  From Sc710'
               '  Where SNo = :sno';
         SetSQL(RS1,SQL1,sSQL);             SQL1.Provider.SetParams(VarArrayOf([Sc600Priceno.AsString]));
         SQL1.Open;
這樣正常沒問題 經小弟修改後 Server端
procedure TDM.SetSQL(Value: OleVariant);
begin
  if UpperCase(Value[0]) = 'PD010' then
     With Pd010 do begin Close; SQL.Clear; SQL.Add(Value[1]); end;
.....
end;
Client端
      sSQL  := 'Select *'
               '  From Sc710'
               '  Where SNo = ''' Sc600Priceno.AsString '''';
      SetSQL(DCOMCn1,Tmp,sSQL);
      Tmp.Open;
小弟只是把傳參數的地方修改掉 造成Tmp.fieldbyname('Serno').asstring ===>Serno欄位找不到 小弟一直不明白為何要傳參數 也不會傳,所以將之改掉 煩請前輩們給點意見 ps.小弟尚有疑慮就是SERVER端的procedure 並沒有回傳值為何可以在Client 使用Tmp.Open 發表人 - Terrychen 於 2003/12/09 15:20:14
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-12-09 15:21:27 IP:147.8.xxx.xxx 未訂閱
Typo?    Tmp.fieldbyname('Serno').asstring
terrychen
尊榮會員


發表:90
回覆:794
積分:501
註冊:2003-05-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-12-09 15:30:27 IP:61.221.xxx.xxx 未訂閱
Typo? Tmp.fieldbyname('Serno').asstring ======================================= Sorry 小弟不明白william版主所表達的意思
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-12-09 15:38:09 IP:147.8.xxx.xxx 未訂閱
Does the field SerNo exists?
terrychen
尊榮會員


發表:90
回覆:794
積分:501
註冊:2003-05-01

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-12-09 15:46:03 IP:61.221.xxx.xxx 未訂閱
感謝回應 小弟有確認過此欄位是存在的
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-12-09 15:56:32 IP:147.8.xxx.xxx 未訂閱
Try somethine like:
var
    SL: TStringList;
{...}
    Tmp.Open;
    Tmp.Fields.GetFieldNames(SL);
    SL.SaveToFile('c:\test.txt');
{...}
And see if SerNo exists in your query object Tmp.
terrychen
尊榮會員


發表:90
回覆:794
積分:501
註冊:2003-05-01

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-12-09 16:03:30 IP:61.221.xxx.xxx 未訂閱
照著版主的做法,出現了如下的錯誤訊息,此錯誤訊息於SL.SaveToFile('c:\test.txt');發生的 發表人 - Terrychen 於 2003/12/09 16:04:37
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-12-09 16:18:57 IP:147.8.xxx.xxx 未訂閱
You should create SL first...    
var
    SL: TStringList;
{...}
    SL := TStringList.Create;
    Tmp.Open;
    Tmp.Fields.GetFieldNames(SL);
    SL.SaveToFile('c:\test.txt');
    SL.Free;
{...}
terrychen
尊榮會員


發表:90
回覆:794
積分:501
註冊:2003-05-01

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-12-09 16:25:59 IP:61.221.xxx.xxx 未訂閱
感謝回應 加了SL.Free; 錯誤訊息一樣 會不會是跟小弟下面的問題有關 ps.小弟尚有問題就是SERVER端的procedure 並沒有回傳值為何可以在Client 使用Tmp.Open
terrychen
尊榮會員


發表:90
回覆:794
積分:501
註冊:2003-05-01

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-12-09 16:37:40 IP:61.221.xxx.xxx 未訂閱
Sorry 小弟疏忽了 剛剛那ㄍ錯誤訊息是因為小弟少了SL := TStringList.Create; 所以才出現錯誤 而照著版主的方法test.text 只出現一ㄍ欄位名稱 但小弟下的SQL為
      sSQL  := 'Select *'
               '  From Sc710'
               '  Where SNo = ''' Sc600Priceno.AsString '''';
選取所有欄位為何只傳回一ㄍ欄位
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-12-09 16:38:58 IP:147.8.xxx.xxx 未訂閱
You need to create SL first... What's Tmp? It should be TClientDataSet in a 3-tier application. Borland's MIDAS does all the magic for you in transferring data between server and client.
terrychen
尊榮會員


發表:90
回覆:794
積分:501
註冊:2003-05-01

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-12-09 16:45:25 IP:61.221.xxx.xxx 未訂閱
是的如版主所言Tmp is TClientDataSet
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-12-09 17:18:02 IP:147.8.xxx.xxx 未訂閱
Make sure there is no design time defined fields for Tmp and the corresponding dataset on the server side. You may also want to call Tmp.FetchParams before opening it.
terrychen
尊榮會員


發表:90
回覆:794
積分:501
註冊:2003-05-01

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-12-09 17:31:56 IP:61.221.xxx.xxx 未訂閱
是的在server端也有一相同的名稱的TSQLQUERY
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-12-09 17:49:39 IP:203.204.xxx.xxx 未訂閱
引言: 小弟只是把傳參數的地方修改掉 造成Tmp.fieldbyname('Serno').asstring ===>Serno欄位找不到 小弟一直不明白為何要傳參數 jieshu: sql裡有用到參數,當然要傳參數,傳參數有傳參數的好處! 也不會傳,所以將之改掉 jieshu: 原本可以用為什麼要改! 煩請前輩們給點意見 ps.小弟尚有疑慮就是SERVER端的procedure 並沒有回傳值為何可以在Client 使用Tmp.Open 發表人 - Terrychen 於 2003/12/09 15:20:14
他已經將SQL丟給Server的DataSet,當然可以直接Open。看來你還要多看些書才行!且貼上的程式碼沒有說明變數是什麼東西,。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
terrychen
尊榮會員


發表:90
回覆:794
積分:501
註冊:2003-05-01

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-12-09 20:19:25 IP:211.76.xxx.xxx 未訂閱
感謝回應 前輩所言甚是 小弟書真的看的不多 公司相關的 書籍也真是少的可憐 加上沒人會3層式架構而公司又希望能將D3的程式以D7重寫過 最近會找ㄍ時間去買書,現在小弟只能上網找相關資料 我會加油的!!
speedup
資深會員


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

發送簡訊給我
#17 引用回覆 回覆 發表時間:2003-12-09 21:10:25 IP:218.168.xxx.xxx 未訂閱
1.從D5以後Delphi的分散式架構和之前(D3,D4)的差異很大 建議採無狀態,所以最好整個重寫不要參考之前的改寫 2.Server端若自定Interface函式,其中參數若包自定結構的OleVariant參數,client在呼叫時建議引用IDispatch轉型指名參數型態呼叫,不然的話D7會在某些狀況下誤判olevariant結構 混心雜欲 棄修身~唉
------
唉~
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#18 引用回覆 回覆 發表時間:2003-12-10 09:28:01 IP:203.204.xxx.xxx 未訂閱
引言: 感謝回應 前輩所言甚是 小弟書真的看的不多 公司相關的 書籍也真是少的可憐 加上沒人會3層式架構而公司又希望能將D3的程式以D7重寫過 最近會找ㄍ時間去買書,現在小弟只能上網找相關資料 我會加油的!! < face="Verdana, Arial, Helvetica"> 那傳授一、二招給你用用: 1.沒有參數的SQL可用ClientDataSet.CommandText直接給,就像Query.SQL.Text,但Server的DataSetProvider.Options要設定一下,不懂的請參考Help,雖然Help有時候都看不懂,但等你看懂了,很多東西都可以很快就看懂,很好用喔! 2.執行ClientDataSet.DataRequest,可呼叫Server的DataSetProvider的OnDataRequest事件,很好用喔,不用自己每支程式去寫Method。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
terrychen
尊榮會員


發表:90
回覆:794
積分:501
註冊:2003-05-01

發送簡訊給我
#19 引用回覆 回覆 發表時間:2003-12-10 12:37:56 IP:61.221.xxx.xxx 未訂閱
雖然問題尚未解決 還是很感謝大家的回應(因為多學了幾招︿"︿..) 因為小弟問的範圍可能太大了(自己現在也不知道從和問起) 所以先把他結案 自己在多看書,慢慢找解決的方法 等能將問題縮小時再請教各位前輩 發表人 - Terrychen 於 2003/12/10 12:40:09
系統時間:2024-04-25 13:01:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!