程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> ASP編程 >> ASP入門教程 >> ASP 3.0高級編程(四十四)

ASP 3.0高級編程(四十四)

編輯:ASP入門教程
第10章 ASP與客戶端數據

在一本ASP專著中討論客戶端數據,這與服務器端的ASP編程是否矛盾?情況並非如此,因為我們至今尚未碰到只從事服務器端編程的ASP程序員。雖然ASP是一項服務器端技術,但可以想象,編程人員不可能僅僅使用ASP進行編程。從事ASP編程的web開發人員,仍然需要與客戶端數據進行交互。
因此,圍繞著ASP構建一個應用程序時必須考慮整個應用程序的情況,這也意味著必須考慮客戶端。為了獲得一個運行良好、快速響應的應用程序,需要很好地使用客戶端數據。
本章將討論如何在客戶端使用數據。特別將著重研究:
· 遠程數據服務(Remote Data Services,RDS),如何向客戶端傳送數據以及客戶端接收數據。
· 如何將ADO記錄集綁定到Html控件。
· 如何利用用戶自定義組件提供數據。
· 如何更新客戶端數據,並將其反饋到服務器。
· 如何從數據庫中獲取圖像並將其顯示在Web頁面中。
· 如何創建基於表格的Web頁面。
以上覆蓋的范圍相當廣泛,同時有很多不同的方法可以取得相同的結果,但實際上實現起來並不是特別困難。

10.1 斷開連接的記錄集
首先需要掌握的是“斷開連接的數據”的概念。迄今為止,在研究ADO的過程中,已經學習了獲取記錄集的方法,以及如何修改這些記錄集中的數據。回顧一下,我們打開一個記錄集,對數據做一些修改,然後再關閉這個記錄集,在操作記錄集的過程中,始終與服務器保持著連接。這是相當明顯的,但別忘了Web在本質上是無狀態的。如果想使用客戶端數據,如何始終保持與服務器的連接?很簡單,這是不可能實現的,這也是定義斷開連接的記錄集概念的緣由。
一個斷開連接的記錄集只是一個普通的記錄集,但解除了與服務器的連接,成為孤立的對象,可以像普通的記錄集那樣對其執行更新、增加和刪除操作。但這些變化只發生在記錄集內部,並不反饋到服務器,因為記錄集與服務器已不再保持著連接。這並不是缺點,因為可以與服務器重新建立連接,同時服務器可以對任何修改進行更新。即使服務器端的數據已經改變了,ADO仍然有方法讓用戶及時發現這些變化,這樣用戶就能決定哪些數據是正確的。這稱為沖突處理(conflict resolution)。
斷開連接的記錄集使我們能在組件之間,包括服務器與客戶之間,傳送具有全部功能的記錄集。本章後面將探討如何在組件內創建斷開連接的記錄集。但這裡不准備對此做過於詳細的研究,因為本書第13章至第18章已經覆蓋這部分內容,這裡僅做簡單的介紹,以便於了解組件是如何與遠程數據服務交互的。

10.2 遠程數據服務
遠程數據服務(Remote Data Services,RDS)是允許我們處理客戶端數據的一系列服務的統稱。現在不用擔心這方面的問題,因為RDS本身就是ADO的一部分,只有在需要傳送和使用客戶端數據時,才會使用。實際上RDS是由幾個組件構成的。圖10-1說明了這些組件以及它們之間是如何協同工作的。 
圖10-1  RDS的組件構成
組件似乎很多,但並不是所有的組件在每種情形下都被使用,實際上有一些不是RDS的一部分。然而這裡還是把所有可能出現的組件都放在了圖上,以備需要時查看。圖10-1分成了兩部分,因為使用客戶端數據需要一些向客戶端傳送數據的方法,同時數據一旦到達客戶端,也需要一些管理數據的方法。我們先從服務器端開始。

