|
導讀數據庫,簡而言之可視為電子化的文件柜——存儲電子文件的處所,用戶可以對文件中的數據進行新增、截取、更新、刪除等操作。所謂“數據庫”是以一定方式儲存在一起、能與多個用戶共享、具有盡可能小的冗余度、與應... 數據庫,簡而言之可視為電子化的文件柜——存儲電子文件的處所,用戶可以對文件中的數據進行新增、截取、更新、刪除等操作。所謂“數據庫”是以一定方式儲存在一起、能與多個用戶共享、具有盡可能小的冗余度、與應用程序彼此獨立的數據集合。 概述: 本文檔介紹了如何借助XML語言實現在Web頁面上的OWC對數據庫中的數據進行展示的方法。由于XML數據可以跨越防火墻,因此該方式可以實現在Internet上對數據進行展現。 在基于WEB的數據庫分析應用中,常常借助OWC控件結合HTML實現對數據的表格和圖表兩種方式的展現。一般應用往往采用OWC直接連接數據庫的方式,這會使數據庫連接口令暴露在客戶端,而使數據庫的安全性降低。本文介紹的采用XML作為OWC和數據庫之間數據交換介質的方式,能夠避免這種對數據庫造成的不安全危險。同時,這也能帶來其他一些好處,例如:使瀏覽器與WEB服務器及數據庫間的交互次數減少,從而加快排序等操作的響應速度,并減少了服務器的負荷。 一、獲取XML數據 將數據庫中的數據轉化為XML格式的方法很多,本文檔不過多對此進行介紹。從性能、通用性角度考慮,這里我們采用了ADO直接序列化(持久化Persist)數據的方式,代碼如下: <!--GetData.asp --> <% dim strConn strConn="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=test;Data Source=jlwz" ’----------讀取數據---------------- dim conn,rs set conn=server.CreateObject("adodb.connection") set rs=server.CreateObject("adodb.recordset") conn.Open strConn rs.Open "Select Stat_Date,Call_Num,Call_Fee From CallStat",conn ’將ADO轉化為xml dom Const adPersistXML=1 dim objXMLDom set objXMLDom=server.CreateObject("MSXML2.DOMDocument.3.0") rs.Save objXMLDom,adPersistXML set rs=nothing %> 這種方式得到的的XML并不夠簡潔,其中包含了Schema信息。 盡管對于OWC中的DataSourceControl控件來說,可以直接采用這種形式的XML數據,但考慮到數據從服務器向客戶端傳輸的效率,我們使用XSLT對這種XML數據進行了轉化。為此,編寫了如下的Clean.xsl文件: <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema"> <xsl:output omit-xml-declaration="yes"/> <xsl:template match="/"> <xsl:element name="data"> <xsl:for-each select="/xml/rs:data/z:row"> <xsl:element name="row"> <xsl:for-each select="@*"> <xsl:element name="{name()}"> <xsl:value-of select="."/> </xsl:element> </xsl:for-each> </xsl:element> </xsl:for-each> </xsl:element> </xsl:template> </xsl:stylesheet> 然后,在GetData.asp中通過如下代碼對前面的XML數據進行轉化: ’用XSLT清理轉化XML數據 Dim strCleanXML,objXSLT set objXSLT=server.CreateObject("MSXML2.DOMDocument") objXSLT.load(server.MapPath("Clean.xsl")) strCleanXML=objXMLDom.transformNode(objXSLT) 此時,就得到了我們想要的比較簡潔的XML結構的字符串,可以簡單地將其Response.Write到客戶端: <data> <row> <Stat_Date>2003-06-01</Stat_Date> <Call_Num>100</Call_Num> <Call_Fee>200</Call_Fee> </row> <row> <Stat_Date>2003-07-01</Stat_Date> <Call_Num>200</Call_Num> <Call_Fee>400</Call_Fee> </row> 。。。 </data> [page_break]二、使用OWC控件和HTML表格展現XML數據 2.1 基本功能的實現 這里新建了另外一個HTML頁面。為了使用剛才得到的XML數據,在HTML頁面中,采用XML 數據島: <XML id="dbXML" src="getData.asp" onreadystatechange="init()"></XML> 然后,可以利用HTML表格的綁定功能展現數據: <table datasrc="#dbXML" style="width:100%;BORDER-COLLAPSE: collapse;" border=1 cellpadding=0 cellspacing=0> <tr> <td><div type=text datafld=Stat_Date></div></td> <td><div type=text datafld=Call_Num></div></td> <td><div type=text datafld=Call_Fee></div></td> </tr> </table> 在剛才的XML數據島的onreadystatechange事件對應的init()函數中,我們通過如下代碼實現OWC的圖表: <OBJECT id=CS1 style="WIDTH:400px;TOP:0px;HEIGHT:280px" classid=clsid:0002E556-0000-0000-C000-000000000046 VIEWASTEXT> </OBJECT> <script lanaguage=vbscript> Sub init() if(dbXML.readyState="complete") then dim strXML set strXML=dbXML.XMLDocument createChart strXML,CS1 end if End Sub Sub createChart(byref oxml,cspace) ’根據傳入的XML生成圖表 Dim xdoc,xroot,cCnt Dim ndx,cnode,txtData,txtCat,txtData2 Set xdoc=dbXML.XMLDocument Set xroot = xdoc.documentElement cCnt = xroot.childNodes.length txtData = "":txtCat = "" ’ 從XML數據中得到相應的子符串 For ndx = 0 To cCnt - 1 Set cnode = xroot.childNodes(ndx) txtCat = txtCat & cnode.childNodes(0).text txtData = txtData & cnode.childNodes(1).text txtData2=txtData2 & cnode.childNOdes(2).text if ndx <> (cCnt -1) then txtCat = txtCat & "," txtData = txtData & "," txtData2 = txtData2 & "," end if Next ’---下面開始繪圖---------- ’添加數據序列1 set ch =cspace.Charts.Add() set s = ch.SeriesCollection.Add() s.name="通話費用(元)" s.Caption=s.name s.SetData c.chDimCategories,c.chDataLiteral, txtCat s.SetData c.chDimValues, c.chDataLiteral, txtData s.type=8 ’曲線圖 ’設定時間刻度軸格式 Set axCategory = cspace.Charts(0).Axes(c.chAxisPositionCategory) with axCategory .GroupingUnitType = c.chAxisUnitMonth ’月 .GroupingUnit = 1 ’單位 .NumberFormat="Short Date" ’短日期 end with ’添加數據序列2 set s2 = ch.SeriesCollection.Add() s2.name="通話次數(次)" s2.Caption=s2.name s2.SetData c.chDimValues, c.chDataLiteral, txtData2 ’標題 ch.HasTitle = true ch.Title.Caption="通話情況月報" ch.Title.font.color="black" ch.Title.font.size=10 ch.Title.font.bold=true ’ChartSpace屬性 cspace.Border=c.chLineDash cspace.HasSelectionMarks=true cspace.AllowFiltering=true ’允許命令與分組 cspace.AllowPropertyToolbox=true ’設置圖例及位置 ch.Legend.Position=c.chLegendPositionRight ch.HasLegend=false ’分成不同的組,顯示雙坐標軸 s2.UnGroup TRUE Set axIncomeAxis = ch.Axes.Add(s2.Scalings(c.chDimValues)) axIncomeAxis.Position = c.chAxisPositionRight axIncomeAxis.HasMajorGridlines=false s2.type=0 ’柱形圖 End Sub 這樣,我們就得到了數據表格和圖表,其最終效果如下: 這樣,借助于XML技術和IE綁定技術,我們就實現了OWC對數據庫中數據的展示,而在客戶端并沒有暴露任何數據連接信息。 2.2 其他功能 OWC可以很容易的實現將所見到的圖表保存為本地圖片,大大方便了使用者。同時,OWC提供了多種圖表類型,如:餅圖、曲線圖、柱形圖等,適合在不同的情況下展現數據。 如果借助COM組件、以及對XSL的靈活運用,我們這個頁面能得到更好的性能和更強的功能。比如:對HTML表格的排序(參見附件中的HTML源代碼)、數據分頁等。此外,我們還可以實現通用的數據訪問、搜索功能。 全新的路由器不僅讓你更穩定快速地連接無線網絡,更可以讓家中的智能設備連接在一起。 |
溫馨提示:喜歡本站的話,請收藏一下本站!