用Delphi 實 現 不 同 數 據 庫 系 統 之 間 的 數 據 轉 移 |
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
此為轉貼資料 用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. 發表人 - jackkcg 於 2002/10/25 12:31:58
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |