我有一个ADOQUERY1(非动态),另一个ADOQUERY2(动态),
问题是这样的:
ADOQUERY1获取数据后,ADOQUERY2用CLONE从ADOQUERY1获取数据后,网络或数据库断(其实是想直接用内存).这样的情况下有没有什么好的办法,快速为ADOQUEY2重建索引?

解决方案 »

  1.   

    TClientDataSet,TDataSetProvider,ADOQUERY1; 
    TClientDataSet 的ProviderName属性选择TDataSetProvider;TDataSetProvider的DataSet属性选择ADOQUERY1写个获得数据集的函数
    function TDBAccessADO.GetDataSet(SQLCommand:string;DataSet:TClientDataSet): 
                    Integer; 
    begin 
        try         
            adoconnection1.Connected:=true; //数据库建立连接
            clientdataset1.Active:=false; 
            clientdataset1.CommandText:=SQLCommand; //通过sql语句获得结果集
            clientdataset1.Active:=true; 
            DataSet.Data:=ClientDataSet1.Data; 
            clientdataset1.Active:=false; 
            adoconnection1.Connected:=false; //关闭连接
            result:=S_OK; 
        except 
            result:=S_False; 
        end; 
    end; 
    这样数据都读到你的clientdataset里面了,你的数据库也可以断开连接了
      

  2.   

    哦,我试试,但数据取得是没问题的,关键是后面的动态ADOQUERY,如何快速重建索引的问题!
      

  3.   

    对不起,我又闹笑话了.
    其实
    adoquery2.sort='field  DESC'     ///降 
    或者
    adoquery2.sort='field  ASC'      ///升
    就OK了,关键是DESC或ASC均要大写,field是要重建索引的字段名.
      

  4.   


    没有像你那样使用过,给你一个dbgrid绑定clientdataset排序的例子,如果你还要继续研究你的建索引,你就无视它好了。procedure GridTitleSort(Column: TbsColumn);
    var s,cFieldName:string;
        i:integer;
        DataSet:TDataSet;
        procedure setTitle;
        var ii:integer;
            cStr:string;
            c:TbsColumn;
        begin
          for ii:=0 to TbsSkinDBGrid(Column.Grid).Columns.Count-1 do
          begin
            c:=TbsSkinDBGrid(Column.Grid).Columns[ii];
            cStr:=c.Title.Caption;
            if (pos('▲',cStr)=1) or (pos('▼',cStr)=1) then begin
              Delete(cStr,1,2);
              c.Title.Caption:=cStr;
            end;
          end;
        end;
    begin
      setTitle;
      DataSet:=Column.Grid.DataSource.DataSet;
      if Column.Field.FieldKind=fkLookup then
        cFieldName:=Column.Field.KeyFields
      else if Column.Field.FieldKind=fkCalculated then
        cFieldName:=Column.Field.KeyFields
      else
        cFieldName:=Column.FieldName;
      if DataSet is TCustomADODataSet then begin
        s:=TCustomADODataSet(DataSet).Sort;
        if s='' then begin
          s:=cFieldName;
          Column.Title.Caption:='▲'+Column.Field.DisplayName;
        end
        else begin
          if Pos(cFieldName,s)<>0 then begin
            i:=Pos('DESC',s);
            if i<=0 then begin
              s:=s+' DESC';
              Column.Title.Caption:='▼'+Column.Field.DisplayName;
            end
            else begin
              Column.Title.Caption:='▲'+Column.Field.DisplayName;
              Delete(s,i,4);
            end;
          end
          else begin
            s:=cFieldName;
            Column.Title.Caption:='▲'+Column.Field.DisplayName;
          end;
        end;
        TCustomADODataSet(DataSet).Sort:=s;
      end
      else if DataSet is TClientDataSet then begin
        if TClientDataSet(DataSet).indexfieldnames<>'' then
        begin
          i:=TClientDataSet(DataSet).IndexDefs.IndexOf('i'+Column.FieldName);
          if i=-1 then
          begin
            with TClientDataSet(DataSet).IndexDefs.AddIndexDef do
            begin
              Name:='i'+Column.FieldName;
              Fields:=Column.FieldName;
              DescFields:=Column.FieldName;
            end;
          end;
          TClientDataSet(DataSet).IndexFieldNames:='';
          TClientDataSet(DataSet).IndexName:='i'+Column.FieldName;
          Column.Title.Caption:='▼'+Column.Title.Caption;//.Field.DisplayName;
        end
        else
        begin
          TClientDataSet(DataSet).IndexName:='';
          TClientDataSet(DataSet).IndexFieldNames:=column.fieldname;
          Column.Title.Caption:='▲'+Column.Title.Caption;//.Field.DisplayName;
        end;
      end;
    end;
      

  5.   

    感谢hongqi162!    其实用CLONE的办法,ADOQUERY2有可能随着ADOQUERY1的变化而变化.