请问怎么将 Adoquery 数据集进行分页并按页码显示在DBGRID中

解决方案 »

  1.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ADODB,Grids, DBGrids, StdCtrls, ComCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        ListView1: TListView;
        Label1: TLabel;
        Button2: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
        procedure Page_Count;
      public
        { Public declarations }
      end;
    var
      Form1: TForm1;
      page: integer;
    implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    var
      ListItem:TListItem;
      i:integer;
    begin
      with AdoConnection1 do
      begin
        ConnectionString := '连接串';
        open();
      end;
      Page := 0;
    end;procedure TForm1.Page_Count;
    var
      i:integer;
      ListItem:TListItem;
    begin
      ListView1.Clear;
      with AdoQuery1 do
      begin
        Connection := AdoConnection1;
        sql.Clear;
        sql.Add('select a,b from tmplive');
        open;
        if Page = 0 then Page := 1;
        if Page > RecordSet.RecordCount then page := RecordSet.RecordCount;
        Recordset.PageSize := 10;
        RecordSet.AbsolutePage := Page;
        for i:= 1 to Recordset.PageSize do
        begin
          ListItem := ListView1.Items.Add;
          ListItem.SubItems.Add(RecordSet.Fields.Item[0].value);
          ListItem.SubItems.Add(RecordSet.Fields.Item[1].Value);
          Next;
          if RecordSet.EOF then exit;
        end;
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      Page := Page+1;
      Page_Count;
      Label1.Caption := IntToStr(Page);
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
        Page := Page -1;
        Page_Count;
        Label1.Caption := IntToStr(Page);
    end;end.
      

  2.   

    楼上的对于大量数据不适用,因为一开始仍然是加载了所有的数据,现在又分页技术,可以通过sql,每次只取指定数量的数据来,这样可以减少提取时间,搜一下吧,很多
      

  3.   

    這只是提供一個思路和方法,SQL的分頁存儲過程也可以實現可謂是方法多多,先實現LZ的效果;當然至於窗體加載的數據量大小,這可以通知SQL語句+DELPHI代碼+條件語句即可控制具體要根據數據量的大小來量定,因人而異以下我提供一個分頁存儲過程,拋磚引玉,效率未必是最好,供LZ參考之.........
    CREATE  PROCEDURE  [dbo].[Sp_GetPagedResult_Datas]
    (    
        @TableName NVARCHAR(100),
        @FiledName NVARCHAR(100),
        @PageIndex INT,
        @PageSize INT
    )
    AS
    DECLARE @BeginRow INT,@EndRow INT,@SQL NVARCHAR(1000);
    SET @BeginRow=0;
    SET @EndRow=0;
    SET @BeginRow=(@PageIndex-1)*@PageSize+1;
    SET @EndRow=@PageIndex*@PageSize;IF(Len(ISNULL(@TableName,''))>0)
        BEGIN
          IF (LEN(ISNULL(@FiledName,''))>0)
                BEGIN
                 SET @SQL=ISNULL(@SQL,'');
                 SET @SQL=@SQL+'WITH TMP AS ( SELECT *,ROW_NUMBER() OVER( ORDER BY '+@FiledName+') AS ROWNUM FROM '+@TableName+') ';             
                 SET @SQL=@SQL+' SELECT * FROM TMP WHERE ROWNUM BETWEEN '+CAST(@BeginRow AS NVARCHAR)+' AND '+    CAST(@EndRow AS NVARCHAR);
                 PRINT @SQL;
                 EXEC (@SQL);
                END
        END GO
      

  4.   


    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ADODB,Grids, DBGrids, StdCtrls, ComCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        ListView1: TListView;
        Label1: TLabel;
        Button2: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
        procedure Page_Count;
      public
        { Public declarations }
      end;
    var
      Form1: TForm1;
      page: integer;
      CT:Boolean=False;
    implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    var
      ListItem:TListItem;
      i:integer;
    begin
      with AdoConnection1 do
      begin
        ConnectionString := '连接串';
        open();
      end;
      Page := 0;
      ListView1.ViewStyle:=vsReport;//不设置无法显示
    end;procedure TForm1.Page_Count;
    var
      i:integer;
      ListItem:TListItem;
    begin
      ListView1.Clear;
      with AdoQuery1 do
      begin
        //Connection := AdoConnection1;
        //sql.Clear;
        //sql.Add('select a,b from tmplive');
        //open;
        if not CT then
        begin
          Connection := AdoConnection1;
          sql.Clear;
          sql.Add('select a,b from tmplive');
          open;
          for i:=0 to FieldCount-1 do
          begin
            TempColumn:=self.ListView1.Columns.Add;
            TempColumn.Caption:=Fields[i].FieldName;
          end;
          ct:=true;
          First;
        end;
        if Page = 0 then Page := 1;
        if Page > RecordSet.RecordCount then page := RecordSet.RecordCount;
        Recordset.PageSize := 10;
        RecordSet.AbsolutePage := Page;
        for i:= 1 to Recordset.PageSize do
        begin
          ListItem := ListView1.Items.Add;
          ListItem.Caption:=RecordSet.Fields.Item[0].value;
         //ListItem.SubItems.Add(RecordSet.Fields.Item[0].value);
          ListItem.SubItems.Add(RecordSet.Fields.Item[1].Value);
          Recordset.MoveNext;//由原来next->Recordset.MoveNext
          if RecordSet.EOF then exit;
        end;
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      Page := Page+1;
      Page_Count;
      Label1.Caption := IntToStr(Page);
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
        Page := Page -1;
        Page_Count;
        Label1.Caption := IntToStr(Page);
    end;end.
    测试1楼的不能显示
    在1楼基础上修改后可以显示分页效果
      

  5.   


    procedure TForm1.Page_Count;
    var
      i:integer;
      ListItem:TListItem;
      TempColumn:TListColumn;
    begin
      ListView1.Clear;
      with AdoQuery1 do
      begin
        //Connection := AdoConnection1;
        //sql.Clear;
        //sql.Add('select a,b from tmplive');
        //open;
        if not CT then
        begin
          Connection := AdoConnection1;
          sql.Clear;
          sql.Add('select a,b from tmplive');
          open;
          for i:=0 to FieldCount-1 do
          begin
            TempColumn:=self.ListView1.Columns.Add;
            TempColumn.Caption:=Fields[i].FieldName;
          end;
          ct:=true;
          First;
        end;
        if Page = 0 then Page := 1;
        if Page > RecordSet.RecordCount then page := RecordSet.RecordCount;
        Recordset.PageSize := 10;
        RecordSet.AbsolutePage := Page;
        for i:= 1 to Recordset.PageSize do
        begin
          ListItem := ListView1.Items.Add;
          ListItem.Caption:=RecordSet.Fields.Item[0].value;
         //ListItem.SubItems.Add(RecordSet.Fields.Item[0].value);
          ListItem.SubItems.Add(RecordSet.Fields.Item[1].Value);
          Recordset.MoveNext;//由原来next->Recordset.MoveNext
          if RecordSet.EOF then exit;
        end;
      end;
    end;
    修改上面TempColumn变量没定义
      

  6.   

    SQL分页存贮,一般都是这么做的,这对速度不会有太大的影响。