PB使用数据管道实现数据的自动迁移和备份
使用數(shù)據(jù)管道實現(xiàn)數(shù)據(jù)的自動遷移和備份
摘要:針對MIS系統(tǒng)的開發(fā)和使用過程中數(shù)據(jù)的備份和遷移問題,提出了解決問題的基本思路和方案,詳細闡述了方案實施過程中涉及的方法和技巧,并對使用PowerBuild開發(fā)MIS系統(tǒng)的一般思路作了簡要的介紹和說明。
關(guān)鍵詞:MIS;PowerBuild;數(shù)據(jù)管道;數(shù)據(jù)遷移;數(shù)據(jù)備份
分類號:TP311.52
1.引言
在MIS系統(tǒng)的開發(fā)中,PowerBuild7.0以其強大的數(shù)據(jù)處理能力、豐富的數(shù)據(jù)庫接口和數(shù)據(jù)訪問能力、支持三層或多層應(yīng)用結(jié)構(gòu)的開發(fā)和對Internet的有力支持,成為目前領(lǐng)先的Client/Server開發(fā)工具。
在MIS系統(tǒng)的開發(fā)和使用過程中,常常需要對數(shù)據(jù)進行備份和遷移。當(dāng)應(yīng)用系統(tǒng)開發(fā)成功后,系統(tǒng)從開發(fā)環(huán)境向運行環(huán)境遷移時,當(dāng)舊的系統(tǒng)需要升級時,當(dāng)新系統(tǒng)為了兼容原有系統(tǒng)使用時,當(dāng)自動進行數(shù)據(jù)的備份和恢復(fù)時,或者為了提取數(shù)據(jù)樣本時,開發(fā)者或用戶可以通過手工的方法完成操作,但某些情況下, 開發(fā)者應(yīng)該考慮在應(yīng)用程序中實現(xiàn)數(shù)據(jù)的自動遷移。PowerBuild的數(shù)據(jù)管道是實現(xiàn)這種自動移動的有效方法之一。
在PowerBuild中,數(shù)據(jù)管道可以實現(xiàn)數(shù)據(jù)表間數(shù)據(jù)的移動,它可以將數(shù)據(jù)從一個或多個源表(也可以是存儲過程)中輸送到一個新的或現(xiàn)有的目標表中,這些數(shù)據(jù)表可以在同一個數(shù)據(jù)庫中,也可以在不同的數(shù)據(jù)庫中,甚至可以在不同的數(shù)據(jù)庫管理系統(tǒng)(DBMS)中。
2.實現(xiàn)方法
通過應(yīng)用程序?qū)崿F(xiàn)數(shù)據(jù)的自動遷移,要求被操作的源和目標數(shù)據(jù)庫已經(jīng)存在,并且數(shù)據(jù)遷移的策略(數(shù)據(jù)管道)也應(yīng)建立。在此基礎(chǔ)上,通過應(yīng)用程序使用數(shù)據(jù)管道,實現(xiàn)數(shù)據(jù)的自動遷移。
2.1實現(xiàn)步驟
一般說來,在應(yīng)用程序中使用數(shù)據(jù)管道有五個基本步驟:
(1)創(chuàng)建對象 創(chuàng)建數(shù)據(jù)管道對象、管道對象的支撐用戶對象和一個窗口對象。
(2)初始化操作?? 創(chuàng)建兩個事務(wù)對象的實例,分別連接源和目的數(shù)據(jù)庫;創(chuàng)建管道對象的支撐用戶對象的一個實例,并初始化為已經(jīng)建立的數(shù)據(jù)管道對象。
(3)啟動數(shù)據(jù)管道??? 通過支撐用戶對象的實例啟動數(shù)據(jù)管道
(4)處理錯誤??? 對管道操作中出錯的數(shù)據(jù)行可以進行修復(fù)和放棄。
(5)結(jié)束操作??? 斷開數(shù)據(jù)庫的連接,并釋放用過的實例,關(guān)閉窗口。
2.2創(chuàng)建對象
2.2.1創(chuàng)建數(shù)據(jù)管道對象
使用數(shù)據(jù)管道實現(xiàn)數(shù)據(jù)的遷移,不管是在PowerBuild環(huán)境中以交互方式進行還是使用應(yīng)用程序進行,首先必須建立數(shù)據(jù)管道。
建立數(shù)據(jù)管道應(yīng)該在PowerBuild環(huán)境中進行。
1) 配置兩個ODBC數(shù)據(jù)源,這里假設(shè)它們是S和D,其中,S連接源數(shù)據(jù)庫,D連接目標數(shù)據(jù)庫。
2) 通過“New→Database→Pipeline”定義管道對象。在定義過程中,數(shù)據(jù)源如果是數(shù)據(jù)表,則“Data Source”選“Quick Select”/“SQL Select”,如果是存儲過程,則選“Stored Procedure”;“Source Connection”選S,“Destination Connection”選D;選定源連接中的數(shù)據(jù)表,根據(jù)需要選定字段,并設(shè)置數(shù)據(jù)行的篩選條件;設(shè)定目標表的名稱,管道操作的類型;存盤。
管道操作的類型有創(chuàng)建、替換、刷新、增加或修改幾種,根據(jù)需要選擇其中一種。正常情況下,如果進行數(shù)據(jù)備份,應(yīng)定義兩個相關(guān)的管道對象,這兩個 管道對象只有管道操作的類型不同,其中一個的操作類型為“創(chuàng)建”,另外一個為“增加或修改”。當(dāng)目標數(shù)據(jù)庫中無相應(yīng)數(shù)據(jù)表(第一次備份)時,使用“創(chuàng)建” 操作的管道對象;當(dāng)目標數(shù)據(jù)庫中有相應(yīng)數(shù)據(jù)表(不是第一次備份)時,使用“增加或修改”操作的管道對象。在這里,定義兩個管道對象為 Pile_Create和Pile_Modify。
2.2.2創(chuàng)建管道的支撐用戶對象
創(chuàng)建的兩個管道對象Pile_Create和Pile_Modify可以實現(xiàn)交互方式的數(shù)據(jù)遷移,但還不能在應(yīng)用程序中使用。為了在應(yīng)用程序中使用管道對象的屬性和函數(shù),應(yīng)該建立管道對象的支撐用戶對象。
為了提高程序的通用性,可以設(shè)置一個比較通用的管道對象的用戶對象(即不用指定數(shù)據(jù)對象)。
通過選擇“New→Object→Standard Class”,再選擇“Pipeline”,建立管道用戶對象,其名字設(shè)定為uo_pipeline。用戶對象uo_pipeline具有6個屬性,5個事件,9個函數(shù),其中在應(yīng)用程序中較常使用的屬性、事件、函數(shù)如表1、表2、表3所示。
表1 管道對象的屬性
| 屬性名 | 數(shù)據(jù)類型 | 含義 |
| RowsInError | Long | 指明管道運行期間出錯行的行數(shù) |
| RowsRead | Long | 指明管道讀入的行數(shù) |
| RowsWritten | Long | 指明管道寫出的行數(shù) |
| DataObject | String | 指明管道對象的名稱(如Pile_Create) |
表2 管道對象的事件
| 事件 | 觸發(fā)時機 |
| PipeEnd | 當(dāng)Start()或Repair()函數(shù)執(zhí)行結(jié)束時出發(fā) |
| PipeMeter | 每讀入或?qū)懗鲆粔K數(shù)據(jù)后觸發(fā)。數(shù)據(jù)塊大小由Commit因子決定 |
| PipeStart | 當(dāng)Start()或Repair()函數(shù)開始執(zhí)行時觸發(fā) |
表3 管道對象的函數(shù)
| 函數(shù) | 返回值數(shù)據(jù)類型 | 功能 |
| Cancel | Integer | 終止管道運行 |
| Repair | Integer | 修正管道用戶對象的錯誤數(shù)據(jù)窗口,用正確的數(shù)據(jù)更新目標數(shù)據(jù)庫 |
| Start | Integer | 啟動數(shù)據(jù)管道對象 |
為了能夠動態(tài)顯示管道操作的過程,需要在Uo_Pipeline用戶對象的PipeMeter事件中,將Uo_Pipeline的 RowsInError、RowsRead、RowsWritten三個屬性值傳遞給窗口對象顯示出來(窗口對象見后,其名稱W_CopyData)。通過窗口對象W_CopyData的自定義窗口級函數(shù)getpipemsg()實現(xiàn)(也可通過在w_copydata的declare中定義全局變量實 現(xiàn))。
在事件PipeMeter寫入下面的腳本:
w_copydata.GetPipeMsg(RowsRead,RowsWritten,RowsInError)
2.2.3創(chuàng)建窗口對象
窗口對象用于顯示管道操作的動態(tài)信息,對管道操作進行監(jiān)控,當(dāng)有錯誤產(chǎn)生時,與管道對象進行交互。其名稱為w_copydata。
在w_copydata中包含的控件及作用如表4。
表4 窗口對象w_copydata包含的控件
| 控件類型 | 控件名稱 | 作用 |
| 靜態(tài)文本 | St_T_read | “讀入行數(shù)”提示,其text為“讀入行數(shù)” |
| St_t_written | “寫入行數(shù)”提示,其text為“寫入行數(shù)” | |
| St_t_error | “錯誤行數(shù)”提示,其text為“錯誤行數(shù)” | |
| St_read | 讀入行數(shù),其text為u_pipeline的RowsRead值 | |
| St_written | 寫入行數(shù),其text為u_pipeline的RowsWritten值 | |
| St_error | 錯誤行數(shù),其text為u_pipeline的RowsInError值 | |
| 數(shù)據(jù)窗口 | Dw_pipe_error | 自動顯示管道操作中的錯誤行 |
| 命令按鈕 | Cb_write | 啟動管道操作 |
| Cb_stop | 終止管道操作 | |
| Cb_applyfixes | 將Dw_pipe_error數(shù)據(jù)窗口中修復(fù)的行傳輸給目標表 | |
| Cb_clear | 清除Dw_pipe_error數(shù)據(jù)窗口中所有錯誤行 | |
| Cb_return | 關(guān)閉窗口w_copydata,并返回 |
定義w_copydata的窗口級函數(shù)getpipemsg(),訪問級別為“Public”,返回值“None”,有三個參數(shù):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初始化操作
初始化操作包括創(chuàng)建兩個事務(wù)對象的實例itrans_source和itrans_dest,分別連接源和目的數(shù)據(jù)庫;創(chuàng)建管道對象的支撐用戶對象uo_pipeline的一個實例iuo_pipeline。
由于實例變量itrans_source和itrans_dest在啟動數(shù)據(jù)管道操作時(在命令按鈕Cb_write的clicked事件中) 也要用到,所以應(yīng)該將它們定義為全局實例變量。在窗口的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,為了增加通用性,參數(shù)也可以從導(dǎo)出的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,為了增加通用性,參數(shù)也可以從導(dǎo)出的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啟動數(shù)據(jù)管道
啟動數(shù)據(jù)管道操作在命令按鈕Cb_write的clicked事件中進行,以在目標數(shù)據(jù)庫建立數(shù)據(jù)表(pile_create)作為默認操作,如果出錯,則進行數(shù)據(jù)表修改(pile_modify)。出錯行信息會自動出現(xiàn)在數(shù)據(jù)窗口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表示數(shù)據(jù)表已存在,使用修改方式
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時,可以設(shè)定最大出錯行數(shù),出錯行數(shù)可以從1~no limit,當(dāng)出錯行數(shù)達到指定值時,管道操作自動停止。但在操作中,由于用戶進行了誤操作或管道操作執(zhí)行的時間比預(yù)期的要長時,用戶可以人工停止數(shù)據(jù)管道的運行。
當(dāng)管道操作停止后,如果數(shù)據(jù)窗口dw_pipe_errors中有出錯行,則可進行修復(fù)。
數(shù)據(jù)管道的終止執(zhí)行可以在命令按鈕cb_stop的clicked事件中通過執(zhí)行數(shù)據(jù)管道實例對象的cancel()函數(shù)實現(xiàn)。腳本如下:
if iuo_pipeline.cancel() = 1 then
messagebox(“提示信息”,”終止數(shù)據(jù)管道操作失敗!”)
end if
忽略錯誤行的操作在命令按鈕cb_clear的clicked事件中進行,腳本如下:
dw_pipe_error.result()
修改數(shù)據(jù)后,重新提交工作在命令按鈕Cb_applyfixes的clicked事件中進行,腳本如下:
iuo_pipeline.repair()
2.6結(jié)束操作
管道操作完成后,應(yīng)該斷開數(shù)據(jù)庫的連接,并釋放用過的實例。結(jié)束操作在命令按鈕cb_return的clicked事件中進行,腳本如下:
Destroy iuo_pipeline
DISCONNECT USING itrans_source;
Destroy itrans_source
DISCONNECT USING itrans_dest;
Destroy itrans_dest
Close(parent)
3.結(jié)語
使用數(shù)據(jù)管道在應(yīng)用程序中實現(xiàn)數(shù)據(jù)的自動遷移和備份的一般實現(xiàn)方法,本文進行了有益的嘗試和探討。在正確配置的實際系統(tǒng)中,本方法已經(jīng)實現(xiàn)數(shù)據(jù) 的正確遷移。整個開發(fā)過程在一個窗口用戶對象中完成,增加了代碼的可移植性和可重用性。當(dāng)然,在遷移數(shù)據(jù)的可選擇性和通用性方面還有待進一步實踐。
參考文獻:
[1]PowerBuild7.0應(yīng)用開發(fā)技術(shù)詳解.王蓉等.北京:電子工業(yè)出版社,2000.3
[2]PowerBuild7.0對象與控件技術(shù)詳解.王梅君等.北京:電子工業(yè)出版社,2000.3
[3]PowerBuild7.0原理與應(yīng)用指南.劉紅巖 何雅麗等.北京:電子工業(yè)出版社,2000.3
?
總結(jié)
以上是生活随笔為你收集整理的PB使用数据管道实现数据的自动迁移和备份的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AxMath的常用操作
- 下一篇: java预览各种文件(全部转成html)