try
    dbCmd := CoCommand.Create;
    dbCmd.CommandTimeout := 30;
    dbCmd.CommandType := adCmdText;
    dbCmd.Set_ActiveConnection(dbConn);
    for ParamsCount := dbCmd.Parameters.Count - 1 downto 0 do
      dbCmd.Parameters.Delete(ParamsCount);
    CmdString := 'select * from OperatorInfo where operator_name = ?';
    Param := dbCmd.CreateParameter('@operator_name', adVarChar, adParamInput, 30, OperatorName); //OperatorName='admin';
    dbCmd.Parameters.Append(Param);
    dbCmd.CommandText := CmdString;
    Rst := dbCmd.Execute(RecordsAffected, dbCmd.Parameters[0], 0);
    while not Rst.EOF do
    begin
      ...
      Rst.MoveNext;
    end;
  except
    on E: Exception do
        ...
  end;
  为什么在跟踪时发现传入值为空呀??
  这是跟踪器跟踪出来的信息:exec sp_executesql N'select * from OperatorInfo where operator_name = @P1', N'@P1 varchar(30)', ''

解决方案 »

  1.   

    奇怪了,怎么会嫌代码多呢?难得大家这么几行代码就觉得多了?希望大家能帮忙看看。其实我只是问问大家这两句代码而已:
    Param := dbCmd.CreateParameter('@operator_name',adVarChar,adParamInput30,OperatorName); 
    //OperatorName='admin';
    dbCmd.Parameters.Append(Param);
    其中OperatorName有值,调试时已经看到。但为什么后台跟踪出来的代码却显示为空值。就是说OperatorName的值没有传入??
    跟踪器结果:exec sp_executesql N'select * from OperatorInfo where operator_name = @P1', N'@P1 varchar(30)', ''
      

  2.   

    SQL语句中没有定义"@operator_name"
    把"select * from OperatorInfo where operator_name = ?"改为:
    "select * from OperatorInfo where operator_name = :operator_name"
    把"Param := dbCmd.CreateParameter('@operator_name', adVarChar, adParamInput, 30, OperatorName); " 该为:
    "Param := dbCmd.CreateParameter('operator_name', adVarChar, adParamInput, 30, OperatorName); "
    试试^-^
      

  3.   

    如果是存诸过程,存储有误,有可能表名有误,
    用adostoreporc,试试,不用execprc,用active=true;
      

  4.   

    不是存储过程,只是简单的一句select * from OperatorInfo where operator_name = ?然后通过parameters传入值的。可是后台跟踪总是为空。