因为我在代码里不停的要入库查询而后操作。
这个OPEN和EXECSQL都把我搞晕了。这是我的代码
     DATASOURCE1.DataSet:=ADOQUERY1;
      adoquery1.Close;
      adoquery1.sql.Clear;
     adoquery1.SQL.Add('SELECT a.姓名....
     adoquery1.SQL.Add('WHERE strcomp( 单号,:A_czr,1)=0 ');
      adoquery1.Parameters.ParamByName('A_czr').Value:=edit24.Text;
     adoquery1.open;
     //adoquery1.execsql;问题1:这里用adoquery1.execsql;就会提示错误。我以前只知道查询一般用OPEN,更新一般用EXECSQL;
但是这里是查询,就一定不能用EXECSQL吗?还是我写的代码有问题。我执行以上的查询后,要再点击一个BUTTON2执行一个UPdate,我的代码这么写
    DATASOURCE1.DataSet:=ADOQUERY1;
     //先更新C表,除了保单号不能该,其他的都可以修改。
     adoquery1.Close;
      adoquery1.sql.Clear;
      adoquery1.SQL.Add('update 业务信息表 set 卡号=:c1,');
      adoquery1.SQL.Add('WHERE  strcomp( 人ID,:temp1,1)=0 ');
      adoquery1.Parameters.ParamByName('temp1').Value:=edit25.Text;
      execsql;                    
问题2:  相当于我对查询的结果进行修改。但是提示错误Object or class type required   。改来改去,都不晓得问题在那里。

解决方案 »

  1.   

    好久不玩delphi了,就我以前的经验说说吧
    问题1,你所说的没错,不过只是一部分,一般是有结果集返回的用open,无结果集返回的用execsql,印象中,哪怕是调用存储过程也可以这样用问题2,好像你还少了一个参数c1没设置
      

  2.   

    呵呵,没有返回集是不能用open的,
      

  3.   

    哦,下面的代码我省略了。完整的是这样的。
         adoquery1.Close;
          adoquery1.sql.Clear;
          adoquery1.SQL.Add('update 业务信息表 set 卡号=:c1,');
          adoquery1.SQL.Add('WHERE  strcomp( 人ID,:temp1,1)=0 ');
          adoquery1.Parameters.ParamByName('temp1').Value:=edit25.Text;
          Parameters.ParamByName('c1').Value :=Trim(edit23.Text );
          adoquery1.execsql;  
    问题2:其实我就想问,是不是执行了OPEN后,就不能执行这个adoquery1.execsql了。我的button1是执行查询,button2是对查询的结果进行更新。
      

  4.   

    我觉得代码这么写是没错吧。不加上这段,编译可以通过,加上后就提示错误Object or class type required  。
      

  5.   

    最后不要用同一个adoquery同时open后再execsql
    对查询结果进行更新,更新完后adoquery.post提交,才能跟新到数据库里去
      

  6.   

    最后不要用同一个adoquery同时open后再execsql好的,我试试换个。谢谢,一会结帖。
      

  7.   

    一般来说:用select时,用open
    用insert,delete,update时,用execsql.
      

  8.   

    Object or class type required 需要对象或类类型。还是这么提示,换用两个ADOQUERY也不行。
      

  9.   

    实在是没招了。
    Object or class type required 需要对象或类类型。还是这么提示,查询和更新换用两个ADOQUERY也不行。
         adoquery1.Close;
          adoquery1.sql.Clear;
          adoquery1.SQL.Add('update 业务信息表 set 卡号=:c1,');
          adoquery1.SQL.Add('WHERE  strcomp( 人ID,:temp1,1)=0 ');
          adoquery1.Parameters.ParamByName('temp1').Value:=edit25.Text;
          Parameters.ParamByName('c1').Value :=Trim(edit23.Text );
          adoquery1.execsql;  
    我觉得代码这么写是没错吧。不加上这段,编译可以通过,加上后就提示错误Object or class type required  。
      

  10.   

    1、对于所有返回数据集的查询都应该使用.Open,不返回数据集的使用execsql;
    2、对于存储过程,返回数据集(游标)的使用Open,否则使用ExecProc;
      

  11.   

    更新数据时,不要这句 DATASOURCE1.DataSet:=ADOQUERY1;
      

  12.   

    疯了,去掉DATASOURCE1.DataSet:=ADOQUERY1;好像也不行。
      

  13.   

    prepared優化查詢
    open;有返回值用於select
    ExecSQL用於Insert,update,delete