熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

用Delphi實現不同數據庫系統之間的數據轉移

2022-06-13   來源: 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


From:http://tw.wingwit.com/Article/program/Delphi/201311/25079.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.