我现在用RODataSnap做了一个服务器
用TADOQuery和TDataSetProvider可接SQL语句的provider:CommonUse
我在客户端上面调用CommonUse
通过SQL语句取数
平常使用没什么问题
为了测试性能,var
  tmpcnt, i: Integer;
  tmstart, tmfinish: TDateTime;
begin
  if Button1.Enabled then
  begin
    Button1Click(Sender);
  end;
  tmpcnt := StrToInt(EditPort.Text);
  try
    for i := 1 to tmpcnt do
    begin
      Application.ProcessMessages;
      if 1 > RandomRange(0, 9) then
      begin
        cds_List.Close;
        tmstart := Now;
        MemoAddText(IntToStr(i) + ':开始取数||开始时间:' + FormatDateTime('hh:mm:ss', tmstart));
        cds_List.Open;
        tmfinish := Now;
        MemoAddText(IntToStr(i) + ':完成取数||结束时间:'
                                + FormatDateTime('hh:mm:ss', tmfinish) + '||耗时:'
                                + FormatDateTime('hh:mm:ss', tmfinish - tmstart));
      end;
    end;
  except
    on e:exception do
    begin
      application.MessageBox(pchar(e.Message), 'Error', 0);
    end;
  end;
end;
我在EditPort中输入20000
然后开始循环
在循环过程中
在服务器上就会出现多次List index out of bounds的提示
如图、

解决方案 »

  1.   

    通过调试,发现报出异常的代码位置是代码如下function TRODataSnapBaseAppServer.AS_GetRecords(const ProviderName: WideString; const Count: Integer; out RecsOut: Integer; const Options: Integer; const CommandText: WideString; var Params: Binary; var OwnerData: AnsiString): binary;
    var lProvider:TCustomProvider;
        lOwnerData,lParams:OleVariant;
    begin
      {$IFDEF DEBUG_REMOBJECTS_DATASNAP}
      DebugServer.EnterMethodEx(self,'IAppServer.AS_GetRecords(ProviderName=%s,Count=%d,Options=%d,CommandText=%s)',[string(ProviderName),Count,Options,CommandText]); try
      try
      {$ENDIF DEBUG_REMOBJECTS_DATASNAP}
      lProvider := GetProviderByName(ProviderName);
      //result := BinaryFromVariant(lProvider.GetRecords(Count, RecsOut, Options));
      lOwnerData := OwnerData;
      lParams := VariantFromBinary(Params);
      result := BinaryFromVariant(lProvider.GetRecords(Count, RecsOut, Options, CommandText, lParams, lOwnerData));
      FreeAndNil(Params);
      Params := BinaryFromVariant(lParams);
      OwnerData := VarToAnsiStr(lOwnerData);
      {$IFDEF DEBUG_REMOBJECTS_DATASNAP}
      except DebugServer.WriteException(); raise; end;
      finally DebugServer.ExitMethodEx(self,'IAppServer.AS_GetRecords(RecsOut=%d)',[RecsOut]); end;
      {$ENDIF DEBUG_REMOBJECTS_DATASNAP}
    end;
    就是
    result := BinaryFromVariant(lProvider.GetRecords(Count, RecsOut, Options, CommandText, lParams, lOwnerData));
    这一行代码
    我试过加上异常保护
    就是
    try
    except
    end;
    但是这个异常却在外面报
    估计是我没找对地方
    有没有哪位大人知道怎么解决这个问题