直播中
<SCRIPT LANGUAGE=JScript>
function window.onload()
{
dsoAuthors.Connect = "DSN=pubs";
dsoAuthors.Server = "W2000";
dsoAuthors.SQL = "SELECT * FROM Authors";
dsoAuthors.Refresh();
}
</SCRIPT>
這里為Connect參數(shù)使用了一個DSN,因為這非常適合該頁面,但也可以是任何有效的ADO連接字符串。
URL是ADO 2.5版提供的新特性,允許使用一個文件作為數(shù)據(jù)源。該文件可以有兩種格式:一種是用Recordset.Save方法保存的記錄集;另一種是一個ASP頁面,它創(chuàng)建一個記錄集,然后將其保存在一個流中。代碼如下:
<OBJECT CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
ID="dsoAuthors" WIDTH="0" HEIGHT="0">
<PARAM NAME="URL" VALUE="DataPage.asp">
</OBJECT>
文件DataPage.asp包含以下VBScript代碼:
<%
Dim rsData
Set rsData = Server.CreateObject("ADODB.Recordset")
rsData.Open "SELECT * FROM Authors", strConn
rsData.Save Response, adPersistXML
rsData.Close
Set rsData = Nothing
%>
這只是創(chuàng)建了一個記錄集,然后用Save方法將記錄集以XML格式保存到Response對象中。在ADO的早期版本中,只能將記錄集存為物理文件,而ADO 2.5版本能夠直接將其存為流。這個ASP頁面的結(jié)果就是XML格式的記錄集。下一章將研究關(guān)于流和XML數(shù)據(jù)的所有主題。
使用URL屬性優(yōu)于使用Connect和SQL屬性,其最大優(yōu)點是:在用戶可以看到的網(wǎng)頁中不會出現(xiàn)連接的細節(jié)??紤]下面的對象定義:
<OBJECT CLASSID="clsid: BD96C556-65A3-11D0-983A-00C04FC29E33"
ID="dsoAuthors" WIDTH="0" HIGHT="0">
<PARAM NAME="Connect" VALUE="DSN=pubs">
<PARAM NAME="Server" VALUE="W2000">
<PARAM NAME="SQL" VALUE="SELECT * FROM Authors">
</OBJECT>
第一行顯示了連接的細節(jié)。此時能夠看到DSN為pubs,并且我們選擇了authors表的全部列。這無疑為電腦黑客進入Web站點提供了潛在的路徑,因為他們知道了服務(wù)器的名稱以及數(shù)據(jù)庫的一些細節(jié)。現(xiàn)在,考慮一下使用URL屬性的情況:
<OBJECT CLASSID="clsid: BD96C556-65A3-11D0-983A-00C04FC29E33"
ID="dsoAuthors" WIDTH="0" HIGHT="0">
<PARAM NAME="URL" VALUE="DataPage.asp">
</OBJECT>
現(xiàn)在,用戶所見到的是一個ASP網(wǎng)頁的URL地址,沒有任何有關(guān)服務(wù)器和數(shù)據(jù)庫的詳細信息。
使用CONNECT/SQL屬性的方法,用戶可以清楚地見到連接的細節(jié),而使用URL所見的卻是數(shù)據(jù)。從這一點上來說,消除了一個安全問題。
在腳本中設(shè)置RDS數(shù)據(jù)控件的屬性時,必須使用Refesh方法,如下所示:
<SCRIPT LANGUAGE=JScript>
function window.onload()
{
dsoAuthors.URL="DataPage.asp";
dosAuthors.Refresh();
}
</SCRIPT>
這將強迫數(shù)據(jù)控件使用新的屬性值,并重新從數(shù)據(jù)提供者那里檢索數(shù)據(jù)。除了Refresh方法外,RDS數(shù)據(jù)控件還有許多其他方法,如表10-3所示:
表10-3 RDS數(shù)據(jù)控件的方法及說明
方 法
說 明
Cancel
取消任何異步操作
CancelUpdate
取消對數(shù)據(jù)的任何修改
CreateRecordset
創(chuàng)建一個空的記錄集,這允許在本地創(chuàng)建新的數(shù)據(jù)集
MoveFirst
移到第一條記錄
MoveLast
移到最后一條記錄
MoveNext
移到下一條記錄
MovePrevious
移到上一條記錄
Refresh
更新來自數(shù)據(jù)存儲的數(shù)據(jù)
Reset
應(yīng)用過濾或排序條件
SubmitChanges
將所有未解決的修改送回數(shù)據(jù)存儲
在本章后面,會見到大多數(shù)方法的使用情況。
3. MSHTML數(shù)據(jù)控件
微軟HTML(MSHTML)數(shù)據(jù)控件比較特別的地方在于:MSHTML是IE的一個組成部分,并能提供一個基于HTML文檔的數(shù)據(jù)源。雖然本質(zhì)上MSHTML并不是為數(shù)據(jù)存儲使用的一種格式,但如果確實有許多包含某些數(shù)據(jù)格式的HTML網(wǎng)頁,MSHTML可能會變得較為有用。
使用這個控件的代碼如下所示:
<OBJECT ID="dsoAuthors" DATA="Authors.html" HIGHT="0" WIDTH="0">
</OBJECT>
為了能使用這個控件,必須為HTML標記指定ID屬性,因為正是ID屬性確定了字段的名稱。例如:
<DIV ID="au_id">172-32-1176</DIV>
<SPAN ID="au_lname">White</SPAN>
<H1 ID="au_fname">Bob</H1>
<PRE ID="au_id">213-46-8915</PRE>
<H2 ID="au_lname">Green</H2>
<H1 ID="au_fname">Cheryl</H1>
讀者會注意到這看起來不太漂亮。是的,但正是這樣才可以說明HTML標記的名稱是無關(guān)緊要的,ID才是重要的。使用MSHTML DSO解析時,上面的HTML腳本將會產(chǎn)生兩行數(shù)據(jù),每一行有三個字段。最后會得到類似于表10-4的數(shù)據(jù):
表10-4 HTML腳本產(chǎn)生的數(shù)據(jù)
au_id
au_lname
au_fname
172-32-1176
White
Bob
213-46-8915
Green
Cheryl
字段是由ID屬性確定的。如果一個標記的ID與現(xiàn)有的ID相同,那么這個標記的數(shù)據(jù)將成為新的一行,否則在相同的行中創(chuàng)建一個新的字段。
與已經(jīng)討論過的數(shù)據(jù)控件類似,MSHTML數(shù)據(jù)控件有一個Recordset屬性,這也是該控件的唯一的一個屬性。MSHTML數(shù)據(jù)控件沒有方法。
4. XML數(shù)據(jù)控件
我們已經(jīng)知道了一種將XML數(shù)據(jù)放入RDS控件的方法,即使用RDS數(shù)據(jù)控件和URL屬性從ASP文件中獲取XML數(shù)據(jù)。另外一種方法是使用XML Data Island(XML數(shù)據(jù)島),這需要使用XML標記。在這里簡要地提一下這個問題,因為在下一章會討論處理XML數(shù)據(jù)的細節(jié)。
<XML>標記是一個與數(shù)據(jù)控件功能相似的瀏覽器HTML標記。在許多情況下與使用一個RDS數(shù)據(jù)控件類似,但該標記是為處理XML數(shù)據(jù)而特別設(shè)計的。使用的方式有二種。
第一種是使用SRC屬性來指定數(shù)據(jù)的位置。
<XML ID="dsoAuthors" SRC="Authors.xml"></XML>
這表示使用文件Authors.xml作為數(shù)據(jù)源。
另外,也可在標記中嵌入XML。
<XML ID="dsoAuthors">
<Authors>
<Author>
<au_id>172-32-1176</au_id>
<au_lname>White</au_lname>
<au_fname>Johnson</au_fname>
<phone>408 496-7223</phone>
<contract>True</contract>
</Author>
<Author>
<au_id>213-46-8915</au_id>
<au_lname>Green</au_lname>
<au_fname>Marjorie</au_fname>
<phone>415 986-7020</phone>
<contract>True</contract>
</Author>
</Authors>
</XML>
我們將在下一章詳細討論XML數(shù)據(jù)控件。
10.2.5 數(shù)據(jù)綁定
迄今為止,已經(jīng)可以用幾個不同的RDS數(shù)據(jù)控件將數(shù)據(jù)送到客戶端,但還沒有介紹當數(shù)據(jù)到達客戶端后,如何處理數(shù)據(jù)。實際上,這些數(shù)據(jù)控件負責的是數(shù)據(jù)的存儲及管理,并不真正地顯示數(shù)據(jù)。因此,問題在于如何將數(shù)據(jù)從數(shù)據(jù)控件中取出,并將其提供給HTML元素,使用戶能夠見到數(shù)據(jù)。
使用客戶端數(shù)據(jù)最簡單的方法是將數(shù)據(jù)與HTML標記綁定。綁定就是在HTML元素和數(shù)據(jù)控件之間建立一種聯(lián)系。數(shù)據(jù)控件主要負責管理數(shù)據(jù),并為HTML元素提供數(shù)據(jù),而HTML元素則將數(shù)據(jù)顯示在屏幕上。
為了將數(shù)據(jù)源與HTML元素綁定,需要設(shè)置兩個屬性:
· DATASRC,確定包含數(shù)據(jù)的數(shù)據(jù)控件。在數(shù)據(jù)源名稱前總是要加一個“#”。
· DATAFLD,確定綁定數(shù)據(jù)控件中的哪個字段。這些字段是數(shù)據(jù)控件管理的數(shù)據(jù)中的列名。因此對于一個數(shù)據(jù)庫,就是表中的列名。
例如:
<OBJECT CLASSID="clsid: BD96C556-65A3-11D0-983A-00C04FC29E33"
ID="dsoAuthors" WIDTH="0" HIGHT="0">
<PARAM NAME="URL" VALUE="DataPage.asp">
</OBJECT>
<DIV DATASRC="#dsoAuthors" DATAFLD="au_fname"></DIV>
<DIV DATASCR="#dosAuthors" DATAFLD="au_lname"></DIV>
這里,dsoAuthors是一個標準的RDS數(shù)據(jù)控件。我們創(chuàng)建了兩個DIV元素,并通過設(shè)置屬性DATASRC指向先前定義的數(shù)據(jù)控件。然后設(shè)置屬性DATAFLD為字段名,在本例中為au_fname和au_lname。這就是數(shù)據(jù)綁定的全部過程。其結(jié)果如圖10-2所示:
圖10-2 數(shù)據(jù)綁定結(jié)果
需要記住一個重要事情是文本輸出(Johnson和White)根本沒有在HTML腳本中出現(xiàn)。實際上HTML只由以上顯示的內(nèi)容組成。
因此,數(shù)據(jù)綁定就是數(shù)據(jù)控件管理遠程數(shù)據(jù)源的數(shù)據(jù),同時HTML元素使用該數(shù)據(jù)并將其顯示在屏幕上的能力。
除此之外,HTML元素還有第三個屬性:DATAFORMATAS,可以是HTML或TEXT,表示如何格式化字段中的數(shù)據(jù)。缺省為TEXT,但如果需要HTML格式的數(shù)據(jù),可以通過數(shù)據(jù)綁定將其格式化,例如下面的文本文件。
Description,Image
The main Wrox logo,<IMG SRC="logos/WroxLogo.gif">
The Wrox Conferences logo,<IMG SRC="logos/WroxConferencesLogo.gif">
The ASPToday logo,<IMG SRC="logos/ASPTodayLogo.gif">
這是TDC的源文件,并且包含兩個字段,第一個是說明,第二個是顯示某些圖像的HTML文本。現(xiàn)在把它和一個HTML表格進行綁定。
<TABLE ID="tblData" DATASRC="#dsoLogos">
<THEAD>
<TR>
<TD>Description</TD>
<TD>Image</TD>
</TR>
</THEAD>
<TBODY>
<TR>
<TD><SPAN DATAFLD="Description"></SPAN></TD>
<TD><SPAN DATAFLD="Image"></SPAN></TD>
</TR>
</TBODY>
</TABLE>
這里不必為數(shù)據(jù)綁定擔心,本例介紹的是表格數(shù)據(jù)綁定,下面將詳細討論這方面的內(nèi)容。在這里使用是因為能較好地說明格式化數(shù)據(jù)。
在瀏覽器中打開它,將會看到圖10-3所示的結(jié)果:
圖10-3 綁定數(shù)據(jù)的格式化
可以看到數(shù)據(jù)文件中的三行數(shù)據(jù)全部顯示在瀏覽器中,但是HTML作為文本顯示。為了見到HTML格式的數(shù)據(jù),需要使用屬性DATAFORMATAS。
<TD><SPAN DATAFLD="Description"></SPAN></TD>
<TD><SPAN DATAFLD="Image" DATAFORMATAS="HTML"></SPAN></TD>
此時在瀏覽器打開它,會得到一個效果較好的HTML頁面,如圖10-4所示:
圖10-4 綁定數(shù)據(jù)HTML格式化
將第二個字段格式化為HTML文檔,這一事實說明了字段任何HTML標記都可以解釋成為HTML文檔。因此,IMG標記變?yōu)檎嬲膱D像,而源文件中并不包含任何IMG標記,只有綁定的數(shù)據(jù)。
可以為任一數(shù)據(jù)源中的字段使用這種格式,任何HTML標記都會被解釋。這對于那些允許用戶輸入格式化文本的情形是比較有利的。
1. 支持數(shù)據(jù)綁定的元素
在上面的例子,使用了<SPAN>、<DIV>和<TABLE>標記來綁定數(shù)據(jù),但并不是所有的HTML元素都支持數(shù)據(jù)綁定。表10-5詳細列舉了這些元素,表中列是:
· HTML元素定義支持數(shù)據(jù)綁定的元素。
· 綁定屬性定義綁定到數(shù)據(jù)的HTML元素的屬性。例如上面的DIV標記,綁定的數(shù)據(jù)就放在innerText屬性中。如果使用A標記,并將其綁定到一個字段,那么數(shù)據(jù)將會放在href屬性中。
· 可否更新數(shù)據(jù)指出元素中的綁定數(shù)據(jù)是否能被更新。
· 可否表格綁定指出該元素是否允許綁定子元素。稍后會討論這個內(nèi)容。· 可否作為HTML顯示指出數(shù)據(jù)是否能格式化為HTML文檔。