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

DAX Error

答題得分者是:jieshu
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-01 15:36:12 IP:218.80.xxx.xxx 未訂閱
D7+update1 windows2003 ADO2.8+sql server 2000 一个使用RemoteDatamodule的exe服务器,6个client不停调用上面的一个取得当前日期的函数,调用几百次或者几千次后,在Server上会报一个DAX错误,奇怪的是错误消息是乱码 当尝试debug的时候,大致在出现错误的时候,debugger没有俘获到,却报错 在delphi原码中查找错误消息,发现在comobj.pas有:
function TComObjectFactory.CreateInstanceLic(const unkOuter: IUnknown;
  const unkReserved: IUnknown; const iid: TIID; const bstrKey: WideString;
  out vObject): HResult; stdcall;
var
  ComObject: TComObject;
begin
  // We can't write to a nil pointer.  Duh.
  if @vObject = nil then
  begin
    Result := E_POINTER;
    Exit;
  end;
  // In case of failure, make sure we return at least a nil interface.
  Pointer(vObject) := nil;
  // Check for licensing.
  if FSupportsLicensing and
    ((bstrKey <> '') and (not ValidateUserLicense(bstrKey))) or
    ((bstrKey = '') and (not HasMachineLicense)) then
  begin
    Result := CLASS_E_NOTLICENSED;
    Exit;
  end;
  // We can only aggregate if they are requesting our IUnknown.
  if (unkOuter <> nil) and not (IsEqualIID(iid, IUnknown)) then
  begin
    Result := CLASS_E_NOAGGREGATION;
    Exit;
  end;
  try
    ComObject := CreateComObject(UnkOuter);
  except
    if FShowErrors and (ExceptObject is Exception) then
      with Exception(ExceptObject) do
      begin
        if (Message <> '') and (AnsiLastChar(Message) > '.') then
          Message := Message + '.';
        MessageBox(0, PChar(Message), PChar(SDAXError), MB_OK or MB_ICONSTOP or
          MB_SETFOREGROUND);
      end;
    Result := E_UNEXPECTED;
    Exit;
  end;
  Result := ComObject.ObjQueryInterface(IID, vObject);
  if ComObject.RefCount = 0 then ComObject.Free;
end;
也就是 ComObject := CreateComObject(UnkOuter);出现了例外。 请问,为什么会出现这个错误?如何解决?或者如何能debug到错误的地方? 久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听 發表人 - mustapha.wang 於 2005/02/01 16:12:41
------
江上何人初见月,江月何年初照人
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-02 09:41:21 IP:218.80.xxx.xxx 未訂閱
jieshu版主有没有类似经验?     久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听 發表人 - mustapha.wang 於 2005/02/02 12:39:38
------
江上何人初见月,江月何年初照人
jieshu
版主


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-02 10:17:41 IP:203.204.xxx.xxx 未訂閱
引言: D7+update1 windows2003 ADO2.8+sql server 2000 一?使用RemoteDatamodule的exe服?器,6?client不停?用上面的一?取得?前日期的函?,?用几百次或者几千次后,在Server上??一?DAX??,奇怪的是??消息是?? ???debug的?候,大致在出???的?候,debugger?有俘?到,??? ??,?什么?出??????如何解??或者如何能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/
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-02-02 12:44:06 IP:218.80.xxx.xxx 未訂閱
Server很简单的一个函数:
function TiNetTransfer.GetServerDateTime(AParams: OLEVariant): OLEVariant;
begin     
  Result:=Now;
end;
client用的TConnectionBroker,连接TDCOMConnection
procedure TForm1.Button1Click(Sender: TObject);
begin
  SetServer;
  Memo1.Lines.Clear;
  Stop:=false;
  repeat
    ConnectionBroker1.Close;
    ConnectionBroker1.Open;
    Memo1.Lines.Add(DateTimeToStr(
      ConnectionBroker1.AppServer.Call('iNetTransfer','GetServerDateTime',null)));
    ConnectionBroker1.Close;
    Sleep(10);
    Application.ProcessMessages;
    if Memo1.Lines.Count>1000 then Memo1.Lines.Clear;
  until Stop;
end;
比较奇怪的是,不确定多少次后,才会出现这个DAX错误 久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听
------
江上何人初见月,江月何年初照人
jieshu
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-02-02 13:32:11 IP:203.204.xxx.xxx 未訂閱
引言: Server很??的一?函?:
function TiNetTransfer.GetServerDateTime(AParams: OLEVariant): OLEVariant;
begin     
  Result:=Now;
