在大型的MIS系統中大多是採用客戶機/伺服器(C/S)的網路體系結構,在該系統中資料集中儲存在伺服器的資料庫中。開發新的MIS系統的時候,資料的採集和錄入是一個重要的部分。以電信計費系統為例主要有以下幾個方面:
1)原始資料的分揀處理,處理的物件主要是磁碟、磁帶,或者光碟的二進位制資料。
2)以往系統中的檔案資料和引數資料的轉移處理,以減少使用者的輸入量和因為人工輸入所帶來的錯誤,處理的物件主要是Foxbase、Access等資料庫檔案。
3)資訊臺或者其它部門送來的以Foxbase、Access等檔案儲存的費用檔案,如168資訊臺送來的費用資料等。
本文中將結合PowerBuilder/Sybase系統開發的例項,重點介紹2),3)兩種情況的處理過程(即完成本地資料庫檔案向伺服器資料庫中的轉移)中所採取的幾種方式,以及各種方式的具體設計方法,說明了每種方法的普遍性和針對性,並對其優缺點作了比較。
1、利用importfile( )函式實現轉移
PowerBuilder是一種進行C/S系統開發的優秀的前端工具,本身提供了大量的功能和函式,其中DataWindow資料視窗是其重要的組成部分,具有強大的功能,其中importfile( )函式能夠完成資料的轉移。
實現的過程是在伺服器上建立一個同磁碟上的資料庫結構相同的表,建立一個數據視窗物件(dw_fox),取資料來源建立資料視窗,利用資料視窗物件本身的importfile( )函式將資料轉移到資料視窗中,利用update( )函式將資料儲存到伺服器上所建的表中:
dw_fox。
importfi1e (cipan_file_name)
dw_fox。 Update ( )
其中cipan_file_name為磁碟上的檔案及其路徑名稱。該處理簡單,但是缺乏靈活性,對在伺服器資料庫中建立的表的結構有比較高的要求,保證嚴格的一致性,但可以作相應的處理將有效的資料處理後轉移到自己建的表中。
2、利用ODBC連線實現轉移
ODBC是一種標準的應用程式介面(API),最早由Microsoft Windows系統實現,它允許一個應用程式同時連線多個數據源,它使用標準的SQL語句作為其資料查詢語句。在處理過程中先透過ODBC畫板靜態地建立一個ODBC連線磁碟上的Foxbase資料庫,程式設計中建立一個本地的事務物件連線本地的資料庫,透過處理後,將有效的資料送到伺服器上事先設計的一個與Foxbase資料庫相類似的表中,儲存有效的資料就可以了。
在實際處理的過程中,各個地方的磁碟檔名是不同的,這樣所連線的資料庫檔名和目錄都是變化的,那麼在設計的時候就不能夠實現將ODBC的介面固定設計出來,在處理的時候一般有兩種方式,前端作一定的處理,即按照系統要求的目錄和檔名稱進行複製,為了使應用程式有更好的適應性,我們沒有采取這種方式,而是另外一種方式,採取動態建立ODBC連線的方式。
在PowerBuilder的ODBC連線中需要幾個重要的引數,在利用ODBC事先建立一個連線FoxBASE資料庫後(如Foxbase),檢視PB。ini檔案時將有如下的記錄:
[PROFILE Foxtran]
DBMS=ODBC
。
。。。。。。
DbParm=Connectstring=’DSN=FoxBASE’
Prompt=0
AutoCommit=0
同樣開啟註冊器在HKEY_CURRENT_USER Software\ODBC\ODBC。INI下將會發現已經註冊的FoxBASE主鍵,這些給我們動態地建立ODBC連線提供了重要的資料。
在具體的設定中利用PowerBuilder提供的函式註冊一個ODBC的連線,然後建立一個事務物件連線本地(磁碟)的資料庫,作相應的處理後將所需要的資料送到伺服器上,具體的操作如下:
ReGIStrySet("HKEY_CURRENT_USER\Software\ODBC\ODBC。
INI\FoxBASE", "Default Dir", regstring!,
file_path)//設定FoxBASE主鍵
Transaction Foxtran
Foxtran=create Transaction //下面是初始化
Foxtran。
DBMS="ODBC"
Foxtran。DBParm="Connectstring=’DSN=FoxBASE’"
connect using Foxtran;
其中FoxBASE是註冊的ODBC的名稱,Foxtran是事務物件管理中建立的用以連線Foxbase資料庫的新事務,然後對事務物件進行初始化,file_path是磁碟資料庫所在的路徑名稱(可根據使用者輸入的檔案路徑和檔名分析後取得)。
利用動態建立ODBC連線同樣可以同時連線其它的本地資料庫如Access或者Sybase SQL anywhere等,具有一定的靈活性。
3、利用資料管道實現轉移
PowerBuilder的資料管道物件是在開發(利用Data Pipeline畫板來完成)和執行(動態的生成)當中傳輸資料和資料結構的一種有效的方案。
這些資料庫可以是相同的DBMS或不同的DBMS,資料傳輸可以是插入一張完整的資料表或者表的一部分及其資料,也可以是更新已有表的資料。轉換時幾個重要的選項是:源資料庫,目標資料庫,移動資料出來的源表,資料將移到的目的表,所要完成的管道操作等。下面以在執行中使用為例來加以說明其處理的過程。
(1)建立管道物件(Pipe_copy_convert),然後建立一個管道型別的標準類使用者物件u_pipeline和一個數據視窗dw_pipe_errors。在執行的過程中建立使用者物件例項,對它的屬性進行賦值:
iu_pipeline=create u_pipelineiu_pipeline。
DataObject="pipe_copy_convert"
(2)建立連線源資料庫和目標資料庫的事務物件,初始化連線事務物件(同上)。
Transaction Tran_sourse, Tran_dest
ran_sourse=create Transaction
Tran_dest=create Transaction
。。。。。 //初始化
(3)執行資料管道及後續處理。
利用start()函式完成後,捕捉到錯誤後進行相應的處理,利用cancel()終止資料管道的執行。
iu_pipeline。start (tran_sourse, tran_dest, dw_pipe_errors)
。。。。。 //錯誤處理
iu_pipeline。cancel()
利用資料管道能夠比較快速的、直接的將本地資料庫(包括表的整個結構或者部分以及資料)轉移到伺服器的資料庫並儲存在一個表中,在轉移使用者的原始檔案資料的時候多采取這種方法。
4、分析本地庫系統實現轉移
在進行資料轉換的過程中,由於各種資料的表的結構都是不一樣的,以電信計費的資訊費為例,不同的地區資訊臺使用的軟體不同,資料欄位幾乎都是不一樣的,實際的處理中也不是每一個欄位的資料都有意義,或者都需要轉換到伺服器的資料庫中,使用者往往要求根據自己的需要來選擇欄位、計算方式以及每列的約束條件(如有些專案有最大值的限制等),利用以上的方法來處理就有些困難。
在實際的處理中,我們考慮分析本地資料庫的系統表,來得到本地資料庫的結構,將資料庫中的各個欄位呈現在使用者的面前。使用者作出選擇後,加入一定的條件,再進行處理,將利用動態SQL語句生成一個滿足條件的表。這樣就要求使用者能夠透過系統來了解磁碟資料庫的內容,分析本地庫的系統表後將得到較為滿意的結果。
在利用ODBC連線到本地庫後,發現並分析了幾個系統表(System table),其中有一個表是PBcatcol中記錄著使用者資料庫的結構。
其中:pbc_tnam記錄的是使用者資料庫的表名(Table name) (在Foxbase中一個表就是一個數據庫),pbc_cnam記錄的是使用者資料庫的列名(Column name)。
根據使用者輸入的檔名稱,取消字尾即可得到資料庫的表名,定義一個游標即可取得使用者資料庫的列名,將資料庫展示在使用者的面前,使用者根據需要選擇後再作處理。
DECLARE My_Cursor CURSOR FOR
SELECT pbcatcol。
pbc_cnam
FROM pbcatcol
利用分析系統表來得到使用者資料庫的結構是一個比較有效的方法,它能夠對未知的資料庫結構有一個清晰的認識,而不需要事先知道它的結構。但是它仍然有一個問題,就是透過分析系統表不能得到使用者資料庫的列的資料型別,在轉換到伺服器的資料庫的時候要藉助使用者的輸入才能夠確定,即提供使用者必須選擇的專案來確定某一個欄位的資料型別。
能夠比較好地完成資料的轉換,具有相當大的靈活性,程式並不要關心使用者資料庫的型別,可以廣泛地使用於各種型別的資料庫(Foxbase,Access等)。
5、分析伺服器系統實現轉移
要確定一個數據庫的結構,只要確定使用者資料庫的欄位名和資料型別就可以了。
利用分析本地庫系統表的方式可以得到資料庫的欄位名,但是使用者資料庫的欄位的資料型別仍然無法獲得。透過分析Sybase伺服器資料庫的系統表可以得到伺服器資料庫中的表的欄位名和資料型別。在設計的時候考慮採取兩種方法相結合的辦法,先利用(資料管道)Pipeline將使用者本地的資料庫完整地轉換到伺服器的資料庫中的一個表,然後透過分析伺服器上的系統表:Pbcatcol,Syscolumns,Systypes。
其中Pbcatcol表中同前面一樣記錄著使用者表的表名和欄位名等,Syscolumns中記錄著資料庫中所有表的欄位名(Name)、欄位的資料型別(Type)、欄位的長度(Length)和精確度(Prec,Scale)等。將三個表關聯後可從中取得從磁碟上轉換到伺服器上的表的完整的結構(可以透過定義游標或者直接利用資料視窗的方式完成具體的設計)。
SELECT syscolumns。name, systypes。name
FROM pbcatcol, syscolumns, systypes, length
WHERE (syscolumns。type=systypes。type)
and (pbcatcol。
pbc_cnam=syscolumns。name)
and ((pbcatcol。pbc_tnam= ’Address’));
6、分析資料庫檔案實現轉移
利用資料管道和分析伺服器系統表相結合的方法能夠比較完整的解決資料的轉換問題,但仍然要將本地的資料庫完整的轉換到伺服器上,增加了伺服器的負擔,佔據了一定的儲存空間。
設計中我們試用了另一種方法,透過分析本地資料庫本身的結構,希望有所收穫。利用Visual C++以二進位制的方式將資料庫檔案開啟(此種方法只對Foxbase檔案進行了分析)發現如圖1所示的結構,檔案儲存的方式是表頭和資料兩個部分,表頭以十六進位制的0D結尾。
其表頭的規律是:第一個32個位元組是檔案頭;從第二個32個位元組後是第一個欄位名和資料型別;第三個32位元組開始又是第二個欄位名和資料型別。以此類推,直到0D結束,其結構如表2所示。不足的部分添十六進位制的00,其中資料型別是簡寫:
C-Char,D-Date,L-Logical,N-Numeric,M-Memo,G-Genera1。
於是用PowerBuilder提供的檔案處理函式FileOpen(),FileSeek(),FileRead(),FileClose()等,可以分析Foxbase資料庫檔案,得到本地資料庫的欄位和資料型別。對各種欄位的長度可以讓使用者來設定,或者系統按照最大和系統的要求來設定。
在伺服器的資料庫上來產生相應的表,利用動態的資料視窗(Datawindow)可以顯示本地庫的資料和處理的結果。
7、結束語
對於完成資料的轉移有很多種的方法。在實際的處理過程中,要根據使用者的需求和系統的設計等各個方面來考慮。其目的是要設計過程簡單,而且要滿足使用者的需要,要求有較高的適應性和靈活性,以減少後期的維護工作。
本文上述的6種方法均在系統的設計過程中得以實現,取得了較好的效果。
在大型的MIS系統中大多是採用客戶機/伺服器(C/S)的網路體系結構,在該系統中資料集中儲存在伺服器的資料庫中。開發新的MIS系統的時候,資料的採集和錄入是一個重要的部分。以電信計費系統為例主要有以下幾個方面:
1)原始資料的分揀處理,處理的物件主要是磁碟、磁帶,或者光碟的二進位制資料。
2)以往系統中的檔案資料和引數資料的轉移處理,以減少使用者的輸入量和因為人工輸入所帶來的錯誤,處理的物件主要是Foxbase、Access等資料庫檔案。
3)資訊臺或者其它部門送來的以Foxbase、Access等檔案儲存的費用檔案,如168資訊臺送來的費用資料等。
本文中將結合PowerBuilder/Sybase系統開發的例項,重點介紹2),3)兩種情況的處理過程(即完成本地資料庫檔案向伺服器資料庫中的轉移)中所採取的幾種方式,以及各種方式的具體設計方法,說明了每種方法的普遍性和針對性,並對其優缺點作了比較。
1、利用importfile( )函式實現轉移
PowerBuilder是一種進行C/S系統開發的優秀的前端工具,本身提供了大量的功能和函式,其中DataWindow資料視窗是其重要的組成部分,具有強大的功能,其中importfile( )函式能夠完成資料的轉移。
實現的過程是在伺服器上建立一個同磁碟上的資料庫結構相同的表,建立一個數據視窗物件(dw_fox),取資料來源建立資料視窗,利用資料視窗物件本身的importfile( )函式將資料轉移到資料視窗中,利用update( )函式將資料儲存到伺服器上所建的表中:
dw_fox。
importfi1e (cipan_file_name)
dw_fox。 Update ( )
其中cipan_file_name為磁碟上的檔案及其路徑名稱。該處理簡單,但是缺乏靈活性,對在伺服器資料庫中建立的表的結構有比較高的要求,保證嚴格的一致性,但可以作相應的處理將有效的資料處理後轉移到自己建的表中。
2、利用ODBC連線實現轉移
ODBC是一種標準的應用程式介面(API),最早由Microsoft Windows系統實現,它允許一個應用程式同時連線多個數據源,它使用標準的SQL語句作為其資料查詢語句。在處理過程中先透過ODBC畫板靜態地建立一個ODBC連線磁碟上的Foxbase資料庫,程式設計中建立一個本地的事務物件連線本地的資料庫,透過處理後,將有效的資料送到伺服器上事先設計的一個與Foxbase資料庫相類似的表中,儲存有效的資料就可以了。
在實際處理的過程中,各個地方的磁碟檔名是不同的,這樣所連線的資料庫檔名和目錄都是變化的,那麼在設計的時候就不能夠實現將ODBC的介面固定設計出來,在處理的時候一般有兩種方式,前端作一定的處理,即按照系統要求的目錄和檔名稱進行複製,為了使應用程式有更好的適應性,我們沒有采取這種方式,而是另外一種方式,採取動態建立ODBC連線的方式。
在PowerBuilder的ODBC連線中需要幾個重要的引數,在利用ODBC事先建立一個連線FoxBASE資料庫後(如Foxbase),檢視PB。ini檔案時將有如下的記錄:
[PROFILE Foxtran]
DBMS=ODBC
。
。。。。。。
DbParm=Connectstring=’DSN=FoxBASE’
Prompt=0
AutoCommit=0
同樣開啟註冊器在HKEY_CURRENT_USER Software\ODBC\ODBC。INI下將會發現已經註冊的FoxBASE主鍵,這些給我們動態地建立ODBC連線提供了重要的資料。
在具體的設定中利用PowerBuilder提供的函式註冊一個ODBC的連線,然後建立一個事務物件連線本地(磁碟)的資料庫,作相應的處理後將所需要的資料送到伺服器上,具體的操作如下:
ReGIStrySet("HKEY_CURRENT_USER\Software\ODBC\ODBC。
INI\FoxBASE", "Default Dir", regstring!,
file_path)//設定FoxBASE主鍵
Transaction Foxtran
Foxtran=create Transaction //下面是初始化
Foxtran。
DBMS="ODBC"
Foxtran。DBParm="Connectstring=’DSN=FoxBASE’"
connect using Foxtran;
其中FoxBASE是註冊的ODBC的名稱,Foxtran是事務物件管理中建立的用以連線Foxbase資料庫的新事務,然後對事務物件進行初始化,file_path是磁碟資料庫所在的路徑名稱(可根據使用者輸入的檔案路徑和檔名分析後取得)。
利用動態建立ODBC連線同樣可以同時連線其它的本地資料庫如Access或者Sybase SQL anywhere等,具有一定的靈活性。
3、利用資料管道實現轉移
PowerBuilder的資料管道物件是在開發(利用Data Pipeline畫板來完成)和執行(動態的生成)當中傳輸資料和資料結構的一種有效的方案。
這些資料庫可以是相同的DBMS或不同的DBMS,資料傳輸可以是插入一張完整的資料表或者表的一部分及其資料,也可以是更新已有表的資料。轉換時幾個重要的選項是:源資料庫,目標資料庫,移動資料出來的源表,資料將移到的目的表,所要完成的管道操作等。下面以在執行中使用為例來加以說明其處理的過程。
(1)建立管道物件(Pipe_copy_convert),然後建立一個管道型別的標準類使用者物件u_pipeline和一個數據視窗dw_pipe_errors。在執行的過程中建立使用者物件例項,對它的屬性進行賦值:
iu_pipeline=create u_pipelineiu_pipeline。
DataObject="pipe_copy_convert"
(2)建立連線源資料庫和目標資料庫的事務物件,初始化連線事務物件(同上)。
Transaction Tran_sourse, Tran_dest
ran_sourse=create Transaction
Tran_dest=create Transaction
。
。。。。。 //初始化
(3)執行資料管道及後續處理。
利用start()函式完成後,捕捉到錯誤後進行相應的處理,利用cancel()終止資料管道的執行。
iu_pipeline。start (tran_sourse, tran_dest, dw_pipe_errors)
。
。。。。。 //錯誤處理
iu_pipeline。cancel()
利用資料管道能夠比較快速的、直接的將本地資料庫(包括表的整個結構或者部分以及資料)轉移到伺服器的資料庫並儲存在一個表中,在轉移使用者的原始檔案資料的時候多采取這種方法。
4、分析本地庫系統實現轉移
在進行資料轉換的過程中,由於各種資料的表的結構都是不一樣的,以電信計費的資訊費為例,不同的地區資訊臺使用的軟體不同,資料欄位幾乎都是不一樣的,實際的處理中也不是每一個欄位的資料都有意義,或者都需要轉換到伺服器的資料庫中,使用者往往要求根據自己的需要來選擇欄位、計算方式以及每列的約束條件(如有些專案有最大值的限制等),利用以上的方法來處理就有些困難。
在實際的處理中,我們考慮分析本地資料庫的系統表,來得到本地資料庫的結構,將資料庫中的各個欄位呈現在使用者的面前。使用者作出選擇後,加入一定的條件,再進行處理,將利用動態SQL語句生成一個滿足條件的表。這樣就要求使用者能夠透過系統來了解磁碟資料庫的內容,分析本地庫的系統表後將得到較為滿意的結果。
在利用ODBC連線到本地庫後,發現並分析了幾個系統表(System table),其中有一個表是PBcatcol中記錄著使用者資料庫的結構。
其中:pbc_tnam記錄的是使用者資料庫的表名(Table name) (在Foxbase中一個表就是一個數據庫),pbc_cnam記錄的是使用者資料庫的列名(Column name)。
根據使用者輸入的檔名稱,取消字尾即可得到資料庫的表名,定義一個游標即可取得使用者資料庫的列名,將資料庫展示在使用者的面前,使用者根據需要選擇後再作處理。
DECLARE My_Cursor CURSOR FOR
SELECT pbcatcol。
pbc_cnam
FROM pbcatcol
。。。。。。
利用分析系統表來得到使用者資料庫的結構是一個比較有效的方法,它能夠對未知的資料庫結構有一個清晰的認識,而不需要事先知道它的結構。但是它仍然有一個問題,就是透過分析系統表不能得到使用者資料庫的列的資料型別,在轉換到伺服器的資料庫的時候要藉助使用者的輸入才能夠確定,即提供使用者必須選擇的專案來確定某一個欄位的資料型別。
能夠比較好地完成資料的轉換,具有相當大的靈活性,程式並不要關心使用者資料庫的型別,可以廣泛地使用於各種型別的資料庫(Foxbase,Access等)。
5、分析伺服器系統實現轉移
要確定一個數據庫的結構,只要確定使用者資料庫的欄位名和資料型別就可以了。
利用分析本地庫系統表的方式可以得到資料庫的欄位名,但是使用者資料庫的欄位的資料型別仍然無法獲得。透過分析Sybase伺服器資料庫的系統表可以得到伺服器資料庫中的表的欄位名和資料型別。在設計的時候考慮採取兩種方法相結合的辦法,先利用(資料管道)Pipeline將使用者本地的資料庫完整地轉換到伺服器的資料庫中的一個表,然後透過分析伺服器上的系統表:Pbcatcol,Syscolumns,Systypes。
其中Pbcatcol表中同前面一樣記錄著使用者表的表名和欄位名等,Syscolumns中記錄著資料庫中所有表的欄位名(Name)、欄位的資料型別(Type)、欄位的長度(Length)和精確度(Prec,Scale)等。將三個表關聯後可從中取得從磁碟上轉換到伺服器上的表的完整的結構(可以透過定義游標或者直接利用資料視窗的方式完成具體的設計)。
SELECT syscolumns。name, systypes。name
FROM pbcatcol, syscolumns, systypes, length
WHERE (syscolumns。type=systypes。type)
and (pbcatcol。
pbc_cnam=syscolumns。name)
and ((pbcatcol。pbc_tnam= ’Address’));
6、分析資料庫檔案實現轉移
利用資料管道和分析伺服器系統表相結合的方法能夠比較完整的解決資料的轉換問題,但仍然要將本地的資料庫完整的轉換到伺服器上,增加了伺服器的負擔,佔據了一定的儲存空間。
設計中我們試用了另一種方法,透過分析本地資料庫本身的結構,希望有所收穫。利用Visual C++以二進位制的方式將資料庫檔案開啟(此種方法只對Foxbase檔案進行了分析)發現如圖1所示的結構,檔案儲存的方式是表頭和資料兩個部分,表頭以十六進位制的0D結尾。
其表頭的規律是:第一個32個位元組是檔案頭;從第二個32個位元組後是第一個欄位名和資料型別;第三個32位元組開始又是第二個欄位名和資料型別。以此類推,直到0D結束,其結構如表2所示。不足的部分添十六進位制的00,其中資料型別是簡寫:
C-Char,D-Date,L-Logical,N-Numeric,M-Memo,G-Genera1。
於是用PowerBuilder提供的檔案處理函式FileOpen(),FileSeek(),FileRead(),FileClose()等,可以分析Foxbase資料庫檔案,得到本地資料庫的欄位和資料型別。對各種欄位的長度可以讓使用者來設定,或者系統按照最大和系統的要求來設定。
在伺服器的資料庫上來產生相應的表,利用動態的資料視窗(Datawindow)可以顯示本地庫的資料和處理的結果。
7、結束語
對於完成資料的轉移有很多種的方法。在實際的處理過程中,要根據使用者的需求和系統的設計等各個方面來考慮。其目的是要設計過程簡單,而且要滿足使用者的需要,要求有較高的適應性和靈活性,以減少後期的維護工作。
本文上述的6種方法均在系統的設計過程中得以實現,取得了較好的效果。