Midas 3-tier架構, TClientDataSet將值傳至TDataSetProvider會出現Invalid Arguments的問題 |
答題得分者是:GrandRURU
|
younger98
一般會員 發表:2 回覆:4 積分:1 註冊:2010-11-17 發送簡訊給我 |
小弟有個案子,是將Delphi5升級為Delphi2009,目前遇到一個問題
原本ClientDataSet的程式如下,在取得資料前先把查詢條件傳給OwnerData [code delphi] procedure TOtherData.EmployeeCBeforeGetRecords(Sender: TObject; var OwnerData: OleVariant); begin OwnerData := VarArrayOf([EmployeeFrame.SearchEdit.Text,EmployeeFrame.vOwnerData]); end; [/code] 然後在AP Server端的ClientDataSet接收OwnerData傳來的值,當成TQuery的params [code delphi] procedure TEmployee_Server.EmployeePBeforeGetRecords(Sender: TObject; var OwnerData: OleVariant); begin with Sender as TDataSetProvider do begin DataSet.Close; EmployeePQ.ParamByName('Con').AsString := '%' OwnerData[0] '%'; DataSet.Open; if DataSet.Locate('ENo',OwnerData[1],[]) then DataSet.Next else DataSet.First; end; end; [/code] 但程式跑到OwnerData[0]這行時,會出現 "Invalid Argument"的錯誤訊息 原本在Delphi5跑的時候是正常,用Debug模式去執行,也發現Client端的OwnerData確實有值 但傳至TDataSetProvider後就讀不出來 請問有人遇過這種狀況嗎? 謝謝! |
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
http://delphi.ktop.com.tw/board.php?cid=30&fid=68&tid=54507
這篇或許有你要的解答,如果沒有,請再看一下2009的Help吧 ===================引 用 younger98 文 章=================== 小弟有個案子,是將Delphi5升級為Delphi2009,目前遇到一個問題 原本ClientDataSet的程式如下,在取得資料前先把查詢條件傳給OwnerData [code delphi] procedure TOtherData.EmployeeCBeforeGetRecords(Sender: TObject; var OwnerData: OleVariant); begin OwnerData := VarArrayOf([EmployeeFrame.SearchEdit.Text,EmployeeFrame.vOwnerData]); end; [/code] 然後在AP Server端的ClientDataSet接收OwnerData傳來的值,當成TQuery的params [code delphi] procedure TEmployee_Server.EmployeePBeforeGetRecords(Sender: TObject; var OwnerData: OleVariant); begin with Sender as TDataSetProvider do begin DataSet.Close; EmployeePQ.ParamByName('Con').AsString := '%' OwnerData[0] '%'; DataSet.Open; if DataSet.Locate('ENo',OwnerData[1],[]) then DataSet.Next else DataSet.First; end; end; [/code] 但程式跑到OwnerData[0]這行時,會出現 "Invalid Argument"的錯誤訊息 原本在Delphi5跑的時候是正常,用Debug模式去執行,也發現Client端的OwnerData確實有值 但傳至TDataSetProvider後就讀不出來 請問有人遇過這種狀況嗎? 謝謝! |
younger98
一般會員 發表:2 回覆:4 積分:1 註冊:2010-11-17 發送簡訊給我 |
感謝GrandRURU的回覆
剛剛測試了一下Delphi安裝時所附的Midas Demo 在ClientDataSet設定好的OwnerData APServer端的TDataSetProvider確實可以接到值進行查詢(跟RURU提供的文章連結一樣的作法) 只是我把ADOConnection改為SocketConnection 但換至我的專案之後,OwnerData傳遞至TDataSetProvider後,值就不見了 附上錯誤訊息 Exception class EVariantInvalidArgError with message 'Invalid argument'. Process PCommon.exe (2424) Exception class EOleException with message 'Invalid argument'. Process PCommon.exe (2424) ===================引 用 GrandRURU 文 章=================== http://delphi.ktop.com.tw/board.php?cid=30&fid=68&tid=54507 這篇或許有你要的解答,如果沒有,請再看一下2009的Help吧 |
younger98
一般會員 發表:2 回覆:4 積分:1 註冊:2010-11-17 發送簡訊給我 |
已解決了,感謝RURU大人提供的靈感
問題是出在 with Sender as TDataSetProvider do這行 Server端原程式: [code delphi] procedure TEmployee_Server.EmployeePBeforeGetRecords(Sender: TObject; var OwnerData: OleVariant); begin with Sender as TDataSetProvider do begin DataSet.Close; EmployeePQ.ParamByName('Con').AsString := '%' OwnerData[0] '%'; DataSet.Open; if DataSet.Locate('ENo',OwnerData[1],[]) then DataSet.Next else DataSet.First; end; end; [/code] 修改為如下 [code delphi] procedure TEmployee_Server.EmployeePBeforeGetRecords(Sender: TObject; var OwnerData: OleVariant); begin // with Sender as TDataSetProvider do begin EmployeePQ.Close; EmployeePQ.ParamByName('Con').AsString := '%' OwnerData[0] '%'; EmployeePQ.Open; if EmployeePQ.Locate('ENo',OwnerData[1],[]) then EmployeePQ.Next else EmployeePQ.First; end; end; [/code] 發現的原因是原本OwnerData的傳有傳至AP Server端 但程式跑到with Sender as TDataSetProvider do 這行的時候 用Local Variable去看卻變成E2171 Variable 'OwnerData' inaccessible here due to optimization |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |