PB使用数据管道实现数据的自动迁移和备份
使用數據管道實現數據的自動遷移和備份
摘要:針對MIS系統的開發和使用過程中數據的備份和遷移問題,提出了解決問題的基本思路和方案,詳細闡述了方案實施過程中涉及的方法和技巧,并對使用PowerBuild開發MIS系統的一般思路作了簡要的介紹和說明。
關鍵詞:MIS;PowerBuild;數據管道;數據遷移;數據備份
分類號:TP311.52
1.引言
在MIS系統的開發中,PowerBuild7.0以其強大的數據處理能力、豐富的數據庫接口和數據訪問能力、支持三層或多層應用結構的開發和對Internet的有力支持,成為目前領先的Client/Server開發工具。
在MIS系統的開發和使用過程中,常常需要對數據進行備份和遷移。當應用系統開發成功后,系統從開發環境向運行環境遷移時,當舊的系統需要升級時,當新系統為了兼容原有系統使用時,當自動進行數據的備份和恢復時,或者為了提取數據樣本時,開發者或用戶可以通過手工的方法完成操作,但某些情況下, 開發者應該考慮在應用程序中實現數據的自動遷移。PowerBuild的數據管道是實現這種自動移動的有效方法之一。
在PowerBuild中,數據管道可以實現數據表間數據的移動,它可以將數據從一個或多個源表(也可以是存儲過程)中輸送到一個新的或現有的目標表中,這些數據表可以在同一個數據庫中,也可以在不同的數據庫中,甚至可以在不同的數據庫管理系統(DBMS)中。
2.實現方法
通過應用程序實現數據的自動遷移,要求被操作的源和目標數據庫已經存在,并且數據遷移的策略(數據管道)也應建立。在此基礎上,通過應用程序使用數據管道,實現數據的自動遷移。
2.1實現步驟
一般說來,在應用程序中使用數據管道有五個基本步驟:
(1)創建對象 創建數據管道對象、管道對象的支撐用戶對象和一個窗口對象。
(2)初始化操作?? 創建兩個事務對象的實例,分別連接源和目的數據庫;創建管道對象的支撐用戶對象的一個實例,并初始化為已經建立的數據管道對象。
(3)啟動數據管道??? 通過支撐用戶對象的實例啟動數據管道
(4)處理錯誤??? 對管道操作中出錯的數據行可以進行修復和放棄。
(5)結束操作??? 斷開數據庫的連接,并釋放用過的實例,關閉窗口。
2.2創建對象
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個函數,其中在應用程序中較常使用的屬性、事件、函數如表1、表2、表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.結語
使用數據管道在應用程序中實現數據的自動遷移和備份的一般實現方法,本文進行了有益的嘗試和探討。在正確配置的實際系統中,本方法已經實現數據 的正確遷移。整個開發過程在一個窗口用戶對象中完成,增加了代碼的可移植性和可重用性。當然,在遷移數據的可選擇性和通用性方面還有待進一步實踐。
參考文獻:
[1]PowerBuild7.0應用開發技術詳解.王蓉等.北京:電子工業出版社,2000.3
[2]PowerBuild7.0對象與控件技術詳解.王梅君等.北京:電子工業出版社,2000.3
[3]PowerBuild7.0原理與應用指南.劉紅巖 何雅麗等.北京:電子工業出版社,2000.3
?
總結
以上是生活随笔為你收集整理的PB使用数据管道实现数据的自动迁移和备份的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AxMath的常用操作
- 下一篇: java预览各种文件(全部转成html)