DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: wanggui999
今日帖子: 30
在线用户: 12
导航: 论坛 -> 数据库专区 斑竹:liumazi,waterstone  
作者:
男 huo_v_wu (勇敢的螳螂) ★☆☆☆☆ -
盒子活跃会员
2022/5/21 22:24:44
标题:
在delphi如何将sql数据导出成dbf? 浏览:410
加入我的收藏
楼主: 现在我需要将sql中查询好的数据 用delphi7写代码导出成固定格式的dbf文件,我的思路是先创建一个dbf表结构,然后再循环插入进去,现在的问题是 错误提示我创建表语法有错误 请大家帮忙看看哪里有错误 代码如下:
  DBFConnect := TADOConnection.Create(nil);
    DBFConnect.LoginPrompt := False;
    NPath := ExtractFilePath(ParamStr(0)) + 'Export\';
    NStr := NZYH + '.dbf';
    if FileExists(NPath + nstr) then
    begin
      DeleteFile(PChar(NPath + nstr));

    end;
    NConStr := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + npath + ';Extended Properties=dBase 5.0; Persist Security Info=False;';
    NStr := 'Create table ' + NZYH + '(' +
      'USERID_ char(60),' +
      'USERNAME char(60),' +
      'BAH char(100),' +
      'ZYCS char(100),' +
      'YLFKFS char(100),' +
      'JKKH char(100),' +
      'XM char(100),' +
      'XB char(100),' +
      'CSRQ char(12),' +
      'MZ char(100),' +
      'SFZH char(100),' +
      'HY char(100),' +
      'ZY char(100),' +
      'XZZ char(100),' +
      'XZQHDM char(100),' +
      'DH char(20),' +
      'YB1 char(20),' +
      'HKDZ char(20),' +
      'HKDZDM char(20),' +
      'YB2 char(6),' +
      'RYTJ char(100),' +
      'RYSJ char(12),' +
      'RYKB char(100),' +
      'CYSJ char(12),' +
      'CYKB char(100),' +
      'JZYTS char(30),' +
      'MZZD char(200),' +
      'JBBM char(100),' +
      'ZYZD char(200),' +
      'JBDM char(100),' +
      'RYBQ char(100),' +
      'ZYZDCYQK char(12),' +
      'QTZD1 char(200),' +
      'JBDM1 char(100),' +
      'RYBQ1 char(100),' +
      'QTZDCYQK1 char(24),' +
      'QTZD2 char(200),' +
      'JBDM2 char(100),' +
      'RYBQ2 char(100),' +
      'QTZDCYQK2 char(24),' +
      'QTZD3 char(200),' +
      'JBDM3 char(100),' +
      'RYBQ3 char(100),' +
      'QTZDCYQK3 char(24),' +
      'QTZD4 char(200),' +
      'JBDM4 char(100),' +
      'RYBQ4 char(100),' +
      'QTZDCYQK4 char(24),' +
      'QTZD5 char(200),' +
      'JBDM5 char(100),' +
      'RYBQ5 char(100),' +
      'QTZDCYQK5 char(24),' +
      'QTZD6 char(200),' +
      'JBDM6 char(100),' +
      'RYBQ6 char(100),' +
      'QTZDCYQK6 char(24),' +
      'QTZD7 char(200),' +
      'JBDM7 char(100),' +
      'RYBQ7 char(100),' +
      'QTZDCYQK7 char(24),' +
      'SSJCZMC1 char(200),' +
      'SSJCZBM1 char(100),' +
      'SSJCZRQ1 char(12),' +
      'SSJCZMC2 char(200),' +
      'SSJCZBM2 char(100),' +
      'SSJCZRQ2 char(12),' +
      'SSJCZMC3 char(200),' +
      'SSJCZBM3 char(100),' +
      'SSJCZRQ3 char(12),' +
      'SSJCZMC4 char(200),' +
      'SSJCZBM4 char(100),' +
      'SSJCZRQ4 char(12),' +
      'SSJCZMC5 char(200),' +
      'SSJCZBM5 char(100),' +
      'SSJCZRQ5 char(12),' +
      'SSJCZMC6 char(200),' +
      'SSJCZBM6 char(100),' +
      'SSJCZRQ6 char(12),' +
      'LYFS char(100),' +
      'ZFY NUMBER(12,2),' +
      'ZFJE NUMBER(12,2),' +
      'YLFUF NUMBER(12,2),' +
      'ZLCZF NUMBER(12,2),' +
      'HLF NUMBER(12,2),' +
      'QTFY NUMBER(12,2),' +
      'BLZDF NUMBER(12,2),' +
      'SYSZDF NUMBER(12,2),' +
      'YXXZDF NUMBER(12,2),' +
      'LCZDXMF NUMBER(12,2),' +
      'FSSZLXMF NUMBER(12,2),' +
      'WLZLF numeric(12,2),' +
      'SSZLF numeric(12,2),' +
      'MAF numeric(12,2),' +
      'SSF numeric(12,2),' +
      'KFF numeric(12,2),' +
      'ZYZLF numeric(12,2),' +
      'XYF numeric(12,2),' +
      'KJYWF numeric(12,2),' +
      'ZCYF numeric(12,2),' +
      'ZCYF1 numeric(12,2),' +
      'XF numeric(12,2),' +
      'BDBLZPF numeric(12,2),' +
      'QDBLZPF numeric(12,2),' +
      'NXYZLZPF numeric(12,2),' +
      'XBYZLZPF numeric(12,2),' +
      'HCYYCLF numeric(12,2),' +
      'YYCLF numeric(12,2),' +
      'YCXYYCLF numeric(12,2),' +
      'QTF numeric(12,2),' +
      'CBRYLX char(12))';

    DBFConnect.ConnectionString := NConStr;
    DBFConnect.Execute(NStr);
