cannot perform this operation on a closed dataset. |
答題得分者是:jieshu
|
hoganzeng
一般會員 發表:1 回覆:5 積分:1 註冊:2005-04-01 發送簡訊給我 |
請教各位前輩: 小弟在學習用ado和com 寫多層架構時遇到此問題,程式由兩個元件amlgn,zxjCon和一個簡單的客戶端測試程序,客戶端輸入用戶和密碼在amlgn中間件進行驗証,zxjCon安裝在win2000 server連接Ms sql server, amlgn裝在自己的電腦上通過Dcomconnection和clientdataset連zxjCon,
參考李維的Delphi5.X.ADO.MTS.COM 高级程序设计篇一書
zxjCon含Adoconnection,Adoquery,DatasetProvider,此元件如果直接寫個客戶端可以取到資料,但是通過中間協調件就會出現主題所示錯誤 amlgn程式如下
type
TCamlgn = class(TMtsAutoObject, ICamlgn)
private
FMyDM : TfdmLgn;
.....
destructor TCamlgn.Destroy;
begin
inherited;
FMyDM.Free;
end;
procedure TCamlgn.Initialize;
begin
inherited;
FMyDM := TfdmLgn.Create(Forms.Application);
end;
procedure TCamlgn.login(const sName, sPassword: WideString;
var vCookie: OleVariant);
var
UserName,UserPassword:String;
sSQLStr:String;
begin
vCookie:='';
sSqlStr:='select * from zusr ';
fmydm.csLgn.CommandText:=sSqlStr;//即sql?容
try
try
fmydm.csLgn.Active :=true; //執行此句出錯
SetComplete;
except
SetAbort;
end;
finally
fmydm.csLgn.Active:=false;
end;
if fmydm.csLgn.RecordCount>0 then
begin
fmydm.csLgn.First;
Username := fmydm.csLgn.FieldByName('user_na').AsString;
UserPassword:= fmydm.csLgn.FieldByName('USER_CO').AsString;
if ((sName=UserName) and (sPassword=UserPassword)) then
begin
vCookie:=CreateClassId;
end;
end;
end;
....
包含一個datamodule fdmlgn有Dcomconnection,Clientdataset兩個元件
Dcomconnection連接是成功的
請各位幫小弟看看錯在哪裡
|
jieshu
版主 發表:42 回覆:894 積分:745 註冊:2002-04-15 發送簡訊給我 |
引言:要再加強Debug的理解喔, 這種問題應該自己Debug就會發現. <iFrame src="http://www.coss.com.tw/jieshu/sign.htm" width=400 height=105 scolling="NO" border="0"></iFrame> 震江系統(股)公司: http://www.coss.com.tw/ 捷舒軟體設計坊: http://www.coss.com.tw/jieshu/amlgn程式如下 type TCamlgn = class(TMtsAutoObject, ICamlgn) private FMyDM : TfdmLgn; ..... destructor TCamlgn.Destroy; begin inherited; FMyDM.Free; end; procedure TCamlgn.Initialize; begin inherited; FMyDM := TfdmLgn.Create(Forms.Application); end; procedure TCamlgn.login(const sName, sPassword: WideString; var vCookie: OleVariant); var UserName,UserPassword:String; sSQLStr:String; begin vCookie:=''; sSqlStr:='select * from zusr '; fmydm.csLgn.CommandText:=sSqlStr;//即sql?容 try try fmydm.csLgn.Active :=true; //執行此句出錯 SetComplete; except SetAbort; end; finally fmydm.csLgn.Active:=false; //這裡關掉了, 下面就沒有辦法取RecordCount了 end; if fmydm.csLgn.RecordCount>0 then //應該是此句報錯吧!! begin fmydm.csLgn.First; //關閉時不可執行的操作, 底下同樣. Username := fmydm.csLgn.FieldByName('user_na').AsString; UserPassword:= fmydm.csLgn.FieldByName('USER_CO').AsString; if ((sName=UserName) and (sPassword=UserPassword)) then begin vCookie:=CreateClassId; end; end; end;
------
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離 人若為惡,禍雖未至,福已遠離 http://www.taconet.com.tw/jieshu/ |
hoganzeng
一般會員 發表:1 回覆:5 積分:1 註冊:2005-04-01 發送簡訊給我 |
謝謝前輩指點,我開始沒說清楚出錯停頓的句子
......
sSqlStr:='select * from zusr ';
fmydm.csLgn.CommandText:=sSqlStr;//即sql?容
try
try
fmydm.csLgn.Active :=true; //執行此句出錯
//我DEBUG執行到此處就出錯了
//後來我將此段改為
sSqlStr:='select * from zusr ';
try
try
fmydm.csLgn.close;
fmydm.csLgn.CommandText:=sSqlStr;//即sql?容
fmydm.csLgn.open; //還是執行此句出錯 我在datasetprovide中packetRecords本來是-1後來設為10 [black][/blackorange][/orange]
|
jieshu
版主 發表:42 回覆:894 積分:745 註冊:2002-04-15 發送簡訊給我 |
引言: fmydm.csLgn.Active :=true; //執行此句出錯 fmydm.csLgn.open; //還是執行此句出錯依錯誤訊息分析, 應該不可能是Open所造成的, 而沒有Open執行底下程式碼, 絕對會出現這樣的錯誤訊息, 您真的有在Server端上Debug嗎? if fmydm.csLgn.RecordCount>0 then //應該是此句報錯吧!! begin fmydm.csLgn.First; //關閉時不可執行的操作, 底下同樣. Username := fmydm.csLgn.FieldByName('user_na').AsString; UserPassword:= fmydm.csLgn.FieldByName('USER_CO').AsString; <iFrame src="http://www.coss.com.tw/jieshu/sign.htm" width=400 height=105 scolling="NO" border="0"></iFrame> 震江系統(股)公司: http://www.coss.com.tw/ 捷舒軟體設計坊: http://www.coss.com.tw/jieshu/
------
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離 人若為惡,禍雖未至,福已遠離 http://www.taconet.com.tw/jieshu/ |
hoganzeng
一般會員 發表:1 回覆:5 積分:1 註冊:2005-04-01 發送簡訊給我 |
哈哈,問題終於解決
我把zxjCon也裝在自己的電腦上開3個delphi一起調試,發現執行到zxjCon中設置adoconnection.Connectioned:=true;出現此問題,於是判斷Connectionstring是否錯誤,經过檢查發現并沒有錯,實在沒法可想,將adoconnection組件刪除,只使用adoquery組件,并用adoquery自己的connectionstring連線ms SqlServer 然後重裝zxjCon組件,再進行測試,結果通過了,當然來到Jieshu所指出的錯誤點,赶緊修改程序再測試,一切成功.
下面是修改後的實用程序碼
procedure TCamlgn.login(const sName, sPassword: WideString;
var vCookie: OleVariant);
var
UserName,UserPassword:String;
sSQLStr:String;
begin
vCookie:='';
sSqlStr:='select * from zusr where ''' sName '''=user_co';
fmydm.dcLgn.Connected:=true;
try
try
fmydm.cslgn.CommandText:=sSqlstr;
fmydm.cslgn.Active:=true;
SetComplete;
except
SetAbort;
end; if fmydm.csLgn.RecordCount>0 then
begin
fmydm.csLgn.First;
Username := fmydm.csLgn.FieldByName('user_co').AsString;
UserPassword:= fmydm.csLgn.FieldByName('USER_CODE').AsString;
if ((sName=UserName) and (sPassword=UserPassword)) then
begin
vCookie:=CreateClassId;
end;
end;
finally
fmydm.csLgn.Active:=false;
end;
end;
但心中的疑問并沒有消去,為何adoconnection組件不能使用,如此豈不是adoconnection的一些好處用不上?
|
hoganzeng
一般會員 發表:1 回覆:5 積分:1 註冊:2005-04-01 發送簡訊給我 |
|
hoganzeng
一般會員 發表:1 回覆:5 積分:1 註冊:2005-04-01 發送簡訊給我 |
|
jieshu
版主 發表:42 回覆:894 積分:745 註冊:2002-04-15 發送簡訊給我 |
引言: 問題在哪終於讓我找到了! 當我習慣的使用Project選單中Build方式產生元件DLL方式時又產生了此問題 於是改為install Com objects方式又正常了,原來如此呀,我以前常用Build產 生DLL文件的方式是有問題的,雖然某些元件不會出現問題,但是一種不正確的生成元件DLL文件的方式,當時我還以為找到一種簡易的方式了,呵呵,再也不敢了 謝謝版主支持恭喜!! 應該是Build是在您Project目錄, 而您Client連時是連到Windows Com , 所以會有改了沒有作用問題, 而install Com objects方式, 可能Delphi會先Compile後, 再安裝到Com , 所以沒有問題, 我沒用過, 只是猜測.
------
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離 人若為惡,禍雖未至,福已遠離 http://www.taconet.com.tw/jieshu/ |
hoganzeng
一般會員 發表:1 回覆:5 積分:1 註冊:2005-04-01 發送簡訊給我 |
問題原來不那樣簡單,當我將程序放到其他電腦上試用時又發生此問題
於是我猜測與DATAMODULE上的ADOCONNECTION 與ADOQUERY控件有關係
因為經我DEBUG時發現此錯誤是ADOQUERY激活不成功,而直接用ADOQUERY不用ADOCONNECTION又可以成功,由此我決定不用DATAMOUDLE而自己定義一個用於連SQL SERVER的類 uses
DB, ADODB;
type
ToZAqy = class(TObject)
Acn:TadoConnection;
constructor Create;
Destructor Destroy; override;
private
protected
public
end; var
oZAqy: ToZAqy; implementation { ToZAqy }
constructor ToZAqy.Create;
begin
inherited;
Acn:=TAdoConnection.Create(nil);
end; destructor ToZAqy.Destroy;
begin
inherited;
Acn.free;
end; 在具體的單元中申明此類後再覆值連接字串就沒有此錯誤發生了
(*問題點關鍵是連接字串的覆值*)
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |