摘要:在C/S/D模式下,由客戶端讀取并顯示在數(shù)據(jù)庫中存儲的FastReport Studio報表,實現(xiàn)報表文件的隱式分發(fā),解決了在傳統(tǒng)軟件分發(fā)模式下更新報表文件時重復分發(fā)的問題。
關鍵詞:軟件分發(fā);FastReport Studio;ADO;VB;報表
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)18-2pppp-0c
Research and Implementation for Implicit Distribution of FastReport Studio Report File
LIU Geng-long
(Xuzhou College of Industrial Technology,JiangSu 221140,China)
Abstract:In the C/S/D mode, the client read and display FastReport Studio report which stored in the database,realize the implicit distribution of report file,resolved the question of redistribute the updated report file in traditional software distribution model.
Key words:Software distribution;FastReport Studio;ADO;VB;Report
1 引言
軟件分發(fā)是軟件交付的重要一步,開發(fā)者通過安裝工具將軟件運行所需的文件打包形成安裝包,交付給最終用戶使用。在C/S/D(客戶端/服務器/數(shù)據(jù)庫)模式下,在基于FastReport Studio(以下簡稱FRS)報表工具開發(fā)應用軟件時,如采用傳統(tǒng)的軟件分發(fā)模式,當FRS報表文件更新時,必須重新打包進行分發(fā)。上述FRS報表文件的顯式分發(fā)模式存在的缺點不言而喻,解決方法是:將FRS報表文件存儲到數(shù)據(jù)庫中,客戶端通過FRS提供的程序接口讀取并顯示報表,從而實現(xiàn)FRS報表文件的隱式分發(fā)。
2 實現(xiàn)原理
FRS提供了LoadReportFromStream方法,允許開發(fā)工具 讀取以Stream流(二進制數(shù)據(jù)流)存在的FRS報表,在此前提下,通過ADO對象將FRS報表文件存儲到數(shù)據(jù)庫中,即可實現(xiàn)FRS報表文件的在客戶端的分發(fā)。如更新數(shù)據(jù)庫中FRS報表Stream流,則實現(xiàn)了FRS報表在客戶端的再次分發(fā)(圖1)。
圖1 原理圖
3 實現(xiàn)過程
3.1 FRS報表設計
利用FRS外部報表設計器(FastReport Designer)生成報表文件demo.fr3。設計布局如圖2所示:
圖2 demo.fr3設計布局
3.2 數(shù)據(jù)庫設計
在SQL Server中創(chuàng)建數(shù)據(jù)庫datademo,創(chuàng)建一個登錄帳號demouser,密碼demouser,默認登錄數(shù)據(jù)庫為datademo,設置角色為db_owner。
在datademo中創(chuàng)建一個數(shù)據(jù)表tb_frs,表結構定義如表1所示,并輸入測試數(shù)據(jù)(圖3):
表1 tb_frs表結構定義
圖3 tb_frs表中的數(shù)據(jù)
3.3 程序設計
3.3.1 FRS報表文件的數(shù)據(jù)庫存儲及更新
利用ADO 對象中的Stream對象以二進制模式讀取FRS報表文件,通過更新記錄集的方式將FRS報表文件以Stream流存儲到數(shù)據(jù)庫中,基于VB的核心代碼如下:
'定義數(shù)據(jù)庫對象變量
Dim objDBConnection As ADODB.Connection
Dim objDBRecordSet As ADODB.Recordset
Dim objDBStream As ADODB.Stream
'實例化數(shù)據(jù)庫對象變量
Set objDBConnection = New ADODB.Connection
Set objDBRecordSet = New ADODB.Recordset
Set objDBStream = New ADODB.Stream
'打開數(shù)據(jù)庫
objDBConnection.Open "Provider=SQLOleDB;Server=127.0.0.1;UID=demouser;PWD=demouser;DataBase=datademo"
'操作ADO Steam對象讀取已保存的FRS報表文件
With objDBStream
.Type = adTypeBinary'指定數(shù)據(jù)操作類型為二進制
.Open'打開Steam對象
.LoadFromFile App.Path + "demo.fr3"'讀取存放在程序路徑下的demo.fr3報表文件
End With
'將ADO Steam對象中讀取的FRS報表文件Stream流寫入數(shù)據(jù)表
With objDBRecordSet
.Open "select frs_data from tb_frs where frs_id=1", objDBConnection, 1, 3'打開記錄集
.Fields("frs_data") = objDBStream.Read'指定更新表字段
.Update'更新記錄集
End With
'關閉數(shù)據(jù)庫對象,釋放內存
objDBRecordSet.Close
objDBStream.Close
objDBConnection.Close
Set objDBRecordSet = Nothing
Set objDBStream = Nothing
Set objDBConnection = Nothing
'完成提示
MsgBox "demo.fr3報表文件已經存儲到數(shù)據(jù)庫中。", vbInformation, "提示"
3.3.2 客戶端讀取并顯示數(shù)據(jù)庫中的FRS報表
客戶端通過FRS的LoadReportFromStream方法讀取數(shù)據(jù)庫中的FRS報表Stream流,利用ShowReport方法顯示報表(圖4),基于VB的核心代碼如下:
'定義FRS報表對象,用于讀取和顯示FRS報表
Dim objFRS As FastReport.TfrxReport
'實例化FRS報表對象
Set objFRS = New FastReport.TfrxReport
'打開指定id的FRS報表記錄集,對應測試數(shù)據(jù)見圖3
objDBRecordSet.Open "select frs_data from tb_frs where frs_id=1", objDBConnection, 1, 3
'用ADO Stream對象讀取數(shù)據(jù)表中的FRS報表文件Stream流
With objDBStream
.Mode = adModeReadWrite'打開Stream對象讀寫模式
.Type = adTypeBinary'指定數(shù)據(jù)操作類型為二進制
.Open'打開Stream對象
.Write objDBRecordSet("frs_data")'將FRS報表Stream流寫入到Stream對象中
End With
'用FRS對象的LoadReportFromStream方法讀取ADO Stream對象的Stream流并顯示報表,原FRS報表文件見圖2
With objFRS
.LoadReportFromStream objDBStream'指定FRS以Stream流方法加載報表
.ShowReport'顯示報表
End With
圖4 客戶端顯示打印預覽窗口
4 結束語
在軟件分發(fā)中實現(xiàn)FRS報表文件的隱式分發(fā),減少了應用程序中FRS報表的后期維護量,對初步接觸FRS報表工具的開發(fā)者具有較高的參考價值,同時對開發(fā)者優(yōu)化軟件分發(fā)有一定的借鑒作用。
參考文獻:
[1]如何使用ADO Stream對象訪問和修改 SQL Server BLOB 數(shù)據(jù)[EB/OL].http://support.microsoft.com/kb/258038/zh-cn,2004-09-01.
[2]FastReport Studio - Programmer manual[EB/OL].http://fast-report.com/pbc_download/FastReport Studio Programmers Manual (EN).pdf,2006-09.
[3]莫衛(wèi)東.Visual Basic 6.0高級編程技巧-ADO數(shù)據(jù)訪問篇[M].西安:西安交通大學出版社,2000.
收稿日期:2008-04-12
作者簡介:劉耿龍(1975-),男,江蘇徐州人,工程師,研究方向:數(shù)據(jù)庫系統(tǒng)及教育管理應用軟件開發(fā)。