10.2.1 RDS服務器組件
雖然RDS用於傳送和訪問客戶端數據,但其確實有一些基於服務器的組件。這是必需的,因為肯定需要某種方式將數據傳送到客戶端。因此有了一系列能訪問數據並允許發送數據到客戶端的服務器組件。我們把實際的數據傳送稱為調度(marshal)。
服務器端組件圖的最上端是數據存儲,由OLE DB提供者訪問。它並不是RDS的一部分,但這表示只要有相應的OLE DB提供者,就可以通過RDS在客戶端使用任何數據。至於如何處理服務器上的數據,可以有兩種選擇:
· 數據工廠(DataFactory)是缺省的用於訪問數據存儲的服務器端組件。它作為服務器端RDS組件的一部分安裝在計算機上,除了能從數據存儲中獲取數據外,還為服務器處理發送到客戶端以及從客戶端發送來的數據。
· 自定義組件只是一個普通的提供了數據傳送方法的COM組件。當數據工廠不能提供所需的功能時,可以使用自定義組件。本章將介紹一個簡單的組件例子,在本書的後面還有一個更復雜的例子。
Web服務器使用這兩種組件作為客戶和服務器數據的接口。

10.2.2 RDS客戶組件
在客戶端先從底端的DataSpace對象開始,該對象作為客戶端的一部分與數據工廠或自定義對象協同工作。DataSpace對象是一個代理對象,負責與服務器進行通信,同時也是數據傳輸的通道(或者通常所說的調度)。DatASPace對象是用客戶端腳本語言或用Html語言中的<OBJECT>標記創建的COM對象。在本章後面會看到關於這方面的例子。
DataSpace對象上面是數據源對象(Data Source Object,DSO),負責存儲客戶端數據。一個數據源對象包含一個ADO數據記錄集,與客戶數據緩存共同管理數據。客戶數據緩存只是一種管理客戶端數據的客戶光標服務。同時數據源對象又是一個COM對象,與DatASPace對象類似,也可以通過客戶端腳本或使用Html語言中的<OBJECT>標記來創建。同樣,在本章稍後也會介紹關於這方面的一些例子。
數據源對象的上面是數據綁定管理器,任務是建立HTML控件與數據源對象的連接。這就是我們所知道的綁定,可以通過設置某些Html控件的DATASRC和DATAFLD屬性來實現。下面將對這些內容進行討論,並示范如何在浏覽器中方便地使用數據。

10.2.3 支持RDS的浏覽器
要知道RDS是微軟的技術,因此只能在微軟的浏覽器上工作。實際上,只有在IE 4.0或更高版本的浏覽器中才完全支持RDS。
當編寫依賴於RDS的應用程序時,需要注意訪問應用程序的客戶的RDS版本可能與服務器端有所不同。舉例來說,IE 4中的是RDS 1.5版本,而IE 5、Office 2000和Visual Studio 6中的則是RDS 2.0版本。有兩種方法可以處理這種兼容性問題:
· 確保所有用戶已經升級到RDS的最新版本。如果客戶運行的是Windows 2000,那麼已經在運行最新版本的RDS了。否則,可以從網址www.microsoft.com/data處下載。RDS 2.5版本是目前最新的隨同Windows 2000一起發布的版本,同時也是一個可單獨下載的軟件包。
· 當連接到數據源時,指定數據工廠的模式。這可以指定使用的是哪一個版本的RDS組件,後面將介紹這方面的一個例子。

