在 計 算 機 應 用 系 統 的 軟 件 升 級 改 造 過 程 中 我 們 經 常 遇 到 這 樣 一 個 問 題 老 系 統 的 數 據 庫 平 台 與 新 系 統 不 同 例 如 老 系 統 的 數 據 庫 平 台 是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
From:http://tw.wingwit.com/Article/program/Delphi/201311/25079.html