其他语言

位置:IT落伍者 >> 其他语言 >> 浏览文章

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


发布日期:2022年09月16日
 
用Delphi实现不同数据库系统之间的数据转移

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

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

基 本 思 想 是 在 一 个Form 中 分 别 用 两 个TDatabase 控 件 连 接 新 老 数 据 库 并 采 用 TTableTDbGrid 作 为 数 据 转 移 的 中 心 根 据DbGrid 中 的 数 据 生 成 标 准 的SQL 插 入 语 句 这 样 就 实 现 了 从 一 个 数 据 库 系 统 到 另 一 个 数 据 库 系 统 的 数 据 转 移 在 这 里 采 用TTableTDbGrid 作 为 数 据 转 移 的 中 心 是 一 个 技 巧 因 为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;

Label: TLabel;

db: TDatabase; {用于连接老数据库系统}

db: TDatabase; {用于连接新数据库系统}

dbg: TDBGrid;

tblSource: TTable; {dbg的Datasource}

qryInsert: TQuery;

{用于存放生成的SQL Insert语句}

srcSource: TDataSource;

tblDest: TTable; {DBGrid的Datasource}

DBGrid: TDBGrid;

srcDest: TDataSource;

edFromtbl: TEdit;

Label: TLabel;

Label: TLabel;

edToTbl: TEdit;

procedure btnOKClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmConvertDB: TfrmConvertDB;

implementation

{$R *DFM}

procedure TfrmConvertDBbtnOKClick

(Sender: TObject);

var iField :integer;

begin

if ((edTotbltext<>) and

(edFromtbltext<>))then begin

tblSourceTableName:=edFromtbltext;

{指定TableName}

tblDestTableName:=edTotbltext;

with tblSource do begin

Open; {打开老系统的表}

while EOF=FALSE do begin

{逐条记录处理}

qryInsertSQLClear;

qryInsertsqlAdd

(Insert into +edTotbltext + ();

for iField:= to dbgFieldCount do begin

qryInsertsqladd

(dbgFields[iField]DisplayLabel);

if iField<>dbgFieldCount then

qryInsertsqladd();

end;

qryInsertsqladd() values();

for iField:= to dbgFieldCount do begin

{进行数据类型转换}

if dbgfields[iField]DataType=ftInteger then

qryInsertsqladd(inttostr

(dbgfields[iField]asInteger));

if dbgfields[iField]DataType=ftFloat then

qryInsertsqladd(floattostr

(dbgfields[iField]asFloat));

if dbgfields[iField]DataType=ftDate then

qryInsertsqladd(+datetostr

(dbgfields[iField]asDateTime)+);

if dbgfields[iField]DataType=ftString then begin

if dbgfields[iField]asString<> then

qryInsertsqladd(+dbgfields

[iField]asString+)

else

qryInsertsqladd(NULL);

end;

if iField<>dbgFieldCount

then qryInsertsqladd();

end;

qryInsertsqladd());

qryInsertExecSQL;

{把数据插入到新系统的表中}

next;

end;

end;

tblDestClose;

tblDestOpen;;

ShowMessage( 转换完毕! );

end

else

ShowMessage

(请输入要插入数据的表的名称 );

end;

end

               

上一篇:Delphi多层应用程序的实现

下一篇:DELPHI中利用对象的常用属性制作动画