end;
client用的TConnectionBroker,?接TDCOMConnection
procedure TForm1.Button1Click(Sender: TObject);
begin
  SetServer;
  Memo1.Lines.Clear;
  Stop:=false;
  repeat
    ConnectionBroker1.Close;
    ConnectionBroker1.Open;
    Memo1.Lines.Add(DateTimeToStr(
      ConnectionBroker1.AppServer.Call('iNetTransfer','GetServerDateTime',null)));
    ConnectionBroker1.Close;
    Sleep(10);
    Application.ProcessMessages;
    if Memo1.Lines.Count>1000 then Memo1.Lines.Clear;
  until Stop;
end;
比?奇怪的是,不确定多少次后,才?出???DAX?? 久病成良?--多? 千人之??,不如一士之??--兼听
不曉得您做這樣的用意在哪, 因為常常快速的Close, Open有可能導致系統錯誤, 建議您將Close, Open搬到迴圈上面, 這樣應該就不會有問題了, 或者用Delphi內建的Function來做, 會比較沒有問題, 例如用DataSetProvider的DataRequest事件, 我有一支連到各AppServer處理事情的程式, 就是需要在迴圈內Close, Open, 就是這樣避掉不明錯誤的. <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/
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-02-14 08:45:51 IP:218.80.xxx.xxx 未訂閱
谢谢jieshu。 我这样频繁close/open只是为了测试AppServer在多人频繁访问的情况下的稳定性。实际上这样的状况也会发生,即使移到循环外面,client多了,频繁度应该也会达到一样的程度。 或者说,怎样的测试方法才能度量Appserver的能力和稳定性? 为什么频繁close/open会导致系统错误,是通讯泛滥吗?我直接用TCP通讯,一会儿indy元件也会说refuse < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=10543105&CC=235795"> 久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听
------
江上何人初见月,江月何年初照人
speedup
資深會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-02-14 10:40:01 IP:220.135.xxx.xxx 未訂閱
引言: D7 update1 windows2003 ADO2.8 sql server 2000 一个使用RemoteDatamodule的exe服务器
你要不要改用TransactionDataModule 印象中當初用Delphi4 RemoteDatamodule開發時也時常並到此問題 後來Delphi5 出來後改用TransactionDataModule 就幾乎沒發生過此問題 混心雜欲 棄修身~唉
------
唉~
jieshu
版主


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-02-14 18:43:35 IP:203.204.xxx.xxx 未訂閱
引言: ??jieshu。 我???繁close/open只是?了??AppServer在多人?繁??的情?下的?定性。??上??的??也??生,即使移到循?外面,client多了,?繁度??也??到一?的程度。 或者?,怎?的??方法才能度量Appserver的能力和?定性? ?什么?繁close/open??致系???,是通?泛???我直接用TCP通?,一?儿indy元件也??refuse < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=10543105&CC=235795"> 久病成良?--多? 千人之??,不如一士之??--兼听
什麼樣的系統會達到每0.01秒一次連線斷線, 應該很少吧, 要測試AppServer的能力, 應該要用實際程式, 然後開啟多個連線查詢或更新測試, 因為執行不同的程式碼, 對AppServer的負擔是不同的, 所以沒個標準, 您寫的測試, 頂多能測快速連結斷線. 應該是速度太快系統還來不及處理您的需求, 導致錯誤產生, 譬如說Windows建立連線需要0.1秒的時間, 結果您在0.1秒內做了10次同樣的需求, 或許您可用Thread試試. <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/
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-02-18 17:51:26 IP:218.80.xxx.xxx 未訂閱
试想web服务器,面对的网民有多少,短时间连接/断开的人会少吗?就像在QQ网站打80分升级,上上下下的人何其多,我的6个client应该还没有达到它的压力吧。    已经是apartment线程了,相反如果用single反而不会错,就是慢点。    也很奇怪,这两天测又没有报DAX错误了,是不是跟网络的稳定性有关?有时候我们的局域网上的电脑,在网络芳邻里一会儿能访问,一会儿又不能访问。     久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听
------
江上何人初见月,江月何年初照人
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-03-04 11:55:10 IP:218.80.xxx.xxx 未訂閱
我发现,在Appserver里,从type library把midas.dll去掉,interface从IDispatch继承,元件从TRemoteDataModule改从TDataModule继承,结果就没有DAX错误了。原因不明。     久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听
------
江上何人初见月,江月何年初照人
系統時間:2024-04-20 15:35:41
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!