紧急求助:如何将Access的表导出为*.dbf文件?

TWWH 2002-08-04 03:31:10
我现在的程序是用ado+Access2000+delphi5做的,现要求把access的表原样
导出为*.dbf文件。我试了一些导出控件(如EMS.QuickExport.Suite.v1.98),
但总出现某些字段(字符型)被截断的情况。
因不能用BDE,所以无法用TBatchMOve控件。
请有经验的朋友不吝赐教!
...全文
516 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
TWWH 2002-08-11
  • 打赏
  • 举报
回复
多谢大家回答!
多谢草哥的源码!有空我试试。
因前几天开发任务比较急,我就用了EMS的控件。它的功能是不错,但的确有导出不完善的地方,就象我开始时说的。
不过,我倒解决了,我分析了它的源码,把不合适的地方改了一下,就好了。
楼上的朋友的办法虽然也可行,但不适合我的程序。这个程序完全用ADO,不
能用BDE,“导出”是程序中的一个模块,当然也不能用delphi及access的工具。
若没有什么好办法,就结帐了!
ferrerocao 2002-08-05
  • 打赏
  • 举报
回复
给一个完整的单元给你,这个单元是以前做的,也是把access数据备份成dbf的数据。仅供你参考!
unit backup;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, Buttons,DBTables,db;

