怎么做个程序实现读取dbf文件并自动转换成sql数据库?

解决方案 »

  1.   

    用Delphi实现不同数据库系统之间的数据转移在计算机应用系统的软件升级改造过程中,我们经常遇到这样一个问题:老系统的数据库平台与新系统不同。例如,老系统的数据库平台是Foxpro,而新系统的平台是SQL Server。而且,我们需要把旧的数据库应用系统中的一些数据转移到新系统来。但是因为新老系统在定义数据类型、数据格式等方面的差异,就很难用人工录入的方法来实现。因此,需要有一个能实现这种功能的程序。本文利用Borland Delphi实现了这个转移过程。基本思想是:在一个Form中,分别用两个TDatabase控件连接新老数据库。并采用TTable、TDbGrid作为数据转移的中心,根据DbGrid中的数据生成标准的SQL插入语句。这样,就实现了从一个数据库系统到另一个数据库系统的数据转移。在这里,采用TTable、TDbGrid作为数据转移的中心是一个技巧,因为:TTable的Fields属性能指示出某字段的字段名称、数据类型等,这为数据转移过程中的Insert语句的生成及数据类型转换提供了依据。下面的例子展示了从Foxpro到SQL Server的数据转移方法。至于其他系统间的数据转移,只要根据目标系统的数据定义要求,修改相应的Insert语句。程序代码如下:unit ConvertDBF;interfaceuses
     Windows, Messages, SysUtils, Classes,
     Graphics, Controls, Forms, Dialogs,
     StdCtrls, DBTables, Db, Grids, DBGrids;type
     TfrmConvertDB = class(TForm)
      btnOK: TButton;
      Label1: TLabel;
      db1: TDatabase;  {用于连接老数据库系统}
      db2: TDatabase;  {用于连接新数据库系统}
      dbg: TDBGrid; 
      tblSource: TTable; {dbg的Datasource}
    qryInsert: TQuery;
       {用于存放生成的SQL Insert语句}
      srcSource: TDataSource;
      tblDest: TTable; {DBGrid1的Datasource}
      DBGrid1: TDBGrid;
      srcDest: TDataSource;
      edFromtbl: TEdit;
      Label2: TLabel;
      Label3: TLabel;
      edToTbl: TEdit;
      procedure btnOKClick(Sender: TObject);
     private
      { Private declarations }
     public
      { Public declarations }
     end;var
     frmConvertDB: TfrmConvertDB;implementation{$R *.DFM}
    procedure TfrmConvertDB.btnOKClick
     (Sender: TObject);
    var iField :integer;
    begin
     if ((edTotbl.text<>'') and 
     (edFromtbl.text<>''))then begin
     tblSource.TableName:=edFromtbl.text; 
              {指定TableName}
     tblDest.TableName:=edTotbl.text;
     with tblSource do begin
       Open; {打开老系统的表}
       while EOF=FALSE do begin
           {逐条记录处理}
        qryInsert.SQL.Clear;
    qryInsert.sql.Add
    ('Insert into '+edTotbl.text + '(');
        for iField:=0 to dbg.FieldCount-1 do begin
          qryInsert.sql.add
         (dbg.Fields[iField].DisplayLabel);
          if iField<>dbg.FieldCount-1 then
           qryInsert.sql.add(',');
        end;
        qryInsert.sql.add(') values(');
    for iField:=0 to dbg.FieldCount-1 do begin
        {进行数据类型转换}
          if dbg.fields[iField].DataType=ftInteger then
           qryInsert.sql.add(inttostr
          (dbg.fields[iField].asInteger));
          if dbg.fields[iField].DataType=ftFloat then
           qryInsert.sql.add(floattostr
          (dbg.fields[iField].asFloat));
          if dbg.fields[iField].DataType=ftDate then
           qryInsert.sql.add(''''+datetostr
          (dbg.fields[iField].asDateTime)+'''');
          if dbg.fields[iField].DataType=ftString then begin
           if dbg.fields[iField].asString<>'' then
            qryInsert.sql.add(''''+dbg.fields
            [iField].asString+'''')
           else
            qryInsert.sql.add('NULL');
          end;
          if iField<>dbg.FieldCount-1
          then qryInsert.sql.add(',');
        end;
        qryInsert.sql.add(')');
    qryInsert.ExecSQL;
                  {把数据插入到新系统的表中}
        next;
       end;
     end;
     tblDest.Close;
     tblDest.Open;;
     ShowMessage(' 转换完毕!  ');
     end
     else
      ShowMessage
      ('请输入要插入数据的表的名称  ');
    end;
    end.
      

  2.   

    问一下!有没有试过这样会不会出现乱码?这样实现和使用batchmove有什么不同?
      

  3.   

    用batchmove就可以了 怎么那样的麻烦呢??
      

  4.   

    用batchmove会出现乱吗?有谁知道怎么回事?
      

  5.   

    用Delphi自带的Datapump进行数据库的转换!
      

  6.   

    在Delphi中使用DBF数据 
    中国青年政治学院计算机中心 
    马竹青 
    ---- Delphi是美国Inprise 公司开发的功能强大的Windows 应用程序开发工具。她是可视化应用程序开发环境、可重用性面向对象编程语言、快速编译器和数据库技术的完美结合。由于Delphi具有运行速度快、功能强大、易于学习和使用且开发迅速等特点,并支持XML和HTML,支持 Web 和Internet的开发,一直受到广大用户的喜爱。 ---- 国内PC机上使用最普及历史最长的数据库是DBF格式的数据库,即是dBASE II、dBASE III和FoxPro中使用的数据库格式。为了充分利用已有的数据库资源,并能在Delphi环境下开发功能更强的应用软件,本文将讨论如何在Delphi中使用DBF数据库(数据表)以及其转换的方法。 ---- 一、直接使用DBF格式的数据库 ---- 若将DBF格式的数据库或表作为应用程序开发中的数据资源,应在Delphi中的"BDE Administrator"数据库引擎中用DBASE或FOXPRO作为配置参数,这样就可以在Delphi中修改和直接访问DBF数据,参见BDE配置工具图(略)。 ---- 二、转换成Delphi环境中的Paradox数据表 ---- Delphi开发工具允许用户创建和访问Paradox 和Local InterBase等服务器的数据库应用,这里我们讨论将DBF转换成Paradox 数据库的方法。 ---- 1、使用数据库桌面Database Desktop --Delphi提供的辅助工具之一 ---- 用Database Desktop(参见图2)的复制功能来实现转换,其操作过程如下: 1)选用菜单"Tools/Utilities/Copy…",将出现"Copy"对话框,让用户指定将要转换的DBF源文件,这里我们选择了student.dbf文件,并按下"OK"键。 ---- 2)这时,出现"Copy to" 对话框,选择目标文件名或在文件名编辑框里输入一个新目标文件名,并给出Paradox数据文件的扩展名.db。 ---- 3)然后选择"Copy"按钮。 ---- 此时,Database Desktop将DBF数据student.dbf转换成了Paradox 的student.db数据。转换过程中,其数据结构的字段类型变化参照表1。 ---- 表1: 
    在DBF的字段类型    转换成Paradox字段类型 
    ------------------------------------------
    C                Alpha           
    F(浮点型)        Number          
    N                Number          
    L                Logical         
    D                Date            
    Memo                Memo            
    OLE                  OLE             
    Binary                Graphic         
    --------------------------------------------- Paradox 确保从DBF备注字段转换来的数值是文本格式,否则如含有其他类型的数据,就应该使用Add功能添加该备注字段到相应的Paradox BLOB类型字段中。 
    ---- 同样,也可以将Paradox数据库表转换成DBF格式,其字段类型将按参照表2自动地转化。如果生成的DBF不含有索引文件、浮点类型字段和备注字段,则Database Desktop 将产生一个dBASE III数据库表;如果生成的DBF表含有OLE或二进制字段类型,则Database Desktop 将产生Windows的DBF数据库表;否则将生成一个dBASE IV数据库表。 ---- 表2: -----------------------------------------------------
    在Paradox中的字段类型 转换成DBF字段类型        备注    
    ----------------------------------------------------
    Alpha                    C                    
    Number                 N(20.4)                    
    Money                 N(20.4)                   
    Short                  N(6.0)                   
    Long Integer        N(11.0)                    
    BCD                 N(20.4)                    
    Date                    D                   
    Time                  C(8)                    
    Timestamp                  C(30)                    
    Memo                  Memo                   
    Formatted Memo         Memo         格式丢失    
    Graphic                  Binary                     
    OLE                         OLE                    
    Logical                  Logical           
    Autoincrement         Number                   
    Binary                  Memo       不能显示数据
    Bytes                  Memo       不能显示数据
    -----------------------------------------------------
    ---- 2、使用数据管道Datapump --Delphi提供的辅助工具之一 
    ---- 用数据管道的移动功能可以实现DBF数据库表转换成Paradox的数据,其操作过程如下: ---- 1)使用Borland数据库引擎BDE,为源数据库和目标数据库各建立一个别名; ---- 2)启动数据管道Data Pump,在其向导程序中指定源数据库的别名或路径; ---- 3)指定目标数据库的别名; ---- 4)从源数据库中选择要移动的数据表(可以选择一个或多个),这里我们选择student.dbf; ---- 5)通过按钮"Modify Mapping Information for Selected Item",修改数据表的结构信息,以适应目标数据表的需求。当选择此按钮,进入"Modify Fields"对话框,从而可以逐一选择DBF数据表的字段名,并修改成所需的Paradox 数据类型,以及目标数据库中不支持的字段类型、索引和数据的完整性等。 ---- 6)单击"Upsize"按钮,使DBF数据表移动到Paradox 。 ---- 7)浏览数据移动结果,若有不满意之处,可以在目标数据表中直接修改;或者观察"Report"对话框显示的移动过程的详细记载,若满足需求,击"Write a copy of this report to file"按钮,输入文件名student.db而保存转换的结果。 ---- 除了DBF和Paradox 数据之外,Data Pump也可以应用到其他的PC数据库或SQL Server数据库之间的转换。 ---- 3、使用Delphi数据访问部件(Data Access)中的BatchMove控件 BatchMove控件具有对成批的记录、整个数据库表进行移动、拷贝和删除操作,但是它不能复制源数据文件的索引和纠错规则等。将DBF 数据库转换成Paradox的数据表操作过程如下: ---- 1)在Database Desktop 中建立Paradox 数据表student.db 的表结构,使其字段顺序等与DBF格式的student.dbf相对应。 ---- 2)在Delphi数据访问部件Data Access中选择两个控件Table,并分别将Table1和Table2连接到源数据文件student.dbf 和目标文件student.db。 ---- 3)在Delphi数据访问部件Data Access中选择控件BatchMove放在一个Form上。 ---- 4)将BatchMove的Mode属性设置为batCopy(功能:复制源文件数据到目标文件中)。 ---- 5)设置Source