10.2.4 數據源對象
數據源對象是一個存儲和管理客戶端數據的客戶端對象。因為這是使用RDS最簡單的一種方式,首先研究一下這些對象。
這裡有幾個不同的數據源對象,每一個都針對不同類型的數據:
· 表格數據控件(Tabular Data Control,TDC),用於處理表格形式或分隔形式的文本文件。
· RDS數據控件,用於連接OLE DB數據存儲,能夠指定連接到哪個數據存儲,以及返回哪些數據。
· Java數據庫連接器,這是一個通過Java數據庫控件(Java DataBase Control,JDBC)連接到數據存儲的Java小程序。這裡我們不想討論JDBC,因為它並不提供其他控件無法實現的功能。
· 微軟的HTML(MSHTML)數據源對象用Html標記數據,並把它作為數據源。
· XML數據源對象使用XML數據,用於結構化的或任意結構的XML。
選用哪一種數據源對象取決於你想做什麼,以及數據從哪裡來。如果需要向客戶提供少量的數據,並且不允許用戶修改數據,那麼表格數據控件(TDC)可能會比較適合。這種數據源是一個文本文件,不需要任何數據庫,因此編輯起來比較簡單。對於從數據庫中取出數據並且可能需要更新的情況,RDS數據控件是最合適的。而對於許多新數據源,會發現此時需要使用XML數據控件。這實際依賴於所使用的Web應用程序的類型,以及用戶所需的功能。
我們將依次介紹這些數據控件,一旦了解了如何用它們把數據傳送到客戶端,將會介紹如何使用這些數據。
1.  表格數據控件
表格數據控件(Tabular Data Control,TDC)是最簡單的數據源對象,主要用於少量的只讀數據,特別是那些從不改變或很少修改的,不需要從客戶端進行更新的靜態數據。例如,表格數據控件能提供一個網頁內的菜單項或鏈接的列表。
通過在Html代碼中使用<OBJECT>標記可以創建一個表格數據控件。參數DataURL可以指定包含文本數據的文件名。
<OBJECT CLASSID="clsid:333C7BC4-460F-11D0-BC04-0080C7055A83"
              ID="dsoAuthors" WIDTH="0" HEIGHT="0">
   <PARAM NAME="DataURL" VALUE="Authors.csv">
</OBJECT>
TDC只讀取表格中的數據或標記為表格形式的數據,例如,可以處理逗號分隔形式的數據(Comma Separated Value, CSV),類似於下面的數據:
"172-32-1176","White","Bob","408 496-7223"
"219-46-8915","Green","MarjorIE","415 986-7020"
"238-95-7766","Carson","Cheryl","415 548-7723"
"267-41-2394","O'Leary","Michael","408 286-2428"
"274-80-9391","Straight","Dean","415 834-2919"
"341-22-1782","Smith","Meander","913 843-0462"
"409-56-7008","Bennet","Abraham","415 658-9932"
TDC也可以自由定義。除了DataURL外,TDC還有16個參數,可以通過設置OBJECT標記的參數項或編寫腳本代碼來配置這些參數。參數的說明如表10-1所示:
表10-1  TDC的參數及說明
屬 性 
數據類型 
說 明 
缺 省 值 

AppendData 
布爾型 
確定新數據是替換還是追加到數據源對象中的現有數據 
False 

CaseSensitive 
布爾型 
指出字符串比較時是否大小寫敏感 
True 

CharSet 
字符型 
指出數據的字符集類型。附錄中字符集的列表 
Windows-1252 

DataURL 
字符型 
指出數據源文件的URL 


EscapeChar 
字符型 
指定源文件中使用的轉義字符。這些字符位於其他字符的前面以避免與FieldDelim、RomDelim或TextQualifIEr混淆 


FIEldDelim 
字符型 
指定字段之間的分隔字符 
,(逗號) 

Filter 
字符型 
設置過濾條件 


Filtercolumn 
字符型 
設置過濾的列 


FilterValue 
字符型 
設置過濾的列的值 


Language 
字符型 
指定數據文件使用的語言 
en-us(美國英語) 

ReadyState 
長整型 
指出控件的當前狀態。可以是以下值:adcReadyStateComplete(4)表明所有的數據都傳送完畢,或發生了一個錯誤
adcReadyStateInteractive(3)表明數據正在傳送中
adcReadyStateLoaded(2)表明控件已被加載並等待數據傳輸
這個屬性是只讀的 


RowDelim 
字符型 
指定文本文件中的行分隔符,缺省為回車符 
一個新行字符 

Sort 
字符型 
指出要排序的列的列表。列名前有減號表明是按降序排序,否則按升序排序 


SortDirection 
布爾型 
如果排序是升序則為True,降序則為False 


SortColumn 
字符型 
指定排序的列 


