---- 在 计 算 机 应 用 系 统 的 软 件 升 级 改 造 过 程 中, 我 们 经 常 遇 到 这 样 一 个 问 题: 老 系 统 的 数 据 库 平 台 与 新 系 统 不 同。 例 如, 老 系 统 的 数 据 库 平 台 是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.
|