(原文發(fā)表于2006-06-28 ,修正于2006-07-03)
在
DTS開發(fā)記錄(序)
一文中,我們已經(jīng)明白了當前這個Data Transfer System的主要目標和存在的難點與挑戰(zhàn)。在接下來的一系列的文章中,我將記錄我們開發(fā)中是如何解決這些難點、如何應付這些挑戰(zhàn)的,有的技巧或方案可能還并不成熟,所以如果你有任何想法,請留言告訴我。
本文就先從系統(tǒng)結構講起。
通過我們的分析歸納,確定了該DTS系統(tǒng)中存在三個核心的概念,這三個核心概念建立在如下基本概念之上:
(1)源列:參與數(shù)據(jù)傳遞的源數(shù)據(jù)表中的列。
(2)目標列:參與數(shù)據(jù)傳遞的目標數(shù)據(jù)表中的列。
(3)映射列:參與了數(shù)據(jù)映射的源列或目標列。注意,并不是所有的列都會參與映射,這是常見的情況。
(4)數(shù)據(jù)管道:用于屏蔽數(shù)據(jù)源和數(shù)據(jù)目標的類型(比如不同類型的數(shù)據(jù)庫、數(shù)據(jù)文件等),在數(shù)據(jù)介質(zhì)與DataTable之間進行數(shù)據(jù)傳遞的組件。
(5)數(shù)據(jù)大綱:通俗點,實際就是某個數(shù)據(jù)庫表的表結構,稱之為Data Schema。但是數(shù)據(jù)大綱是獨立于數(shù)據(jù)庫類型的。
(6)映射項:MappingItem,一個映射項與一個目標列是1:1對應的。如果一個目標列參與了映射,那么它就能并只能攜帶一個MappingItem。MappingItem包含了一個或多個源列如何映射到目標列。如果MappingItem中只包含一個源列,則稱之為“簡單映射”;如果MappingItem中包含了多個源列,則稱之為“合并映射”。
(7)連接:IConnection,一個連接表示對一個數(shù)據(jù)源或數(shù)據(jù)目標的尋址。到目前為止,有兩種類型的連接,數(shù)據(jù)庫連接和文件連接。
在上述基本概念的基礎上,我們引出三個核心概念:
(1)數(shù)據(jù)映射:DataMapping,數(shù)據(jù)映射由一組映射項(MappingItem)組成,它包含了源數(shù)據(jù)大綱到目標數(shù)據(jù)大綱的完整映射關系。注意,數(shù)據(jù)映射與數(shù)據(jù)大綱綁定,但是并不與任何特定的數(shù)據(jù)庫表綁定。這樣,DataMapping可以運用在不同的數(shù)據(jù)庫表上,只要數(shù)據(jù)庫表結構兼容DataMapping要求的數(shù)據(jù)大綱即可。
(2)連接對:ConnectionPair,一個連接對包含了一個數(shù)據(jù)源和一個數(shù)據(jù)目標的連接信息。將連接對獨立出來的好處是,當配置好一個連接對后,可以在不同的地方復用它,比如在編輯映射的時候、在數(shù)據(jù)驗證的時候、在數(shù)據(jù)傳送的時候等。
(3)數(shù)據(jù)傳送引擎:DataTransferEngine,這是整個DTS系統(tǒng)的引擎部分,它基于一個連接對和一個數(shù)據(jù)映射,將數(shù)據(jù)從源表經(jīng)過變換后傳遞到目標表。
經(jīng)過以上分析,我們可以將系統(tǒng)分為如下幾個小工具:
(1)連接管理工具:用于配置、管理所有的連接對。所有的連接對可以序列化保存于系統(tǒng)的配置文件中。
(2)映射編輯工具:用于在源數(shù)據(jù)大綱和目標數(shù)據(jù)大綱之間建立、修改映射關系。映射編輯工具的產(chǎn)物是一個數(shù)據(jù)映射DataMapping,我們可以將之序列化后存儲在.mapping文件中,日后可以重新加載、打開。
(3)執(zhí)行工具:用于啟動執(zhí)行引擎,監(jiān)控數(shù)據(jù)傳遞過程,并記錄日志。
(4)數(shù)據(jù)驗證工具:基于DataMapping,驗證數(shù)據(jù)源表中的數(shù)據(jù)是否滿足要求的轉(zhuǎn)換規(guī)則,將不滿足轉(zhuǎn)換規(guī)則的源數(shù)據(jù)記錄下來。
(5)日志查看工具:用于查看某次數(shù)據(jù)傳遞任務的執(zhí)行情況,比如哪些數(shù)據(jù)傳遞失敗了、失敗的原因等等。
這幾個工具中,最重要的工具當屬映射編輯工具和執(zhí)行工具,就像DataMapping和DataTransferEngine是整個系統(tǒng)的核心一樣。映射編輯工具的示意圖如下:
圖中的數(shù)據(jù)適配器用于屏蔽數(shù)據(jù)庫類型和文件類型的差異;大綱提取器從指定的數(shù)據(jù)庫表或文件中提取數(shù)據(jù)大綱;編輯工具在源大綱與目標大綱之間建立簡單或復雜的映射關系,將結果(即DataMapping)保存在.Mapping文件中。
執(zhí)行工具的示意圖如下:
執(zhí)行工具首先通過數(shù)據(jù)適配器將數(shù)據(jù)從數(shù)據(jù)源中提取出來,得到與數(shù)據(jù)庫類型無關的數(shù)據(jù)集,.NET中的DataSet和DataTable就可以作為這種數(shù)據(jù)庫類型無關的介質(zhì)。圖中的Data在實現(xiàn)中即存放于DataTable。DataTransferEngine依據(jù)數(shù)據(jù)映射指定的轉(zhuǎn)換規(guī)則將數(shù)據(jù)從源DataTable經(jīng)過運算、變換然后存放到目標表。然后,在通過數(shù)據(jù)適配器將目標表提交到目的數(shù)據(jù)庫。
關于這個Data Transfer System結構中最主要的部分在這里粗略的說了一下,很多細微的地方都忽略了,細節(jié)會在后面的文章中補充進來。
轉(zhuǎn)到:
DTS開發(fā)記錄(序)
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
