视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Access数据表分页显示&导入数据库
2020-11-09 07:56:54 责编:小采
文档


以 Delphi 开发基于 Oracle/SQL Server 的数据库应用程序,在显示表中数据时,若数据量过大,难免要应用 分页 技术――幸运的是,诸于此两者的大型 DBMS,对 分页 提供了良好的支持,但对 M$Access 来说却要麻烦些――前提自然是 Access 表中没有自增字段―

以 Delphi 开发基于 Oracle/SQL Server 的数据库应用程序,在显示表中数据时,若数据量过大,难免要应用 分页 技术――幸运的是,诸于此两者的大型 DBMS,对 分页 提供了良好的支持,但对 M$ Access 来说却要麻烦些――前提自然是 Access 表中没有自增字段――而这正是关键...

实现步骤:
一、变量定义
FTotalRecCountMDB: Integer; //Access 库中表的记录数
FFieldLstAndType: string; //字段及字段类型列表
FFieldLst: string; //字段列表

二、变量使用(示例)
FFieldLstAndType:= 'Name varchar(255); Age integer; Addr varchar(255)';
FFieldLst:= 'Name; Age; Addr';

三、准备
//创建同结构临时表――多出 ID 自增字段!
//aqy_Tmp 已连接至对应的 Access
with aqy_Tmp do //aqy_Tmp: TADOQuery
begin
Close;
SQL.Text:= 'Create Table _TabTmp(ID Counter PRIMARY KEY,' + FFieldLstAndType + ')';
ExecSQL;
Close;
end;

//将所选的表中的数据 Copy 到临时表
with aqy_Tmp do
begin
Close;

SQL.Text:=
'Insert Into _TabTmp(' + FFieldLst + ')' +
'Select ' + FFieldLst + ' From ' + edt_TabName.Text; //edt_TabName: TEdit;

ExecSQL;
Close;
end;

四、OK,分页显示&导入DB //每 万条 分一页,<= 万条无需分页――当然,此可更改为 千条、十万条 等。
var
i{, j}: integer;
BatchCount: Integer;
begin
with aqy_Tmp do
begin
if FTotalRecCountMDB <= 10000 then //若需导入的总量 <= 10,000 条,无需分页(批次)导入
begin
if Active then
Close;

SQL.Text:= 'select * from _TabTmp';
Open;

//then import datas into DB
{while not Eof do
...
Next;
}
end
else
begin
if FTotalRecCountMDB mod 10000 = 0 then
BatchCount:= FTotalRecCountMDB div 10000
else
BatchCount:= FTotalRecCountMDB div 10000 + 1;

for i:= 0 to BatchCount - 1 do
begin
if Active then
Close;

//分页
SQL.Text:=
'select * from _TabTmp where ID Between ' +
IntToStr((i * 10000) + 1) + ' and ' + IntToStr((i + 1) * 10000);

Open;

//other codes that import datas to DB
{while not Eof do
...
Next;
}
end; //end for loop
end; //batch end

//delete _TabTmp
if Active then
Close;
SQL.Text:= 'Drop Table _TabTmp';
ExecSQL;
Close;
end; //end with aqy_Tmp
end;

OK,Done!

实际应用中当然至少还应加进 异常处理,及 Application.ProcessMessages 以免在导数据入库过程中程序假死~

ADelphiCoder

下载本文
显示全文
专题