首先声明,本人不是很清楚这些关系,现在在一个自定义类中用adoquery执行一个查询,查询结束后ADOQUERY就要关闭,所以想把查询结果保存到Clientdataqset(或其它容器中),然后,用DBGRID显示结果(约有5个字段),现在的问题是无法显示,如果ADOQUERY不关闭,采用DBGRID-DATASOURCE-ADOQUERY的方式可以直接显示。但ADOQUERY关闭了就不行了,请问该咋处理??还有DBGRID的字段宽度能否自动取值的宽度呢?

解决方案 »

  1.   

    Clientdataset 是个容器,楼主最好能将你的问题能说清除一点。另外数据读到DBGrid以后ADOQuery关闭以后,数据也会保存在其data属性里,所以DBGrid依然会显示检索到的数据,检查一下是否是其它原因
      

  2.   

    是吗?可是我试过,如果ADOQUERY不关闭的话,可以用DATASOURCE正确获得,是不是CLIENTDATASET有啥开关参数之类的。
      

  3.   

    Clientdataset   是个容器??
      

  4.   

    我具体代码如下:
      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;  //关闭
      

  5.   

    用DATESETPROVIDE将数据存到CLIENTDATASET中再调用。
      

  6.   

    用Provider+ClientDataSet呗,就放本地得了,不然你还得一个一个创建字段,然后CreateDataSet然后再一条记录一条记录赋值
      

  7.   

    lake_cx能给个代码吗?我就是不知道如何具体实现啊!要用到哪些过程和事件呢?
      

  8.   

    给你参考
    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;
      

  9.   

    你不就是想创建一个ClientDataSet然后把Query的东西存在里面嘛什么时候会要你一定要单独写个过程,你整个程序都只有个main函数都没关系。代码一定要看懂
    1、创建ClientDataSet
    2、在ClientDataSet中加入字段
    3、从qryTmp中读数据出来,存到ClientDataSet中你可以把数据先存里面,把DBGrid绑定这个ClientDataSet
      

  10.   

    真的不好意思,在ClientDataSet中加入字段如何加(不会自动从qryTmp中获取吗)?不能直接将qryTmp中的数据存入ClientDataSet中吗?能不能帮我完善我的代码中?
      

  11.   

    你看我这样行吗??
    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;
      

  12.   

    没什么好看的啊,你要自己搞定啊,我可不会帮你写
    往ClientDataSet中增加字段的时候要记得针对不同的字段类型创建不同的字段,如TStringField、TIntegerField等
      

  13.   

      
    while   not   Qry.Eof   do 
        begin 
            ds.Append; 在这前面加一个ds.createdataset;
       Qry.Next; 
        end; 
        Result   :=   True; 
    在这后面加一个ds.post;
      

  14.   

    Qry.Next;   
            end;   
            Result       :=       True;   
    在这后面加一个ds.post; ///搞错,
    在前面加ds.post才对!
      

  15.   

    Qry.Next;   
            end;   
            Result       :=       True;   
    在这后面加一个ds.post; ///搞错,
    在前面加ds.post才对!
      

  16.   

    给你个简单的,你自己看着改:
    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了。