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

cannot perform this operation on a closed dataset.

答題得分者是:jieshu
hoganzeng
一般會員


發表:1
回覆:5
積分:1
註冊:2005-04-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-18 21:30:38 IP:219.133.xxx.xxx 未訂閱
請教各位前輩: 小弟在學習用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
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-18 22:06:04 IP:203.204.xxx.xxx 未訂閱
引言:
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;
要再加強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/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
hoganzeng
一般會員


發表:1
回覆:5
積分:1
註冊:2005-04-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-18 22:47:22 IP:219.133.xxx.xxx 未訂閱
謝謝前輩指點,我開始沒說清楚出錯停頓的句子 ......   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
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-18 23:25:46 IP:203.204.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-04-19 10:58:30 IP:219.133.xxx.xxx 未訂閱
哈哈,問題終於解決 我把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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-04-19 13:00:58 IP:219.133.xxx.xxx 未訂閱
不甘心如此結果,於是再又加上Adoconnection組件 這次居然也成功了,我又改變Mode為cmShareDenyNone DefaultDatabase還是成功了,難道第一次產生zxjCon的元件程序有問題? 問題所在點在哪看來是搞不清楚了,不過反正能用了
hoganzeng
一般會員


發表:1
回覆:5
積分:1
註冊:2005-04-01

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-04-19 13:14:42 IP:219.133.xxx.xxx 未訂閱
問題在哪終於讓我找到了! 當我習慣的使用Project選單中Build方式產生元件DLL方式時又產生了此問題 於是改為install Com objects方式又正常了,原來如此呀,我以前常用Build產 生DLL文件的方式是有問題的,雖然某些元件不會出現問題,但是一種不正確的生成元件DLL文件的方式,當時我還以為找到一種簡易的方式了,呵呵,再也不敢了 謝謝版主支持
jieshu
版主


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-04-19 13:37:17 IP:203.204.xxx.xxx 未訂閱
引言: 問題在哪終於讓我找到了! 當我習慣的使用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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-05-06 12:30:51 IP:219.133.xxx.xxx 未訂閱
問題原來不那樣簡單,當我將程序放到其他電腦上試用時又發生此問題 於是我猜測與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; 在具體的單元中申明此類後再覆值連接字串就沒有此錯誤發生了 (*問題點關鍵是連接字串的覆值*)
系統時間:2017-10-24 6:36:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!