41、在關系數據庫中,數據僅僅是數據,它不包含層次結構信息;而面向對象數據庫可以將數據視為對象,數據是作為一個整體,包含了屬性和方法,並能體現數據間的繼承關系。
42、一個基於XML的數據庫系統應該具備以下特征:
43、對數據庫操作ASP和DTD(Schema)的具體實現:
ASP:
<% @language = "VBScript" %>
<% Response.ContentType = "text/XML" %>
<?XML version="1.0" encoding="GB2312" ?>
<%’動態構建XML文檔
set xmlDoc = Server.CreateObject(Microsoft.XMLDOM)
set root = XMLDoc.createNode("element","聯系人列表","")
XMLDoc.appendChild(root)
’查詢數據庫
sqlStr = "select * from clIEntList"
set cConn = Server.CreateObject("ADODB.Connection")
cConn.Open "CLIENTS","sa", ""
set rsData = cConn.Execute(sqlStr)
rsData.MoveFirst()
while (not rsData.EOF )
’構建聯系人子節點
set tmpNode = XMLDoc.createNode("element","聯系人","")
XMLDoc.documentElement.appendChild(tmpNode)
’構建姓名、ID、公司、Email子節點
for I = 0 to rsData.FIElds.Count - 1
set childNode = XMLDoc.createNode("element",rsData.FIElds(i).Name,"")
childNode.text = rsData.FIElds(i)
tmpNode.appendChild(childNode)
next
rsData.MoveNext()
wend
Response.Write(xmlDoc.XML)
%>
DTD:
<% Response.ContentType="text/XML" %>
<?XML version="1.0" encoding="GB2312" ?>
<聯系人列表>
<% Set cConn = Server.CreateObject("ADODB.Connection")
cConn.Open "CLIENTS","sa", ""
Set rsData = cConn.Execute("select * from clIEntList")
do while not rsData.Eof
%>
<聯系人>
<姓名><%=rsData("Name")%></姓名>
<ID><%=rsData("ID")%></ID>
<公司><%=rsData("Company")%></公司>
<Email><%=rsData("Email")%></Email>
</聯系人>
<% rsData.MoveNext
Loop
rsData.Close
Set rsData = nothing
%>
</聯系人列表>
最終生成XML文檔為:
<?XML version = "1.0" encoding="GB2312" standalone = "no"?>
<聯系人列表>
<聯系人>
<姓名>張三</姓名>
<ID>1</ID>
<公司>A公司</公司>
<EMAIL>zhang@aaa.com</EMAIL>
</聯系人>
<聯系人>
<姓名>李四</姓名>
<ID>2</ID>
<公司>B公司</公司>
<EMAIL>li@bbb.org</EMAIL>
</聯系人>
</聯系人列表>
44、這種方案存在一個前提,那就是,開發者必須了解文檔結構,並且通過編程嚴格控制輸出文檔的格式。但細心的讀者可能會產生疑問:既然數據已經存儲在數據庫中,又何必大費周折重新定義一遍文檔結構呢?
XML的自描述性何在?為了解決這個問題,微軟將其ADO技術進行了擴展以提供對XML的更大支持,
結果是可以根據數據庫表的內在結構直接輸出XML文檔,文檔的格式將符合默認的DTD定義。下面是一個用Visual Basic 6.0編寫的實例:
’聲明連接和結果集
Dim cConn As ADODB.Connection
Dim rsData As ADODB.Recordset
Private Sub Form_Load()
’連接數據庫
Dim query As String
Set cConn = New ADODB.Connection
cConn.ConnectionString = "DSN=nwind;UID=sa;PWD=;"
cConn.Open
’執行數據庫查詢
query = "Select * FROM clIEntList"
Set rsData = cConn.Execute(query)
’將數據庫返回結果集保存至文件
On Error Resume Next
Kill ("recordset.XML")
rsData.Save "output.xml", adPersistXML
End Sub
下面給出的是該程序執行後生成的XML文檔--output.xml。通過分析,可以發現,它實際上是一個內嵌XML Schema的XML實例文檔。該實例文檔的主元素是<rs:data>, 命名空間rs由XMLns:rs=’urn:schemas-microsoft-com:rowset’定義; 數據庫查詢返回的每一條記錄都作為<rs:data>的一個子元素,用<z:row>表示。
<z:row>子元素實際上是空元素,信息均以屬性的方式體現,屬性來自於返回的數據庫字段。
內嵌的Schema部分<s:Schema id=’RowsetSchema’>定義了元素<row>的組織結構和規則。
<xml 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’
>
<s:Schema id=’RowsetSchema’>
<s:ElementType name=’row’ content=’eltOnly’>
<s:attribute type=’Name’/>
<s:attribute type=’ID’/>
<s:attribute type=’Company’/>
<s:attribute type=’Email’/>
<s:extends type=’rs:rowbase’/>
</s:ElementType>
<s:AttributeType name=’Name’ rs:number=’1’ rs:nullable=’true’ rs:write=’true’>
<s:datatype dt:type=’string’ dt:maxLength=’10’/>
</s:AttributeType>
<s:AttributeType name=’ID’ rs:number=’2’ rs:nullable=’true’ rs:write=’true’>
<s:datatype dt:type=’int’/>
</s:AttributeType>
<s:AttributeType name=’Company’ rs:number=’3’ rs:nullable=’true’ rs:write=’true’>
<s:datatype dt:type=’string’ dt:maxLength=’20’/>
</s:AttributeType>
<s:AttributeType name=’Email’ rs:number=’4’ rs:nullable=’true’ rs:write=’true’>
<s:datatype dt:type=’string’ dt:maxLength=’20’/>
</s:AttributeType>
</s:Schema>
<rs:data>
<z:row Name=’張三’ ID=’1’ Company=’A公司’ Email=’zhang@aaa.com’/>
<z:row Name=’李四’ ID=’2’ Company=’B公司’ Email=’li@bbb.org’/>
</rs:data>
</XML>
ADO提供了文檔保存功能,通過它,ASP可以將數據庫返回結果集保存至XML文件,這些XML文件經由XSL樣式化後可以在浏覽器直接顯示,也可以傳輸至其他應用系統供再次利用。
另外,值得一提的是,微軟在其ADO2.5和IIS5.0中又增加了更高級的支持,即,可以將數據庫返回的結果直接轉換為XML在浏覽器中顯示,而不必先保存至文件。下面的實例片段有力地說明了這一點:
<%
Set rsData = Server.CreateObject("ADODB.Recordset")
Response.ContentType="text/XML"
rsData.Open "select * from clIEntList", "File Name=" & Server.MapPath("ado.udl")
rsData.Save Response, adPersistXML
rsData.Close
Set cConn = nothing
%>
(完)