ADOQuery.SQL.Add时,后面应该是Open还是ExecSQL?

解决方案 »

  1.   

    有返回数据集的用OPEN,没有返回数据集的用ExecSQL
      

  2.   

    那创建存储过程时是不是也遵循'有返回数据集的用OPEN,没有返回数据集的用ExecSQL'还是'用ADOQuery组件创建存储过程需要使用其ExecSQL方法,不能使用Open方法'
      

  3.   

    open 对数据库的查询、统计、汇总,然后产生返回记录集的时候使用
    ExecSQL对INSERT、UPDATE、DELETE等数据库记录改变的操作
      

  4.   

    open 对数据库的查询、统计、汇总,然后产生返回记录集的时候使用 
    ExecSQL对INSERT、UPDATE、DELETE等数据库记录改变的操作 这两句是一直都这样还是有例外的时候?
      

  5.   

    如果你执行的语句是insert,delete,update,drop,create等这些没有返回值的,用execsql
    如果是open有返回数据的用open;
      

  6.   

    绝大多数,但也有例外之时,但也是极小数,一时间举不出例外的外子,你可以研究一下以下的:
    想写一个SQL查询及执行器,现在碰到的问题是例如我用ADODataSet(或者用CoreLab的DAC系列控件)当用户输入一条SQL后,这句SQL有可能是有返回结果集的(例如用select语句),也有可能没有返回结果集的(例如用Delete或update),那么应如何使用办呢,究竟用DataSet的Open还是Execute方法呢? 
    如果用Open的话,对于没有结果集返回时就会报错,如果用Exectue的话,那么又不会返回结果集。 
    那么应如何解决这个问题?
    试试我的这个方法,肯定行。
    首先用ADOConnection.execute执行命令,我试过了执行 select、Delete、存储过程都没问题。
    var aaa:_Recordset;aaa:= ADOConnection1.Execute('exec Add_Assigner ''000'', ''002''');
    aaa:= ADOConnection1.Execute('select * From Table1');
    aaa:= ADOConnection1.Execute('Delete From Table1 Where Code=''00''');
    (上面语句一次选一个就行了,我是上述三种类似都试过了,都不会出错)
      if Assigned(aaa) then 
        if aaa.Fields.Count > 0  then
          ADODataSet1.Recordset := aaa;原理:其实无论ADOQUERY还是ADOTABLE,最终都是执行adoconn.execute来执行语句或都存储过程的 
    execute有两种方式,
    一种是不返回结果,是PROCEDURE
    procedure TADOConnection.Execute(const CommandText: WideString;
      var RecordsAffected: Integer; const ExecuteOptions: TExecuteOptions = [eoExecuteNoRecords]);
    var
      VarRecsAffected: OleVariant;
    begin
      CheckActive;
      ConnectionObject.Execute(CommandText, VarRecsAffected,
        adCmdText+ExecuteOptionsToOrd(ExecuteOptions));
      RecordsAffected := VarRecsAffected;
    end;一种是返回结果,是Function
    function TADOConnection.Execute(const CommandText: WideString;
      const CommandType: TCommandType = cmdText;
      const ExecuteOptions: TExecuteOptions = []): _Recordset;
    var
      VarRecsAffected: OleVariant;
    begin
      CheckActive;
      Result := ConnectionObject.Execute(CommandText, VarRecsAffected,
        Integer(CommandTypeValues[CommandType])+ExecuteOptionsToOrd(ExecuteOptions));
    end;如果数据集控件是用execsql的,就调用procedure execute, 相反就调用 function execute, 交叉时就会出错楼上讲的提示。 现在我们把这过程提前到先用function ADOCONN.EXECUTE()执行语句,然后自行判断有无结果返回,如有,才直接将结果赋值给ADODataSet显示,避免DELPHI默认的用ADOQuery.Open就调用funtion execute, 用EXECSQL就调用Procedure execute , 这样就可以解决楼主的问题了。