我的代码:
  with GAdoQuery do
  try
    if Active then Close;
    SQL.Clear;
    SQL.Add(' SELECT * FROM M_USER WHERE VC_USERID = :USERID ');
    Parameters.ParamByName('USERID').Value := '0001';
    showmessage(sql.text);
    Open;
  finally
    Close;
  end;
  
  这段代码在执行到showmessage后,显示出的sql语句是: SELECT * FROM M_USER WHERE VC_USERID = :USERID 
  我希望能显示出的sql语句是: SELECT * FROM M_USER WHERE VC_USERID = '0001'
  
  请高手指教该怎么写?

解决方案 »

  1.   

    你Open后,再显示
     showmessage(GADOQuery.SQL.Text);
      

  2.   

    ADO跟踪不了带参数的SQL语句
      

  3.   

    Open之后就能跟踪吗?呵呵
    何况那样还有什么意义?
    ADO就跟踪不了带参数的SQL语句
    SQL.ADD('SELECT * FROM M_USER WHERE VC_USERID ='+QuotedStr('0001')) 
    这样写算了
      

  4.   

    这样写:SQL.ADD('SELECT * FROM M_USER WHERE VC_USERID ='+QuotedStr('0001'))  
    虽然可以达到目的,但是对于频繁执行的sql语句来说,是个非常低效的做法,我连的数据库是oracle,如果这样写,每次调这个sql的时候,oracle都要重新编译这个sql语句;而如果采用带参数的方式,就不用重复编译了
      

  5.   

    ADO跟踪不了带参数的SQL语句的  UP
      

  6.   

    自己写个替换函数就可以了么。
      with GAdoQuery do 
      try 
        if Active then Close; 
        SQL.Clear; 
        SQL.Add(' SELECT * FROM M_USER WHERE VC_USERID = :USERID '); 
        Parameters.ParamByName('USERID').Value := '0001'; 
        showmessage(GetParamSQL(GAdoQuery)); 
        Open; 
      finally 
        Close; 
      end;   function GetParamSQL(aq: TADOQuery): String;
      var
        i: Integer;
        str, ParameName, ParameValue: String;
      begin
        str := '';
        if aq = nil then
          exit;
        str := aq.SQL.Text;
        for i := 0 to  aq.Parameters.Count - 1 do
        begin
          ParameName := ':' + aq.Parameters[i].Name;
          ParameValue := '''' + aq.Parameters[i].Value + '''';
          str := StringReplace(str, ParameName, ParameValue, [rfIgnoreCase]);
        end;    Result := Str;
      end;
      

  7.   

    with GAdoQuery do 
      try 
        if Active then Close; 
        SQL.Clear; 
        SQL.Add(' SELECT * FROM M_USER WHERE VC_USERID = :USERID '); 
        Parameters.ParamByName('USERID').Value := '0001'; 
        showmessage(sql.text); 
        Open; 
      finally 
        Close; 
      end; 
       
    -----
    with GAdoQuery do 
      try 
        if Active then Close; 
        SQL.Clear; 
        SQL.Add(' SELECT * FROM M_USER WHERE VC_USERID = ''0001'''); 
        Open; 
      finally 
        Close; 
      end; 
       
      

  8.   

    我自己写了个函数:
    procedure TfrmMain.AdoQueryBeforeOpen(DataSet: TDataSet);
    var
      sLog, sTmp: string;
      i: Integer;
    begin
      with (DataSet as TADOQuery) do
      begin
        sLog := SQL.Text;
        for i:=0 to Parameters.Count-1 do
        begin
          if Parameters.Items[i].DataType in [ftString] then
            sTmp := QuotedStr(Parameters.Items[i].Value)
          else
            sTmp := Parameters.Items[i].Value;      sLog := StringReplace(sLog, ':'+Parameters.Items[i].Name, sTmp, [rfReplaceAll, rfIgnoreCase]);
        end;
      end;
      WriteLog(sLog);
    end;这个函数赋给了 tadoquery控件的 beforeopen事件,这样每次这个控件open之前,都会把sql语句写到日志里,但是当我需要执行execsql时,没有触发beforeopen这个事件,请高手指点下无论是open还是exexsql都会触发的事件是哪个?
      

  9.   

    应该没问题,你把if Active then Close;先屏蔽了在看看
      

  10.   

    各位写的方法也太麻烦了吧。
      with GAdoQuery do 
      try 
        Close; 
        SQL.text:='SELECT * FROM M_USER WHERE VC_USERID =''0001''';
        Open; 
      except
     
      end; 如果是变量:  with GAdoQuery do 
      try 
        Close; 
        SQL.text:='SELECT * FROM M_USER WHERE VC_USERID ='''+var+'''';
        Open; 
      except
     
      end;