procedure TFrmMain.TreeViewEdited(Sender: TObject; Node: TTreeNode;
  var S: String);
begin
  if Node.Level = 0 then begin  
  QueryClass.SQL.Text:= 'UPDATE ClassName SET ClassName=:ClassNameValue '
                      + 'WHERE ClassName = :OldClassName';
  QueryText.SQL.Text := 'UPDATE DocData SET ClassName = :ClassNameValue '
                      + 'WHERE ClassName = :OldClassName';//为什么不指定下面的的游标类型就会出错?  QueryClass.ParamByName('OldClassName').DataType := ftstring;
  QueryText.ParamByName('OldClassName').DataType := ftstring;
  QueryClass.ParamByName('ClassNameValue').DataType := ftString;
  QueryText.ParamByName('ClassNameValue').DataType := ftString;
   
 QueryClass.ParamByName('ClassNameValue').AsString := s;
  QueryClass.ParamByName('OldClassName').AsString := Node.Text;
  QueryText.ParamByName('ClassNameValue').AsString := s;
  QueryText.ParamByName('OldClassName').AsString := Node.Text;  QueryClass.ExecSQL;
  QueryText.ExecSQL;
 end    else begin//下面的为什么不用指定类型就不会出错?      DM.QueryText.SQL.Text := 'UPDATE DocData '
                             + 'SET DocName = :DocNameValue '
                             + 'WHERE DocName = :OldDocName';
      DM.QueryText.ParamByName('DocNameValue').AsString := s;
      Dm.QueryText.ParamByName('OldDocName').AsString := Node.Text;
      DM.QueryText.ExecSQL;
    end;
end;

解决方案 »

  1.   

    我是个SQL菜鸟,问个问题
          DM.QueryText.SQL.Text := 'UPDATE DocData '
                                 + 'SET DocName = :DocNameValue '
                                 + 'WHERE DocName = :OldDocName';这个 “= :”是什么意思啊?
      

  2.   

    那两个符号不是连在一起的。后面的:DocNameValue是一个游标,在后面的语句中设定它的值,就相当于设置一个变量,然后再赋值给它进行运算了。
      

  3.   

    DM.QueryText 这个Query你是不是有一条静态SQL在里面?如果有,会自动取得DataType的,你可以在DM上,选中QueryText,按F11,在Parameters看看有没有内容。
      

  4.   

    我又试了一下,不论Query中Parameters是否有内容,都可以运行,而不需设置类型。
    但为什么问题中的有的又要设置呢?