我在远程服务器定义了几个接口,数据类型都是variant * ,在客户端定义变量为variant型,没有out的值,调用到最后一步出现错误“内存被锁定”,不知道什么原因,请高手指教,谢谢~~~

解决方案 »

  1.   

    客户端:
    dmRemoteSale.DCOMConn.AppServer.CreateTempCar(ship_no, strCurTikNo, Car_No,Car_Cls_Cod, Spec_Car_Cod, Spec_Car_Nam, Cargo_Kind_Cod, Cargo_Kind_Nam,Tik_Num, demote_num, sell_win_cod, seller_cod);
    服务器端:procedure TCoRemoteSale.CreateTempCar(var ship_no, CurTikNo, Car_No,
      Car_Cls_Cod, Spec_Car_Cod, Spec_Car_Nam, Cargo_Kind_Cod, Cargo_Kind_Nam,
      Tik_Num, demote_num, sell_win_cod, seller_cod: OleVariant);
    var
      strSQL:string;
      temp:Integer;
      TICKET_PRICE,spec_car_rat:single;
      temp_car_cls_cod:string; //降档后的等级
    begin
      temp := 0;
      repeat
      //创建临时表数据     //计算票价
         strSQL :='select car_pric from t_ship_car_pric where ship_no='''+IntToStr(ship_no)+''' and car_cls_cod='''+car_cls_cod+'''';
         SQLDSTemp.Close;
         SQLDSTemp.CommandText := strSQL;
         SQLDSTemp.Open;     //降档处理
         if  demote_num<> 0 then
         begin
             
         end;
         if not SQLDSTemp.Eof then
            TICKET_PRICE := SQLDSTemp.fieldbyname('car_pric').AsFloat;     strSQL:='Select spec_car_rat from t_ship_spec_car where ship_no='''+InTToStr(ship_no)+''' and spec_car_cod='''+Spec_Car_Cod+'''';
         SQLDSTemp.Close;
         SQLDSTemp.CommandText := strSQL;
         SQLDSTemp.Open;     if not SQLDSTemp.Eof then
            spec_car_rat := SQLDSTemp.fieldbyname('spec_car_rat').AsFloat
         else
            spec_car_rat := 1;     TICKET_PRICE := TICKET_PRICE*spec_car_rat;     strSQL:='insert into t_ship_car_selected(SHIP_NO,TICKET_NO,CAR_NO,CAR_CLS_COD,SPEC_CAR_COD,SPEC_CAR_NAM,CARGO_KIND_COD,CARGO_KIND_NAM,DEMOTE_NUM,TICKET_PRICE,SELL_WIN_COD,SELLER_COD,SELL_TIM) VALUES('+
              ''+IntToStr(ship_no)+','''+ CurTikNo+''','''+CAR_NO+''','''+CAR_CLS_COD+''','''+SPEC_CAR_COD+''','''+SPEC_CAR_NAM+''','''+CARGO_KIND_COD+''','''+CARGO_KIND_NAM+''','+IntToStr(DEMOTE_NUM)+','+FloatToStr(TICKET_PRICE)+','''+SELL_WIN_COD+''','''+SELLER_COD+''',sysdate)';
         sqldsCreateTempCar.Close;
         sqldsCreateTempCar.CommandText := strSQL;
         sqldsCreateTempCar.ExecSQL(True);     //票号增加1
         CurTikNo := IncreaseTikNO(CurTikNo,1);
         temp := temp+1;
      until temp=Tik_Num;
      temp:=0;
      temp:=1;
      if temp then
      begin
      end;
    end;跟踪调试服务器端过程没有错误发现,返回执行客户端代码时出现错误,在Win98下提示“接线者无效”,2000下提示“内存被锁定”。不知道什么原因,请高手指教!~~谢谢~~!!
      

  2.   

    服务器后面的几句无用的代码是我随便加的,完整的应该是:procedure TCoRemoteSale.CreateTempCar(var ship_no, CurTikNo, Car_No,
      Car_Cls_Cod, Spec_Car_Cod, Spec_Car_Nam, Cargo_Kind_Cod, Cargo_Kind_Nam,
      Tik_Num, demote_num, sell_win_cod, seller_cod: OleVariant);
    var
      strSQL:string;
      temp:Integer;
      TICKET_PRICE,spec_car_rat:single;
      temp_car_cls_cod:string; //降档后的等级
    begin
      temp := 0;
      repeat
      //创建临时表数据     //计算票价
         strSQL :='select car_pric from t_ship_car_pric where ship_no='''+IntToStr(ship_no)+''' and car_cls_cod='''+car_cls_cod+'''';
         SQLDSTemp.Close;
         SQLDSTemp.CommandText := strSQL;
         SQLDSTemp.Open;     //降档处理
         if  demote_num<> 0 then
         begin
             
         end;
         if not SQLDSTemp.Eof then
            TICKET_PRICE := SQLDSTemp.fieldbyname('car_pric').AsFloat;     strSQL:='Select spec_car_rat from t_ship_spec_car where ship_no='''+InTToStr(ship_no)+''' and spec_car_cod='''+Spec_Car_Cod+'''';
         SQLDSTemp.Close;
         SQLDSTemp.CommandText := strSQL;
         SQLDSTemp.Open;     if not SQLDSTemp.Eof then
            spec_car_rat := SQLDSTemp.fieldbyname('spec_car_rat').AsFloat
         else
            spec_car_rat := 1;     TICKET_PRICE := TICKET_PRICE*spec_car_rat;     strSQL:='insert into t_ship_car_selected(SHIP_NO,TICKET_NO,CAR_NO,CAR_CLS_COD,SPEC_CAR_COD,SPEC_CAR_NAM,CARGO_KIND_COD,CARGO_KIND_NAM,DEMOTE_NUM,TICKET_PRICE,SELL_WIN_COD,SELLER_COD,SELL_TIM) VALUES('+
              ''+IntToStr(ship_no)+','''+ CurTikNo+''','''+CAR_NO+''','''+CAR_CLS_COD+''','''+SPEC_CAR_COD+''','''+SPEC_CAR_NAM+''','''+CARGO_KIND_COD+''','''+CARGO_KIND_NAM+''','+IntToStr(DEMOTE_NUM)+','+FloatToStr(TICKET_PRICE)+','''+SELL_WIN_COD+''','''+SELLER_COD+''',sysdate)';
         sqldsCreateTempCar.Close;
         sqldsCreateTempCar.CommandText := strSQL;
         sqldsCreateTempCar.ExecSQL(True);     //票号增加1
         CurTikNo := IncreaseTikNO(CurTikNo,1);
         temp := temp+1;
      until temp=Tik_Num;
      //temp:=0;
      //temp:=1;
      //if temp then
      //begin
      //end;
    end;
      

  3.   

    sql语句正确执行,查询数据库已经有数据存在,增加几句代码以后,调试服务器端,没有错误产生,但是只要一返回客户端,就出现了上述错误。
      

  4.   

    看不出来什么明显错误,在你机子上做个简单的com调用的测试,看看能否成功?