說明
為了解決兩個資料庫在互轉時可以更靈活而開發的 Library ,雖然市面上早就有很多 DB Management Tool 就有支援,但是不知道可不可以符合我想要的需求,所以就寫了一個包含以下功能的 Library
- 標準化的轉資料函式,透過 INI 設定檔可互轉
- 可以支援 Oracle,MSSQL 互轉(可擴充)
- 可以支援互轉中途 Plug In 處理其它事
- 支援時區設定
- 失敗可以支援重傳(三次)
- 可支援下列四種型態互轉
Development
架構
整個 Library 分三個部份
- MigrateDataLib(主體)
- MigrateDataModel(介接PlugIn的Interface)
- PlugInProject(PlugIn所開發的專案)
Class Diagram 如下圖所示
![](/uploads/csharp-migrate-data-library/Class Diagram.png)
程式的進入點為 MigrateData - DoTask 其 Activity Diagram 如下圖所示
![](/uploads/csharp-migrate-data-library/DoTast Activity Diagram.png)
每種 Task 的 DoMigrate Activity Diagram 如下圖所示
![](/uploads/csharp-migrate-data-library/DoMigrate Activity Diagram.png)
基本設定
基本
1 2 3 4 5
| [Migrate Setting] '時區[Default:0] timeZone= 'dll放置的資料夾[Default:Empty] folder=
|
來源資料庫
1 2 3 4 5
| [Source Database] '資料庫類型[Contain:SqlServer][Default:SqlServer] type= '連線字串,啟動後加密[Default:Empty] connectionString=
|
目標資料庫
1 2 3 4 5
| [Target Database] '資料庫類型[Contain:SqlServer][Default:SqlServer] type= '連線字串,啟動後加密[Default:Empty] connectionString=
|
Log
1 2 3 4 5 6 7
| [Log Setting] '每次log的最大字元數(byte)[Default:200] retentionDay= '過期刪除的天數[Default:30] maxLogSize= '存放路徑[Default:.\LogFiles] path=
|
批次轉檔
依照所設定的標記欄位依序往後轉檔,流程如下所示
設定說明如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| * : 一定要設定 - : 不一定要設定 ' : 不用設定
[Migrate Task Batch] * taskType=Batch * sourceTable=來源表名 * targetTable=目標表名 * checkField=確認目前轉到那的標記欄位 - checkType=確認標記欄位的型態(如果是日期就不用輸入) - checkBeginValue=確認標記欄位的起始值(沒有起始的話就不用設) - checkEqual=比對時是否要等於前次最後的值(大於的話就不用設) ' syncField=(不用設定) - condition=來源表是否需要條件設定(沒有的話就不用設) - extraField=來源表是否需要額外欄位(沒有的話就不用設) - plugIn=是否需要額外處理(沒有的話就不用設)
欄位設定 TargetField=SourceField
|
上圖的設定範例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| [Migrate Task Batch] taskType=Batch sourceTable=STable targetTable=TTable checkField=BEGIN_DATE checkType= checkBeginValue= checkEqual= syncField= condition= extraField= plugIn=
ID=ID CODE=CODE BEGIN_DATE=BEGIN_DATE
|
同步轉檔
依照所設定的同步欄位同步兩表,流程如下所示
設定說明如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| * : 一定要設定 - : 不一定要設定 ' : 不用設定
[Migrate Task Sync] * taskType=Sync * sourceTable=來源表名 * targetTable=目標表名 - checkField=非整表同步時的條件欄位(整表時就不用設定) - checkType=條件欄位型態(整表時就不用設定) - checkBeginValue=條件欄位的起始值(整表時就不用設定) - checkEqual=條件欄位是否要等於(整表時就不用設定) * syncField=同步時用來確認的欄位 - condition=來源表是否需要條件設定(沒有的話就不用設) - extraField=來源表是否需要額外欄位(沒有的話就不用設) - plugIn=是否需要額外處理(沒有的話就不用設)
欄位設定 TargetField=SourceField
|
上圖的設定範例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| [Migrate Task Sync] taskType=Sync sourceTable=STable targetTable=TTable checkField= checkType= checkBeginValue= checkEqual= syncField=ID condition= extraField= plugIn=
ID=ID CODE=CODE BEGIN_DATE=BEGIN_DATE
|
復製轉檔
直接刪除原表再整表轉入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| * : 一定要設定 - : 不一定要設定 ' : 不用設定
[Migrate Task Copy] * taskType=Copy * sourceTable=來源表名 * targetTable=目標表名 - checkField=非整表Copy時的條件欄位(整表時就不用設定) - checkType=條件欄位型態(整表時就不用設定) - checkBeginValue=條件欄位的起始值(整表時就不用設定) - checkEqual=條件欄位是否要等於(整表時就不用設定) ' syncField=(不用設定) - condition=來源表是否需要條件設定(沒有的話就不用設) - extraField=來源表是否需要額外欄位(沒有的話就不用設) - plugIn=是否需要額外處理(沒有的話就不用設)
欄位設定 TargetField=SourceField
|
上圖的設定範例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| [Migrate Task Copy] taskType=Copy sourceTable=STable targetTable=TTable checkField= checkType= checkBeginValue= checkEqual= syncField= condition= extraField= plugIn=
ID=ID CODE=CODE BEGIN_DATE=BEGIN_DATE
|
更新轉檔
依照設定的標記欄位更新所設定的欄位
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| * : 一定要設定 - : 不一定要設定 ' : 不用設定
[Migrate Task Update] * taskType=Update * sourceTable=來源表名 * targetTable=目標表名 * checkField=確認目前更新到那的標記欄位 - checkType=確認標記欄位的型態(如果是日期就不用輸入) - checkBeginValue=確認標記欄位的起始值(沒有起始的話就不用設) - checkEqual=比對時是否要等於前次最後的值(大於的話就不用設) * syncField=更新時的條件欄位(下方的Field必需設定該欄位) - condition=來源表是否需要條件設定(沒有的話就不用設) - extraField=來源表是否需要額外欄位(沒有的話就不用設) - plugIn=是否需要額外處理(沒有的話就不用設)
* Where Field TargetField=SourceField
* Update Field TargetField=SourceField
|
上圖的設定範例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| [Migrate Task Update] taskType=Update sourceTable=STable targetTable=TTable checkField=BEGIN_DATE checkType= checkBeginValue= checkEqual= syncField=ID condition= extraField= plugIn=
'Where Field ID=ID
'Update Field CODE=CODE BEGIN_DATE=BEGIN_DATE
|
PlugIn
可以透過 INI 設定,讓每個 Task 設定多個 PlugIn
PlugIn 處理過的值會依序帶到下一個 PlugIn ,且在轉資料的前及後都會觸發一個事件,以 Etl PlugIn 為例如下圖,把來源資料的 BOM_NAME 轉為 BOM_ID ,就可以透過 BeforeMigrate 把來源的資料轉置。
時區
透過 INI 設定目前時區
有掛入 Etl PlugIn 的 Task 都會自動把所有的時間轉成 UTC 的時間
Source Code
Download
參考
Oracle Migrations
dbMigration .NET