zoukankan      html  css  js  c++  java
  • 使用XML技术实现OWC对数据库的展示

    概述:   本文档介绍了如何借助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>
     

    二、使用OWC控件和HTML表格展现XML数据
    2.1 基本功能的实现
    这里新建了另外一个HTML页面。为了使用刚才得到的XML数据,在HTML页面中,采用XML 数据岛:
    <XML id="dbXML" src="getData.asp" onreadystatechange="init()"></XML>
     
    然后,可以利用HTML表格的绑定功能展现数据:
    <table  datasrc="#dbXML" style="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源代码)、数据分页等。此外,我们还可以实现通用的数据访问、搜索功能。

    申明

    非源创博文中的内容均收集自网上,若有侵权之处,请及时联络,我会在第一时间内删除.再次说声抱歉!!!

    博文欢迎转载,但请给出原文连接。

  • 相关阅读:
    201521123062《Java程序设计》第11周学习总结
    201521123062《Java程序设计》第10周学习总结
    201521123062《Java程序设计》第9周学习总结
    201521123062《Java程序设计》第8周学习总结
    201521123062《Java程序设计》第7周学习总结
    201521123062《Java程序设计》第6周学习总结
    201521123062《Java程序设计》第5周学习总结
    MarkDown 例子
    201521123062《Java程序设计》第4周学习总结
    201521123060 《Java程序设计》第11周学习总结
  • 原文地址:https://www.cnblogs.com/Athrun/p/1446573.html
Copyright © 2011-2022 走看看