首先声明,本人不是很清楚这些关系,现在在一个自定义类中用adoquery执行一个查询,查询结束后ADOQUERY就要关闭,所以想把查询结果保存到Clientdataqset(或其它容器中),然后,用DBGRID显示结果(约有5个字段),现在的问题是无法显示,如果ADOQUERY不关闭,采用DBGRID-DATASOURCE-ADOQUERY的方式可以直接显示。但ADOQUERY关闭了就不行了,请问该咋处理??还有DBGRID的字段宽度能否自动取值的宽度呢?
调试欢乐多
AdoConn.Open; //连接打开
Qry.SQL.Clear; //设置查询命令
Qry.SQL.Add('select Name as 姓名,Number as 单号,Detailer as 记录,Memo as 备注,Det_Date as 时间 from Detailer where '+str+'='''+val+''''); //这里有两个参数在调用时需要提供的
Qry.Open; //执行命令
//下面不知道该如何写:需要将结果输出到DBGRID中,采用容器。
Qry.close;
AdoConn.close; //关闭
function GetAOAllUsersInfoFc: OleVariant;stdcall
const
cdsFields: array[0..8] of string = ('UserID', 'UserName', 'LoginName', 'Password',
'UserSex', 'UserAge', 'UserJob', 'UserRole', 'UserDept');
qryFields: array[0..8] of string = ('PerUUID', 'PerName', 'LoginName', 'UPassword',
'PerSex', 'PerAge', 'PerJob', 'PerRole', 'PerDept');
var
i: Integer;
sFile: string;
qryTmp: TADOQuery;
cdsTmp: TClientDataSet;
procedure CreateField(DataSet: TDataSet; FieldClass: TFieldClass;
FieldNames: array of string);
var
i: Integer;
AField: TField;
begin
for i := Low(FieldNames) to High(FieldNames) do
begin
AField := FieldClass.Create(DataSet);
AField.FieldName := FieldNames[i];
AField.DataSet := DataSet;
end;
end;
begin
sFile := GetUserInfoDataByPrj;
cdsTmp := TClientDataSet.Create(nil);
CreateField(cdsTmp, TStringField, cdsFields);
cdsTmp.CreateDataSet;
try
if FileExists(sFile) then
begin
qryTmp := TADOQuery.Create(nil);
try
qryTmp.LoadFromFile(sFile);
while not qryTmp.Eof do
begin
cdsTmp.Append;
for i := Low(cdsFields) to High(cdsFields) do
cdsTmp.FieldByName(cdsFields[i]).Value := qryTmp.FieldByName(qryFields[i]).Value;
qryTmp.Next;
end;
finally
qryTmp.Free;
end;
end;
finally
Result := cdsTmp.Data;
cdsTmp.Free;
end;
end;
1、创建ClientDataSet
2、在ClientDataSet中加入字段
3、从qryTmp中读数据出来,存到ClientDataSet中你可以把数据先存里面,把DBGrid绑定这个ClientDataSet
function TDataModule1.HisData(Str,Val:string):Boolean;
var I:Integer;
const DsFields: array[0..4] of string = ('姓名', '单号', '记录', '备注','时间');
begin //查看详细记录
try
Result := False;
AdoConn.Open;
Qry.SQL.Clear;
Qry.SQL.Add('select Name as 姓名,Number as 单号,Detailer as 记录,Memo as 备注,Det_Date as 时间 from Detailer where '+str+'='''+val+'''');
Qry.Open;
while not Qry.Eof do
begin
ds.Append;
for i :=0 to 4 do
ds.FieldByName(Dsfields[i]).Value := Qry.FieldByName(Dsfields[i]).Value;
Qry.Next;
end;
Result := True;
finally
Result :=False;
end;
Qry.Close;
AdoConn.Close;
end;
往ClientDataSet中增加字段的时候要记得针对不同的字段类型创建不同的字段,如TStringField、TIntegerField等
while not Qry.Eof do
begin
ds.Append; 在这前面加一个ds.createdataset;
Qry.Next;
end;
Result := True;
在这后面加一个ds.post;
end;
Result := True;
在这后面加一个ds.post; ///搞错,
在前面加ds.post才对!
end;
Result := True;
在这后面加一个ds.post; ///搞错,
在前面加ds.post才对!
ADOCONN:ADOCONNECTION控件; 设置连接到数据库
ADOQUERY:ADOQUERY控件; 设置连接属性为ADOCONN
DSP1:DATASETPROVIDER控件; 设置DATASET属性为ADOQUERY;
CDS1:CLIENTDATASET控件;
DS1:DATASOURCE控件; 设置DATASET属性为CDS1;
DBGRID:DBGRID控件; 设置DATASOURCE为DS1;
BT1:按钮控件;FUNCTIOEN tFORM1.BT1.CLICK(SENDER:TOBJECT);
BEGIN
ADOCONN.OPEN;
ADOQUERY.SQL.CLEAY;
ADOQUERY.SQL.ADD('SELECT NAME AS ,AGE AS FROM DATABASE');
ADOQUERY.OPEN;
CDS1.DATA := DSP1.DATA;
END;这样就OK了。