type
Tfrmbackup = class(TForm)
Label1: TLabel;
Label2: TLabel;
DTPStartDate: TDateTimePicker;
Label3: TLabel;
DTPEndDate: TDateTimePicker;
Label4: TLabel;
EdtPath: TEdit;
BitBtnOk: TBitBtn;
BitBtn2: TBitBtn;
procedure BitBtn2Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure BitBtnOkClick(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
frmbackup: Tfrmbackup;

implementation
uses datamodule;
{$R *.dfm}

procedure Tfrmbackup.BitBtn2Click(Sender: TObject);
begin
frmbackup.Close;
end;

procedure Tfrmbackup.FormShow(Sender: TObject);
begin
edtpath.Text:=extractfiledir(application.ExeName)+'\backup';
end;


procedure Tfrmbackup.BitBtnOkClick(Sender: TObject);
var
systemtime:Tsystemtime;
FileName,s,t:string;
begin

if length(edtpath.Text)=0 then
begin
application.MessageBox('备份路径不能为空!','警告',MB_OK);
abort;
end;

if session.IsAlias('dbase') then
begin
application.MessageBox('你已经备份过数据了,请退出程序重新进入再备份!','警告',MB_OK);
abort;
end;
With session Do Begin
configmode:=cmsession;
try
AddStandardAlias('dbase',edtpath.Text,'Foxpro');
finally
configmode:=cmall;
End;
End;

if dtpstartdate.Date=dtpenddate.Date then begin
getlocaltime(systemtime);
s:=FormatDatetime('yyyymmdd',systemtimetodatetime(systemtime));
FileName:=s+'.dbf';
end else begin
s:=FormatDatetime('yyyymmdd',dtpstartdate.DateTime);
t:=formatDatetime('yyyymmdd',dtpenddate.datetime);
Filename:=s+'~'+t+'.dbf';
end;

if fileexists(edtpath.Text+'\sample.dbf') then
deletefile(edtpath.text+'\sample.dbf');
if fileexists(edtpath.text+'\'+FileName) then
deletefile(edtpath.text+'\'+FileName);


with dm.dbfTable do begin
Active := False;
DatabaseName:= 'dbase';
TableType:= ttfoxpro;
TableName:= 'sample';
if not dm.dbfTable.Exists then begin
with FieldDefs do begin
Clear;
With addFieldDef Do Begin
Name:='kh';
DataType:=ftstring;
Size:=7;
end;
with addfielddef do begin
Name:='pjh';
DataType:=ftstring;
Size:=9;
end;
with addfielddef do begin
DataType:=ftstring;
Name:='yyzh';
Size:=7;
end;
with addfielddef do begin
DataType:=ftdate;
Name:='wxrq';
end;
with addfielddef do begin
DataType:=ftstring;
Name:='wxdwdm';
Size:=3;
end;
with addfielddef do begin
DataType:=ftboolean;
Name:='ok';
end;
with addfielddef do begin
DataType:=ftboolean;
Name:='cf';
end;
with addfielddef do begin
DataType:=ftboolean;
Name:='bhg';
end;
with addfielddef do begin
DataType:=ftdate;
Name:='jhwxrq';
end;
with addfielddef do begin
DataType:=ftdate;
Name:='nsrq';
end;
with addfielddef do begin
DataType:=ftstring;
Name:='jsdj';
size:=1;
end;
with addfielddef do begin
DataType:=ftdate;
Name:='nssj';
end;
with addfielddef do begin
dataType:=ftstring;
Name:='djcx';
size:=8;
end;
with addfielddef do begin
DataType:=ftfloat;
Name:='dy1';
end;
with addfielddef do begin
dataType:=ftfloat;
Name:='dy2';
end;
end;
CreateTable;
End;
end;
With dm.tempQuery Do Begin
Close;
Sql.Clear;
Sql.Add('Select * from print');
sql.Add('where wxrq >= :tempstart');
sql.add('and wxrq <= :tempend');
parambyname('tempstart').AsDateTime:=dtpstartdate.Date;
parambyname('tempend').AsDateTime:=dtpenddate.date;
Open;
While not eof Do Begin
With dm.DbfQuery Do Begin
Close;
Sql.Clear;
Sql.Add('Insert into sample(kh,pjh,yyzh,wxrq,wxdwdm,ok,cf,bhg,jhwxrq,nsrq,jsdj,nssj,djcx,dy1,dy2)');
sql.add('values(:tempkh,:temppjh,:tempyyzh,:tempwxrq,:tempwxdwdm,:tempok,:tempcf,:tempbhg,:tempjhwxrq,');
sql.add('null,:tempjsdj,:tempnssj,:tempdjcx,:tempdy1,:tempdy2)');
Parambyname('tempkh').AsString:=dm.tempQuery.fieldbyname('kh').asstring;
Parambyname('temppjh').Asstring:=dm.tempQuery.fieldbyname('pjh').AsString;
parambyname('tempyyzh').AsString:=dm.tempQuery.fieldbyname('yyzh').AsString;
parambyname('tempwxrq').AsDate:=dm.tempQuery.fieldbyname('wxrq').AsDatetime;
parambyname('tempwxdwdm').Asstring:=dm.tempQuery.fieldbyname('wxdwdm').Asstring;
parambyname('tempok').Asboolean:=dm.tempQuery.fieldbyname('ok').Asboolean;
parambyname('tempcf').Asboolean:=dm.tempQuery.fieldbyname('cf').Asboolean;
parambyname('tempbhg').Asboolean:=dm.tempQuery.fieldbyname('bhg').Asboolean;
parambyname('tempjhwxrq').AsDate:=dm.tempQuery.fieldbyname('jhwxrq').AsDatetime;
parambyname('tempjsdj').Asstring:=dm.tempQuery.fieldbyname('jsdj').Asstring;
parambyname('tempnssj').AsDate:=dm.tempQuery.fieldbyname('nssj').AsDatetime;
parambyname('tempdjcx').Asstring:=dm.tempQuery.fieldbyname('djcx').Asstring;
parambyname('tempdy1').Asfloat:=dm.tempQuery.fieldbyname('dy1').Asfloat;
parambyname('tempdy2').Asfloat:=dm.tempQuery.fieldbyname('dy2').Asfloat;
execsql;
End;
next;
End;
End;

dm.tempQuery.Close;
dm.dbfquery.Close;
renamefile(edtpath.text+'\sample.dbf',edtpath.text+'\'+Filename);
application.MessageBox('数据备份完毕!','数据备份',MB_OK);
frmbackup.Close;

end;
end.

sunstart 2002-08-05
  • 打赏
  • 举报
回复
方法如下:
建二个odbc别名,一个a联接到MS access数据库(类型为access),
一个b联接到dbf数据库目录(类型为DBf);
再用delphi自带的datadump程序,a为源数据库,b为目的数据库即可。
ddvboy 2002-08-05
  • 打赏
  • 举报
回复
EMS是什么?
wgjsoft 2002-08-05
  • 打赏
  • 举报
回复
ems我用过很好的!倒出没有问题的
chenjiong 2002-08-05
  • 打赏
  • 举报
回复
部分不兼容,EMS.QuickExport.Suite.v1.98应该说是这方面做的比较好的了。要么你用access自已的导出功能试试,看看是否能兼容?
耙子 2002-08-04
  • 打赏
  • 举报
回复
access 很多字段类型是dbf没有,你到的过程可能会出现丢失字段或者字段类型出错的现象。
pcping 2002-08-04
  • 打赏
  • 举报
回复
delphi自带的建库工具有这个功能
qdshen 2002-08-04
  • 打赏
  • 举报
回复
是不是可以把某些字段一条条先存入TString里,然后再一条条写入DBF?

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