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

Midas 3-tier架構, TClientDataSet將值傳至TDataSetProvider會出現Invalid Arguments的問題

答題得分者是:GrandRURU
younger98
一般會員


發表:2
回覆:4
積分:1
註冊:2010-11-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-11-17 18:48:04 IP:61.220.xxx.xxx 訂閱
小弟有個案子,是將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
站務副站長


發表:235
回覆:1655
積分:1753
註冊:2005-06-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-11-17 20:38:34 IP:219.70.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-11-18 11:53:52 IP:61.220.xxx.xxx 訂閱
感謝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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-11-18 17:31:46 IP:61.220.xxx.xxx 訂閱
已解決了,感謝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



系統時間:2017-12-12 4:53:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!