计算机世界日报
返回首页 产品报价 实用技巧 国产软件 技术天地 站点精选

计算机世界展览会日报

  综合要闻
  企业&人.com
  产品与技术
  网络与通信
  市场与渠道
  99全文检索

CCW网站

  网络世界
  微电脑世界
  IT经理世界
  CCW展览
  信息服务中心   家用电脑世界

兄弟刊物

  电子与信息化
  今日电子
  中国新闻科技
  电子知识产权
  电子产品世界

网上专递

  Linux园地
  友情链接
  冬涛谈法
Dongtao on Law

98内容总汇



实用技巧

用Delphi 实 现 不 同 数 据 库 系 统 之 间 的 数 据 转 移

厦 门 市 邮 政 局 邮 政 设 备 科
曾 剑 平

---- 在 计 算 机 应 用 系 统 的 软 件 升 级 改 造 过 程 中, 我 们 经 常 遇 到 这 样 一 个 问 题: 老 系 统 的 数 据 库 平 台 与 新 系 统 不 同。 例 如, 老 系 统 的 数 据 库 平 台 是Foxpro, 而 新 系 统 的 平 台 是SQL Server。 而 且, 我 们 需 要 把 旧 的 数 据 库 应 用 系 统 中 的 一 些 数 据 转 移 到 新 系 统 来。 但 是 因 为 新 老 系 统 在 定 义 数 据 类 型、 数 据 格 式 等 方 面 的 差 异, 就 很 难 用 人 工 录 入 的 方 法 来 实 现。 因 此, 需 要 有 一 个 能 实 现 这 种 功 能 的 程 序。

---- 本 文 利 用Borland Delphi 实 现 了 这 个 转 移 过 程。

---- 基 本 思 想 是: 在 一 个Form 中, 分 别 用 两 个TDatabase 控 件 连 接 新 老 数 据 库。 并 采 用 TTable、TDbGrid 作 为 数 据 转 移 的 中 心, 根 据DbGrid 中 的 数 据 生 成 标 准 的SQL 插 入 语 句。 这 样, 就 实 现 了 从 一 个 数 据 库 系 统 到 另 一 个 数 据 库 系 统 的 数 据 转 移。 在 这 里, 采 用TTable、TDbGrid 作 为 数 据 转 移 的 中 心 是 一 个 技 巧, 因 为:TTable 的Fields 属 性 能 指 示 出 某 字 段 的 字 段 名 称、 数 据 类 型 等, 这 为 数 据 转 移 过 程 中 的Insert 语 句 的 生 成 及 数 据 类 型 转 换 提 供 了 依 据。

---- 下 面 的 例 子 展 示 了 从Foxpro 到SQL Server 的 数 据 转 移 方 法。 至 于 其 他 系 统 间 的 数 据 转 移, 只 要 根 据 目 标 系 统 的 数 据 定 义 要 求, 修 改 相 应 的Insert 语 句。

---- 程 序 代 码 如 下:

unit ConvertDBF;

interface

uses
 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.
 
免 费 订 阅

实用技巧分类

Office应用
CAD
C、C++
数据库应用
Delphi
Internet应用
Java
Notes应用
操作系统应用
PowerBuilder
VB
Visual Foxpro
其他类
上周 排行榜
如 何 投 稿 ?

编者的话

在日常的工作生活中, 我们对计算机软硬件技术的应用开发肯定有许多的心得体会, 拿来和众人分享:让别人得到他们想要的,使自己找到苦苦寻觅的; 小的点点滴滴,大的工程系统,这里都需要。投稿 的关键在“技巧”二 字,知他人所不知,这样的稿件本栏最最欢迎! 大家公认的 好文章自然会有好的奖励。希望每个人 在这里都有所收获...

r2.gif (980 bytes)
  中国惠普
  3Com中国
  Motorola中国
  CA中国
  Cabletron
  Sony在中国
  西门子WinCC
  爱普生中国
  中国建设银行
  德州仪器(TI)
  问博医药


中国计算机世界出版服务公司版权所有