TextQualifIEr 
字符型 
指定封閉文本字段的字符,缺省為雙引號 
"(雙引號) 

UseHeader 
布爾型 
表明文本文件中首行是否包含列名 
False 

下面是使用參數創建TDC的一個例子。
<OBJECT CLASSID="clsid:333C7BC4-460F-11D0-BC04-0080C7055A83"
                     ID="dsoAuthors" WIDTH="0" HEIGHT="0">
   <PARAM NAME="DataURL" VALUE="Authors.csv">
</OBJECT>
也可以在客戶端腳本中獲取數據,下面的例子顯示了給TDC加載數據的JScript腳本。
function fillTDC()
{
       dsoAuthors.dataURL = 'authors.csv';
       dsoAuthors.Reset();
}
如果改變了TDC的DataURL參數,必須使用Reset方法,這樣才能使新的URL起作用。當介紹數據綁定時,會更詳細地討論如何使用它。Reset方法是TDC唯一的一個方法。
2.  RDS數據控件
RDS數據控件能夠訪問一般的數據存儲,而不是平面文件。它通常用於連接SQL數據庫以從表、查詢或存儲過程獲取數據。與TDC不同,RDS數據控件允許更新數據。在本章稍後通過示例說明如何進行數據更新。
類似於TDC,可以用Html腳本中的OBJECT標記來創建一個RDS數據控件,並以類似的方式設置其屬性。
<OBJECT CLASSID='clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
                     ID="dsoAuthors" WIDTH="0" HEIGHT="0">
       <PARAM NAME="Connect" VALUE="Connection String">
       <PARAM NAME="Server" VALUE="Server Name">
       <PARAM NAME="SQL" VALUE="Query Text">
</OBJECT>
同樣,注意定制數據控件時參數的使用方法。上面的例子顯示了最常見的設置方法。和TDC一樣,還有很多其他可以設置的參數,如表10-2所示:
表10-2  RDS數據控件的參數及說明
屬  性 
數據類型 
說 明 
缺 省 值 

Connect 
字符型 
一個標識數據存儲的ADO連續字符串 


ExecuteOptions 
長整型 
指出命令是異步執行還是同步執行。可以是以下值之一:
adcExecSync(1)同步執行(缺省值)
adcExecAsync(2)異步執行 
adExecAsync 

FetchOptions 
長整型 
獲取數據的方式,可以是以下值:
adcFetchUpFront(1)先取數據,然後將控制交給應用程序
adcFetchBackground(2)先立即取得第一批數據,剩余的數據在後台獲取
adcFetchAsync(3)在後台獲取所有的數據 
adcFetchAsync 

FilterColumn 
字符型 
指定被過濾的列 


FilterCriterion 
字符型 
指定過濾的條件。可以是以下運算符:
<(小於)
<=(小於等於)
=(等於)
>=(大於等於)
>(大於)
<>(不等於) 


FilterValue 
字符型 
過濾的值 


Handler 
字符型 
自定義的數據處理器的名稱和參數 
MSDFMAP.Handler 

InternetTimeout 
長整型 
在錯誤發生前等待的時間(毫秒為單位) 
300000 

ReadyState 
長整型 
控件的當前狀態,可以是以下值:
adcReadyStateComplete(4)表明所有的數據都傳送完畢,或發生了一個錯誤
adcReadyStateInteractive(3)表明數據仍然在傳送中
adcReadyStateLoaded(2)表明控件已被加載並等待數據傳輸 


Recordset 
記錄集型 
數據控件訪問的ADO數據記錄集。該參數只讀 


Server 
字符型 
數據所在的服務器的名稱。為了安全,必須與提供Web頁面的服務器同名。可以是一個標准URL,也可以是機器名稱(如果使用DCOM) 


SortColumn 
字符型 
排序的列名 


SortDirection 
布爾型 
表明排序是否為升序 


SourceRecordset 
字符型 
將控件的基礎記錄集設置為一個現有的記錄集。該屬性只寫 


SQL 
字符型 
獲取數據的SQL字符串 


URL 
字符型 
數據源的URL 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved