with  ADOQuery1 do
   begin
    Close;
    SQL.Clear;
    SQL.Add('select * from MST_USER where USERID = ''11'' ');
    Open;
    if ADOQuery1.RecordCount = 0  then
    begin
       MessageDlg('無データ !',mtError,[mbOK],0);
       close;
    end
    else
    begin
      Close;
      SQL.Clear;
      SQL.Add(' update MST_USER set PASSWORD = ''crazyliyang''');
      SQL.Add(' where USERID = ''11'' ');
      ExecSQL;//×××××××××××××××××××××××在这出错了,走不动了!不知道为什么
      MessageDlg('Successful !',mtError,[mbOK],0);
      Close;
      SQL.Clear;
      SQL.Add('insert into  MST_USER values(''liyang'',''liyang'') ');
      ExecSQL;
      MessageDlg(' Successful1 !',mtError,[mbOK],0);
      Close;
      SQL.Clear;
      SQL.Add('update MST_USER set PASSWORD = ''crazyliyang'' ') ;
      ExecSQL;
      MessageDlg(' Successful2 !',mtError,[mbOK],0);
    end;
  end;
烦烦!谁能帮我解决一下!咋样ADO数据控件做连续的操作呢?以上这样写是有问题的!

解决方案 »

  1.   

    报什么错,看看你的sql中数据类型是否正确,userid是字符型吗
      

  2.   

    是呀!是varchar类型!我没有捕捉异常,只是走到ExecSQL方法处就停了!好像程序死了的样子,然后就要重启懂程序!
      

  3.   

    为什么不直接edit所select出来的数据,然后post?
    如果一定要这么干,试着自行设置ADOQuery.Commandtype,具体设置方式参考帮助
      

  4.   

    我试了一下你的代码,没有问题啊,不会死啊,是不是数据库的问题,或者是你的开发环境的问题。
    我用的下面的代码,是delphi7procedure TForm1.btn1Click(Sender: TObject);
    begin
    with ADOQuery1 do
      begin
      Close;
      SQL.Clear;
      SQL.Add('select * from b_teacher where code = ''001'' ');
      Open;
      if ADOQuery1.RecordCount = 0 then
      begin
      MessageDlg('無データ !',mtError,[mbOK],0);
      close;
      end
      else
      begin
      Close;
      SQL.Clear;
      SQL.Add(' update b_teacher set PASSWORD = ''cra''');
      SQL.Add(' where code = ''001'' ');
      ExecSQL;//×××××××××××××××××××××××在这出错了,走不动了!不知道为什么
      MessageDlg('Successful !',mtError,[mbOK],0);
      Close;
      SQL.Clear;
      SQL.Add('insert into b_teacher(code,password) values(''liyang'',''liyang'') ');
      ExecSQL;
      MessageDlg(' Successful1 !',mtError,[mbOK],0);
      Close;
      SQL.Clear;
      SQL.Add('update b_teacher set PASSWORD = ''cra'' ') ;
      ExecSQL;
      MessageDlg(' Successful2 !',mtError,[mbOK],0);
      end;
      end;end;
      

  5.   

    我用的是sql server 2k 你用的什么数据库啊,是不是数据库不支持啊
      

  6.   

    数据库是oracle的!工具是delphi 2010!数据库是支持的 !做一个操作是可以的!连续三个的话,会出现
    阻塞的现象,ExecSQL方法处就停了,设的断点就走不动了!不知道咋处理
      

  7.   

    再就是ADOQuery.Commandtype是怎么用的!我是初学者!
      

  8.   

     delphi2010还真不太熟悉。
     如果不行,你这段代码可以用存储过程来实现。
     或者
     sql.add('declare @i int');
     sql.add('select @i=count(*) from MST_USER where USERID = ''11'''); 
     sql.add('if @i>0 then  ');
     SQL.Add(' update MST_USER set PASSWORD = ''crazyliyang''');
     SQL.Add(' where USERID = ''11'' ');
     SQL.Add('insert into MST_USER values(''liyang'',''liyang'') ');
     SQL.Add('update MST_USER set PASSWORD = ''crazyliyang'' ') ;
      ....
      ExecSQL;大概是这个意思,我没有仔细写。这样与数据库只交互一次,业务都是在数据库内完成的,也可以加事务。 
      

  9.   

    参考ado手册
    ADOQuery.CommandtypeadCmdUnspecified -1 不指定命令类型的参数。 
    adCmdText 1 按命令或存储过程调用的文本定义计算 CommandText。 
    adCmdTable 2 按表名计算 CommandText,该表的列全部是由内部生成的 SQL 查询返回的。 
    adCmdStoredProc 4 按存储过程名计算 CommandText。 
    adCmdUnknown 8 默认值。指示 CommandText 属性中命令的类型未知。 
    adCmdFile 256 按持久存储的 Recordset 的文件名计算 CommandText。仅与 Recordset.Open 或 Requery 使用。 
    adCmdTableDirect 512 按表名计算 CommandText,该表的列被全部返回。仅与 Recordset.Open 或 Requery 使用。如需使用 Seek 方法,Recordset 必须通过 adCmdTableDirect 打开。该值不能与 ExecuteOptionEnum 值 adAsyncExecute 结合。 
      

  10.   

    刚才再次跑了一下程序,发现出现我所说的现象的原因是:由于一次性执行了多条记录,《SQL.Clear;
      SQL.Add(' update b_teacher set PASSWORD = ''cra''');》使整个程序的效率大大降低!出现了停滞,我以为是什么问题!谢谢大家!但还是想问一下楼里的前辈:ADOQuery.Commandtype
    的用法,能举些例子就好,非常感谢!
      

  11.   

    这个我就没法帮你了,delphi7里adoquery没有这个属性。不过我觉的你还是要看ado手册的好,adoquery只不过是对其的封装。