procedure AddPara;
begin
  with ADOQry.Parameters do
  begin
      tmpPos := FNameList.IndexOfObject(TObject(STOCK));
      if tmpPos > -1 then
       with AddParameter do
      begin
        Name := 'GPMC_O' + FParameterID;
        Direction := pdInput;
        DataType := ftWideString;
        Value := FNameList[tmpPos];
      end;
    end;
    with AddParameter do
    begin
      Name := 'GPMC' + FParameterID;
      Direction := pdInput;
    DataType := ftWideString;
    Value := EdtStockName.Text;
    end;    with AddParameter do
    begin
      Name := 'QDFS_S' + FParameterID;
      Direction := pdInput;
    DataType := ftinteger;
    Value := Integer(CBGetMode_Stock.Items.Objects[CBGetMode_Stock.ItemIndex]);
    end;    with AddParameter do
    begin
      Name := 'RZSJ_S' + FParameterID;
      Direction := pdInput;
    DataType := ftDateTime;
    Value := DTPStock.Date;
    end;    with AddParameter do
    begin
      Name := 'GQSL' + FParameterID;
      Direction := pdInput;
    DataType := ftInteger;
    Value := SENum.Value;
    end;    with AddParameter do
    begin
      Name := 'SFSS' + FParameterID;
      Direction := pdInput;
    DataType := ftBoolean;
    Value := RGMarket.ItemIndex = 1;
    end;    with AddParameter do
    begin
      Name := 'ZGB' + FParameterID;
      Direction := pdInput;
    DataType := ftInteger;
    Value := NECapital.Value * MoneyUnit;
    end;    if Trim(EdtTrade.Text) = '' then
      EdtTrade.Text := '  ';    with AddParameter do
    begin
      Name := 'SSHY' + FParameterID;
      Direction := pdInput;
    DataType := ftWideString;
    Value := EdtTrade.Text;
    end;    with AddParameter do
    begin
      Name := 'JYZK' + FParameterID;
      Direction := pdInput;
      DataType := ftInteger;
    Value := Integer(CBFare.Items.Objects[CBFare.ItemIndex]);
    end;    with AddParameter do
    begin
      Name := 'PGJ_S' + FParameterID;
      Direction := pdInput;
      DataType:= ftFloat;
    Value := NEEvaluate_Stock.Value * MoneyUnit;
    end;    with AddParameter do
    begin
      Name := 'SFGH_S' + FParameterID;
      Direction := pdInput;
    DataType := ftBoolean;
    Value := RGTransfer_Stock.ItemIndex = 1;
    end;
end;调用 这个过程添加参数,后来又添加了SQL语句到ADOQUERY.SQL,然后再调用这个过程添加参数
但执行时发现,除了最后一次添加的参数,前面添加的参数数据类型全部变成了ftWideString,就好像被什么覆盖了一样,但参数对象还在,值也对,就是DATATYPE不对了。这是为什么?

解决方案 »

  1.   

    代码不对吧  with ADOQry.Parameters do
      begin
          tmpPos := FNameList.IndexOfObject(TObject(STOCK));
          if tmpPos > -1 then
           with AddParameter do
          begin
            Name := 'GPMC_O' + FParameterID;
            Direction := pdInput;
            DataType := ftWideString;
            Value := FNameList[tmpPos];
          end;
        end; ------------------------------这个地方对应的是with ADOQry.Parameters do
      

  2.   

    我大概知道是为什么了。
    因为要循环添加SQL和参数,但每次SQL改变时都会重新生成PARAMETER对象,所以全部重设为ftWideString类型了。
    有没有什么办法保持原类型不变?
      

  3.   

    晕,ado控件让你用成这样,简直是天才呀。你的代码没有太仔细看,不要说我不尊重你。但是大概知道你的意思了。给你一段代码你看看是不是符合你的要求。procedure TcallData.updateInf(sqlText: string; paramvalues: TStringList; out errorHint: WideString);
    var
      tmpquery: TQuery;
      i: integer;
    begin
      try
        tmpquery := TQuery.Create(nil);    with tmpquery do
        begin
          DatabaseName := Fdm.DatabaseName;
          Close;
          sql.Clear;
          sql.Add(sqlText);
          if (Assigned(paramvalues)) and (paramvalues.Count > 0) then
          begin
            for i := 0 to paramvalues.Count - 1 do
            begin
              Params[i].Value := paramvalues.Strings[i];
            end;
          end;
          try
            ExecSQL;
          except      end;
        end;
      finally
         tmpquery.Free;
      end;
    end;
      

  4.   

    补充一下,上边的代码是对应tquery的,tadoquery和他差不多。自己修改一下就可以了。
      

  5.   

    tquery和tadoquery是不需非要指定数据类型的,只要使用上边的办法就可以自己寻找数据库表中对应的数据类型并进行自动转换。除非你录入的数据类型转换失败,否则可以自己对应。
      

  6.   

    呵呵,项目需要。我跟了一下,发现给SQL添加语句时会重新通过ADO COM对象获取参数,应该是在这里全部重设为WIDESTRING了。哪位有耐心循环100次,每次添加一条SQL语句,再添加多个参数,指定不同类型,肯定能浮现问题
      

  7.   

    数据表中为MONEY,自动转换肯定会出错