在基於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>