----------------------------------------------
-敢于学习,谦虚学习,鼓励批评!!
作者:
男 zhangshelly (雪莱) ★☆☆☆☆ -
盒子活跃会员
2022/5/21 22:43:18
1楼: Microsoft.Jet.OLEDB.4.0 这个不是连access数据库的么,还有dbf的驱动的啊,没试过
实在不行了用 tdbf控件吧 https://sourceforge.net/projects/tdbf/
----------------------------------------------
-
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
注册会员
2022/5/22 2:36:25
2楼: you can try this way: it's more easy!


My DSN file create using Wizard on ADOConnection component: using DBase IV as example!!!
----------
Provider=MSDASQL.1;Persist Security Info=False;Extended Properties="CollatingSequence=ASCII;DefaultDir=D:
\RADRX111Tests\VCL_creating_a_DBF_DBase_file;Deleted=0;Driver={Driver do Microsoft dBase 
(*.dbf)};DriverId=277;FIL=dBase IV;FILEDSN=D:\RADRX111Tests\VCL_creating_a_DBF_DBase_file
\MyDBFFile.dsn;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Statistics=0;Threads=3;
UID=admin;UserCommitSync=Yes;"
----------

my FormMain for test:

type
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    Memo1: TMemo;
    ADOQuery1: TADOQuery;
    Button1: TButton;
    ADOQuery2: TADOQuery;
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{
// create my table-file with my fields:
ADOQuery1 string = create table MyDBFtb(ID char(10), Names char(30))

//using my "MyDBFtb" table in SQL or you can use an ADOTable as Dataset:
ADOQuery2 string = select * from MyDBFtb
}

procedure TForm1.Button1Click(Sender: TObject);
var
  MyReturn: integer;
begin
  ADOConnection1.Connected        := false;
  ADOConnection1.ConnectionString := 'FILE NAME=D:\RADRX111Tests\VCL_creating_a_DBF_DBase_file\MyDBFFile.dsn;';
  ADOConnection1.Connected        := true;
  //
  if not FileExists('..\..\MyDBFtb.dbf') then
    MyReturn := ADOQuery1.ExecSQL;
  //
  ADOQuery2.Open; // open the table "MyDBFtb" using SQL query!
end;

end.
此帖子包含附件:emailx45_202252224215.zip 大小:400B
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
注册会员
2022/5/22 2:39:07
3楼: screenshot
此帖子包含附件:
PNG 图像
大小:47.7K
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
注册会员
2022/5/22 2:51:01
4楼: Differences between DBase IV and 5 on DSN file :
----------
FIL=dBase IV
DriverId=277
----------
FIL=dBase 5.0
DriverId=533

the rest it's the same!

[ODBC]
DRIVER=Driver do Microsoft dBase (*.dbf)
UID=admin
UserCommitSync=Yes
Threads=3
Statistics=0
SafeTransaction_s=0
PageTimeout=5
MaxScanRows=8
MaxBufferSize=2048
FIL=dBase IV
DriverId=277
Deleted=0
DefaultDir=D:\RADRX111Tests\VCL_creating_a_DBF_DBase_file
CollatingSequence=ASCII
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
注册会员
2022/5/22 3:02:47
5楼: cloning the ADOQuery2 to ADOQuery3

procedure TForm1.Button2Click(Sender: TObject);
begin
  // see on HELP "Data.Win.ADODB.TCustomADODataSet.LockType" use:
  //
  ADOQuery3.Clone(ADOQuery2);
end;
此帖子包含附件:
PNG 图像
大小:16.6K
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
注册会员
2022/5/22 3:41:33
6楼: why error happens?

 ---> DBF limit on total fields size:

  var FieldsSizeTotal:integer;
  FieldsSizeTotal:=0;

  for var MyFieldX in ADOQuery2.Fields do
     FieldsSizeTotal := FieldsSizeTotal+MyFieldX.Size;
     caption:= FieldsSizeTotal.ToString

...
JBDM4 char(100))' + ... > 4000bytes
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
注册会员
2022/5/22 3:44:28
7楼: dBase IV limitations
Last updated: 15 Nov 2003 by XpertSS.com

Approach can use a number of different database file structures, but uses dBaseIV by default. dBaseIV has the following limitations that you might need to be aware of:

maximum file size = 2 gigabytes (per type .dbf or .dbt file)
maximum records per database = 1,000,000,000 (1 billion)
maximum of 30 open dBaseIV databases on a single computer
maximum number of fields per record = 255
maximum size of a record = 4000 characters (= all the field-lengths added together)

http://www.johnbrown.com.au/approach/webfaq04040210.html#:~:text=maximum%20number%20of%20fields%20per,the%20field%2Dlengths%20added%20together)

https://www.dbase.com/Knowledgebase/faq/dBASE_Limits_FAQ.html
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
注册会员
2022/5/22 3:57:13
8楼: Solution:

A: create how many DBF files was necessary!

in your case, you needs use "MASTER / DETAILS" technic!!!

dbfMaster -> main fields with ID
dbDetails1 -> mainID, other fields
dbDetails2 -> mainID, other fields
dbDetails3 -> mainID, other fields
...
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!
作者:
男 tuhemm (刀锋土禾) ▲△△△△ -
禁用账号
2022/5/22 18:27:59
9楼: ……
被禁用帐号,帖子内容自动屏蔽!
……

----------------------------------------------
发布无用信息,禁用帐号!
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行46.875毫秒 RSS