我有一个ADOQUERY1(非动态),另一个ADOQUERY2(动态),
问题是这样的:
ADOQUERY1获取数据后,ADOQUERY2用CLONE从ADOQUERY1获取数据后,网络或数据库断(其实是想直接用内存).这样的情况下有没有什么好的办法,快速为ADOQUEY2重建索引?
问题是这样的:
ADOQUERY1获取数据后,ADOQUERY2用CLONE从ADOQUERY1获取数据后,网络或数据库断(其实是想直接用内存).这样的情况下有没有什么好的办法,快速为ADOQUEY2重建索引?
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里面了,你的数据库也可以断开连接了
其实
adoquery2.sort='field DESC' ///降
或者
adoquery2.sort='field ASC' ///升
就OK了,关键是DESC或ASC均要大写,field是要重建索引的字段名.
没有像你那样使用过,给你一个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;