線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1041
推到 Plurk!
推到 Facebook!

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

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-10-25 12:24:45 IP:61.221.xxx.xxx 未訂閱
此為轉貼資料 用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
系統時間:2024-05-15 19:58:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!