一、實現方法數據庫
經過應用程序實現數據的自動遷移,要求被操做的源和目標數據庫已經存在,而且數據遷移的策略(數據管道)也應創建。在此基礎上,經過應用程序使用數據管道,實現數據的自動遷移。app
2.1實現步驟函數
通常說來,在應用程序中使用數據管道有五個基本步驟:ui
(1)建立對象 建立數據管道對象、管道對象的支撐用戶對象和一個窗口對象。spa
(2)初始化操做 建立兩個事務對象的實例,分別鏈接源和目的數據庫;建立管道對象的支撐用戶對象的一個實例,並初始化爲已經創建的數據管道對象。對象
(3)啓動數據管道 經過支撐用戶對象的實例啓動數據管道事件
(4)處理錯誤 對管道操做中出錯的數據行能夠進行修復和放棄。事務
(5)結束操做 斷開數據庫的鏈接,並釋放用過的實例,關閉窗口。ip
2.2建立對象ci
2.2.1建立數據管道對象
使用數據管道實現數據的遷移,無論是在PowerBuild環境中以交互方式進行仍是使用應用程序進行,首先必須創建數據管道。
創建數據管道應該在PowerBuild環境中進行。
1) 配置兩個ODBC數據源,這裏假設它們是S和D,其中,S鏈接源數據庫,D鏈接目標數據庫。
2) 經過「New→Database→Pipeline」定義管道對象。在定義過程當中,數據源若是是數據表,則「Data Source」選「Quick Select」/「SQL Select」,若是是存儲過程,則選「Stored Procedure」;「Source Connection」選S,「Destination Connection」選D;選定源鏈接中的數據表,根據須要選定字段,並設置數據行的篩選條件;設定目標表的名稱,管道操做的類型;存盤。
管道操做的類型有建立、替換、刷新、增長或修改幾種,根據須要選擇其中一種。正常狀況下,若是進行數據備份,應定義兩個相關的管道對象,這兩個 管道對象只有管道操做的類型不一樣,其中一個的操做類型爲「建立」,另一個爲「增長或修改」。當目標數據庫中無相應數據表(第一次備份)時,使用「建立」 操做的管道對象;當目標數據庫中有相應數據表(不是第一次備份)時,使用「增長或修改」操做的管道對象。在這裏,定義兩個管道對象爲 Pile_Create和Pile_Modify。
2.2.2建立管道的支撐用戶對象
建立的兩個管道對象Pile_Create和Pile_Modify能夠實現交互方式的數據遷移,但還不能在應用程序中使用。爲了在應用程序中使用管道對象的屬性和函數,應該創建管道對象的支撐用戶對象。
爲了提升程序的通用性,能夠設置一個比較通用的管道對象的用戶對象(即不用指定數據對象)。
經過選擇「New→Object→Standard Class」,再選擇「Pipeline」,創建管道用戶對象,其名字設定爲uo_pipeline。用戶對象uo_pipeline具備6個屬性,5個 事件,9個函數,其中在應用程序中較常使用的屬性、事件、函數如表一、表二、表3所示。
表1 管道對象的屬性
屬性名 |
數據類型 |
含義 |
RowsInError |
Long |
指明管道運行期間出錯行的行數 |
RowsRead |
Long |
指明管道讀入的行數 |
RowsWritten |
Long |
指明管道寫出的行數 |
DataObject |
String |
指明管道對象的名稱(如Pile_Create) |
表2 管道對象的事件
事件 |
觸發時機 |
PipeEnd |
當Start()或Repair()函數執行結束時出發 |
PipeMeter |
每讀入或寫出一塊數據後觸發。數據塊大小由Commit因子決定 |
PipeStart |
當Start()或Repair()函數開始執行時觸發 |
表3 管道對象的函數
函數 |
返回值數據類型 |
功能 |
Cancel |
Integer |
終止管道運行 |
Repair |
Integer |
修正管道用戶對象的錯誤數據窗口,用正確的數據更新目標數據庫 |
Start |
Integer |
啓動數據管道對象 |
爲了可以動態顯示管道操做的過程,須要在Uo_Pipeline用戶對象的PipeMeter事件中,將Uo_Pipeline的 RowsInError、RowsRead、RowsWritten三個屬性值傳遞給窗口對象顯示出來(窗口對象見後,其名稱W_CopyData)。通 過窗口對象W_CopyData的自定義窗口級函數getpipemsg()實現(也可經過在w_copydata的declare中定義全局變量實 現)。
在事件PipeMeter寫入下面的腳本:
w_copydata.GetPipeMsg(RowsRead,RowsWritten,RowsInError)
2.2.3建立窗口對象
窗口對象用於顯示管道操做的動態信息,對管道操做進行監控,當有錯誤產生時,與管道對象進行交互。其名稱爲w_copydata。
在w_copydata中包含的控件及做用如表4。
表4 窗口對象w_copydata包含的控件
控件類型 |
控件名稱 |
做用 |
靜態文本 |
St_T_read |
「讀入行數」提示,其text爲「讀入行數」 |
St_t_written |
「寫入行數」提示,其text爲「寫入行數」 |
|
St_t_error |
「錯誤行數」提示,其text爲「錯誤行數」 |
|
St_read |
讀入行數,其text爲u_pipeline的RowsRead值 |
|
St_written |
寫入行數,其text爲u_pipeline的RowsWritten值 |
|
St_error |
錯誤行數,其text爲u_pipeline的RowsInError值 |
|
數據窗口 |
Dw_pipe_error |
自動顯示管道操做中的錯誤行 |
命令按鈕 |
Cb_write |
啓動管道操做 |
Cb_stop |
終止管道操做 |
|
Cb_applyfixes |
將Dw_pipe_error數據窗口中修復的行傳輸給目標表 |
|
Cb_clear |
清除Dw_pipe_error數據窗口中全部錯誤行 |
|
Cb_return |
關閉窗口w_copydata,並返回 |
定義w_copydata的窗口級函數getpipemsg(),訪問級別爲「Public」,返回值「None」,有三個參數:readrows、writerows、errorrows,類型均爲long,值傳遞。腳本以下:
w_copydata.st_read.text=string(readrows)
w_copydata.st_written.text=string(writerows)
w_copydata.st_error.text=string(errorrows)
2.3初始化操做
初始化操做包括建立兩個事務對象的實例itrans_source和itrans_dest,分別鏈接源和目的數據庫;建立管道對象的支撐用戶對象uo_pipeline的一個實例iuo_pipeline。
因爲實例變量itrans_source和itrans_dest在啓動數據管道操做時(在命令按鈕Cb_write的clicked事件中) 也要用到,因此應該將它們定義爲全局實例變量。在窗口的declare中選擇instance variables,並添加如下腳本:
transaction itrans_source
transaction itrans_dest
uo_pipe iuo_pipe
初始化操做在窗口對象w_copydata的open事件中完成。在w_copydata的open事件中輸入下面的腳本:
itrans_source = CREATE transaction
itrans_dest = CREATE transaction
// Profile S,爲了增長通用性,參數也能夠從導出的profile文件中獲取
itrans_source.DBMS = "ODBC"
itrans_source.AutoCommit = False
itrans_source.DBParm = "ConnectString='DSN=s;UID=dba;PWD=ygg'"
connect USING itrans_source;
// Profile D,爲了增長通用性,參數也能夠從導出的profile文件中獲取
itrans_dest.DBMS = "ODBC"
itrans_dest.AutoCommit = False
itrans_dest.DBParm = "ConnectString='DSN=d;UID=dba;PWD=ygg'"
connect USING itrans_dest;
//創建管道對象uo_pipe的一個實例
iuo_pipe = CREATE uo_pipe
2.4啓動數據管道
啓動數據管道操做在命令按鈕Cb_write的clicked事件中進行,以在目標數據庫創建數據表(pile_create)做爲默認操做,若是出錯,則進行數據表修改(pile_modify)。出錯行信息會自動出如今數據窗口dw_pipe_errors中。
在命令按鈕Cb_write的clicked事件中添加腳本:
iuo_pipe.dataobject = 'p_create'
integer li_start_result
li_start_result=iuo_pipe.start(itrans_source,itrans_dest,dw_pipe_errors)
//返回-3表示數據表已存在,使用修改方式
if li_start_result=-3 then
iuo_pipe.dataobject = 'p_modify'
li_start_result=iuo_pipe.start(itrans_source,itrans_dest,dw_pipe_errors)
end if
2.5處理行錯誤
在定義管道對象pile_Create和pile_modify時,能夠設定最大出錯行數,出錯行數能夠從1~no limit,當出錯行數達到指定值時,管道操做自動中止。但在操做中,因爲用戶進行了誤操做或管道操做執行的時間比預期的要長時,用戶能夠人工中止數據管 道的運行。
當管道操做中止後,若是數據窗口dw_pipe_errors中有出錯行,則可進行修復。
數據管道的終止執行能夠在命令按鈕cb_stop的clicked事件中經過執行數據管道實例對象的cancel()函數實現。腳本以下:
if iuo_pipeline.cancel() = 1 then
messagebox(「提示信息」,」終止數據管道操做失敗!」)
end if
忽略錯誤行的操做在命令按鈕cb_clear的clicked事件中進行,腳本以下:
dw_pipe_error.result()
修改數據後,從新提交工做在命令按鈕Cb_applyfixes的clicked事件中進行,腳本以下:
iuo_pipeline.repair()
2.6結束操做
管道操做完成後,應該斷開數據庫的鏈接,並釋放用過的實例。結束操做在命令按鈕cb_return的clicked事件中進行,腳本以下:
Destroy iuo_pipeline
DISCONNECT USING itrans_source;
Destroy itrans_source
DISCONNECT USING itrans_dest;
Destroy itrans_dest
Close(parent)
3.結語
使用數據管道在應用程序中實現數據的自動遷移和備份的通常實現方法,本文進行了有益的嘗試和探討。在正確配置的實際系統中,本方法已經實現數據 的正確遷移。整個開發過程在一個窗口用戶對象中完成,增長了代碼的可移植性和可重用性。固然,在遷移數據的可選擇性和通用性方面還有待進一步實踐。