摘要:本文介紹了VB.NET中調(diào)用存儲(chǔ)過(guò)程,使用多種工具進(jìn)行多種形式報(bào)表開(kāi)發(fā)的基本方法。
關(guān)鍵詞:存儲(chǔ)過(guò)程;動(dòng)態(tài)報(bào)表;VB.NET?搖ReportViewer?搖Crystal Reports
中圖分類(lèi)號(hào):G250.74?搖 文獻(xiàn)標(biāo)志碼:A ?搖文章編號(hào):1674-9324(2013)25-0240-03
一、存儲(chǔ)過(guò)程概述
存儲(chǔ)過(guò)程是在數(shù)據(jù)庫(kù)系統(tǒng)中實(shí)現(xiàn)特定功能的SQL語(yǔ)句集,經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫(kù)服務(wù)器中。客戶端使用時(shí)只要通過(guò)指定存儲(chǔ)過(guò)程的名字并給出參數(shù)即可調(diào)用它,因此大大減少了網(wǎng)絡(luò)上數(shù)據(jù)的傳輸量。用戶可以獨(dú)立于應(yīng)用程序而對(duì)存儲(chǔ)過(guò)程進(jìn)行修改,增加了數(shù)據(jù)庫(kù)應(yīng)用程序的易修改特征。存儲(chǔ)過(guò)程實(shí)質(zhì)上是批處理,它可以包含幾乎所有的T-SQL語(yǔ)句,如數(shù)據(jù)操縱和查詢語(yǔ)句、流程控制語(yǔ)句、錯(cuò)誤處理語(yǔ)句等,靈活性很大。存儲(chǔ)過(guò)程中也可以使用事務(wù),實(shí)現(xiàn)數(shù)據(jù)庫(kù)系統(tǒng)功能的任意組合和重用。
通過(guò)存儲(chǔ)過(guò)程觸發(fā)器可以使相關(guān)的動(dòng)作在一起發(fā)生,從而維護(hù)數(shù)據(jù)庫(kù)的完整性;對(duì)于某些關(guān)鍵數(shù)據(jù),可以設(shè)置成只通過(guò)存儲(chǔ)過(guò)程來(lái)訪問(wèn),從而保證數(shù)據(jù)的安全性;存儲(chǔ)過(guò)程在創(chuàng)建時(shí)就經(jīng)過(guò)了語(yǔ)法檢查和性能優(yōu)化,這種已經(jīng)編譯好的過(guò)程可極大地改善SQL語(yǔ)句的性能,因而存儲(chǔ)過(guò)程能以極快的速度執(zhí)行。
二、調(diào)用存儲(chǔ)過(guò)程創(chuàng)建多種形式的動(dòng)態(tài)報(bào)表的實(shí)現(xiàn)
ADO.NET對(duì)象是前臺(tái)訪問(wèn)數(shù)據(jù)庫(kù)的通道,要實(shí)施代碼訪問(wèn),必須先定義各個(gè)數(shù)據(jù)庫(kù)訪問(wèn)對(duì)象,然后再與功能需要聯(lián)系起來(lái)。報(bào)表是大多數(shù)應(yīng)用系統(tǒng)的典型輸出形式之一,根據(jù)用戶對(duì)報(bào)表輸出的需求,可以通過(guò)創(chuàng)建使用現(xiàn)有存儲(chǔ)過(guò)程的數(shù)據(jù)適配器填充數(shù)據(jù)集,生成相應(yīng)的查詢結(jié)果集,或者用Sqldatareader對(duì)象在保持和數(shù)據(jù)庫(kù)連接的狀態(tài)下,調(diào)用存儲(chǔ)過(guò)程,傳遞客戶端參數(shù),生成相應(yīng)的查詢結(jié)果集,并填充到所創(chuàng)建的報(bào)表中去。以下通過(guò)三個(gè)實(shí)例,使用三種方式設(shè)計(jì)、開(kāi)發(fā)三種報(bào)表形式。
(一)Visual Studio2005報(bào)表ReportViewer
ReportViewer控件是Visual Studio2005中負(fù)責(zé)解釋RDLC報(bào)表定義、處理報(bào)表參數(shù)并按照各種用戶可選格式提供報(bào)表的處理器。它既可以運(yùn)行于“本地模式”也可以運(yùn)行于“遠(yuǎn)程模式”。由用戶編寫(xiě)的存儲(chǔ)過(guò)程負(fù)責(zé)管理連接或運(yùn)行基于參數(shù)的查詢;報(bào)表只駐留以報(bào)表為中心的Parameters集合,尋址遠(yuǎn)程報(bào)表服務(wù)并呈現(xiàn)它。
以sales數(shù)據(jù)庫(kù)為例,要求根據(jù)傳遞的供貨商ID參數(shù),能夠“按供貨商查詢庫(kù)存情況”輸出報(bào)表,顯示該供貨商所提供的產(chǎn)品名、庫(kù)存量、預(yù)訂量和占用資金額。為實(shí)現(xiàn)該報(bào)表功能,需要給工程添加一個(gè)報(bào)表輸出所依附的窗體form2,創(chuàng)建一個(gè)實(shí)現(xiàn)上述查詢功能的存儲(chǔ)過(guò)程ProductBysupplies,并將該存儲(chǔ)過(guò)程添加、配置到數(shù)據(jù)集中去,用來(lái)構(gòu)建系統(tǒng)報(bào)表report1.rdlc。
主窗體中用來(lái)觸發(fā)報(bào)表輸出功能的打印按鈕的Click()事件設(shè)計(jì)如下:
Private Sub Button4_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)Handles Button4.Click Me.ProductBysuppliesTableAdapter.Fill(Me.SalesDs.ProductBysupplies,CInt(Me.ComboBox3.Text.ToString))
Form2.Show()
Form2.ReportViewer1.RefreshReport()
End Sub
在form2窗體的Load事件中,要傳遞從供貨商ID參數(shù),并刷新報(bào)表,其Load ()事件設(shè)計(jì)如下:
Private Sub Form2_Load(ByVal sender As System.Object,ByVal e As System.EventArgs)Handles MyBase.Load Me.ProductBysuppliesTableAdapter.Fill(Me.salesDs.ProductBysupplies,CInt(Form1.ComboBox3.Text))
Me.ReportViewer1.RefreshReport()
End Sub
最后生成的報(bào)表效果如圖1所示:
(二)水晶報(bào)表Crystal Reports
水晶報(bào)表工具為微軟Visual Studio.NET的標(biāo)準(zhǔn)報(bào)表創(chuàng)建工具,并把集成于開(kāi)發(fā)環(huán)境當(dāng)中。水晶報(bào)表的組件、方法非常豐富,涵蓋了數(shù)據(jù)庫(kù)操作、格式設(shè)計(jì)、打印、文件轉(zhuǎn)換等多種功能,并提供了針對(duì)各種對(duì)象的方法。水晶報(bào)表支持自定義模板,還能與其他控件進(jìn)行交互。用戶可以通過(guò)單擊按鈕或從組合框中選擇條件來(lái)篩選信息下面就使用水晶報(bào)表工具來(lái)設(shè)計(jì)實(shí)現(xiàn)按供貨商查詢產(chǎn)品庫(kù)存情況的統(tǒng)計(jì)圖表。
調(diào)用存儲(chǔ)過(guò)程,創(chuàng)建水晶報(bào)表,可以按照向?qū)У奶崾荆徊讲饺?chuàng)建。在使用向?qū)?chuàng)建新水晶報(bào)表過(guò)程中,要注意的是:在“標(biāo)準(zhǔn)報(bào)表創(chuàng)建向?qū)А钡倪x擇要報(bào)告的數(shù)據(jù)對(duì)話框中,要展開(kāi)“創(chuàng)建新數(shù)據(jù)源”→“Ole DB(ADO)”,在下一步的窗體里選擇“...For SQLserver”提供程序,按照向?qū)У奶崾疽徊讲酵瓿稍O(shè)置即可。運(yùn)行后效果圖如圖2所示。
(三)利用Word和Excel輸出報(bào)表
借助Excel和Word工具,能夠間接生成各種比較復(fù)雜的統(tǒng)計(jì)圖表,其原理是通過(guò)創(chuàng)建存儲(chǔ)過(guò)程,調(diào)用并傳遞參數(shù),將數(shù)據(jù)庫(kù)中不同數(shù)據(jù)表中所需要的相關(guān)字段抽取、組合起來(lái),生成所需要的數(shù)據(jù)表,再借助Word和Excel中錄制的宏的VBA的代碼,提供幫助,利用循環(huán)嵌套控制語(yǔ)句在Vb.net2005里生成對(duì)應(yīng)的Word和Excel表格,也可以二次生成復(fù)雜的統(tǒng)計(jì)圖表,開(kāi)發(fā)的報(bào)表具有二次編輯功能,最終用戶可以進(jìn)行再加工,最大限度地滿足用戶需求。本文僅以輸出Word報(bào)表為例。
數(shù)據(jù)的來(lái)源基于對(duì)存儲(chǔ)過(guò)程的調(diào)用,是可變數(shù)據(jù)源,因此生成的報(bào)表是動(dòng)態(tài)報(bào)表。窗體設(shè)計(jì)如圖3所示:
首先要將Option Strict狀態(tài)置為Off,其次要往工程中添加兩個(gè)COM組件的引用:Microsoft Word 11.0 Object Library和Microsoft Excel 11.0 Object Library。
“輸出Word報(bào)表”按鈕的Click事件代碼如下:
Private Sub Button14_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)Handles Button14.Click
?搖?搖Dim wApp As New Word.Application
?搖?搖Dim wd As Word.Document
?搖?搖Dim wtb As Word.Table
?搖?搖Dim rIndex,cIndex As Integer
?搖?搖rIndex = 1
?搖?搖cIndex = 0
?搖?搖wApp.Documents.Add()
?搖?搖wd = wApp.ActiveDocument
?搖?搖Dim Table As New DataTable
?搖?搖Cmd.CommandType = CommandType.StoredProcedure
?搖?搖Cmd.CommandText = “Productbysupplies”
?搖?搖Cmd.Parameters.Clear()
?搖?搖Cmd.Parameters.AddWithValue(“@Id”,Me.ComboBox3.Text.ToString)
?搖?搖Cn.Open()
?搖?搖Dr = Cmd.ExecuteReader
?搖?搖Dt2.Load(Dr)
?搖?搖Dr.Close()
?搖?搖Cn.Close()
?搖?搖Table = Dt2
?搖?搖wtb = wd.Tables.Add(Range:=wd.Range(Start:=0,End:=0),NumRows:=Table.Rows.Count + 1,NumColumns:=Table.Columns.Count)
?搖?搖Dim Col As DataColumn
?搖?搖Dim Row As DataRow
?搖?搖For Each Col In Table.Columns
?搖?搖cIndex = cIndex + 1
?搖?搖wtb.Cell(1,cIndex).Range.InsertAfter(Col.ColumnName)
?搖?搖Next
?搖?搖For Each Row In Table.Rows
?搖?搖rIndex = rIndex + 1
?搖?搖cIndex = 0
?搖?搖For Each Col In Table.Columns
?搖?搖?搖cIndex = cIndex + 1
?搖?搖?搖wtb.Cell(rIndex,cIndex).Range.InsertAfter(Row(Col.ColumnName))
?搖?搖?搖Next
?搖?搖Next
?搖?搖wtb.Borders.InsideLineStyle = 1
?搖?搖wtb.Borders.OutsideLineStyle = 1
?搖?搖wApp.Visible = True
End Sub
調(diào)用存儲(chǔ)過(guò)程,生成Word格式報(bào)表,如圖4所示:
三、結(jié)語(yǔ)
本文用三個(gè)實(shí)例介紹了如何動(dòng)態(tài)調(diào)用存儲(chǔ)過(guò)程,傳遞參數(shù),構(gòu)建數(shù)據(jù)集,創(chuàng)建多種形式報(bào)表的技術(shù),并以VB.NET做前臺(tái),SQL Server做后臺(tái)的模式給了出具體的實(shí)現(xiàn)代碼。
參考文獻(xiàn):
[1]劉世峰.數(shù)據(jù)庫(kù)應(yīng)用技術(shù)[M].北京:中央廣播電視大學(xué)出版,2008.
[2]龔沛曾.Visual Basic.NET程序設(shè)計(jì)教程[M].北京:高等教育出版社,2007.
作者簡(jiǎn)介:隋東(1967-),男,碩士,講師,研究方向:數(shù)據(jù)庫(kù)應(yīng)用技術(shù)。