<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      ASP 3.0高級編程(414)

      [摘要]第10章 ASP與客戶端數據在一本ASP專著中討論客戶端數據,這與服務器端的ASP編程是否矛盾?情況并非如此,因為我們至今尚未碰到只從事服務器端編程的ASP程序員。雖然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)是允許我們處理客戶端數據的一系列服務的統稱,F在不用擔心這方面的問題,因為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
      長整型
      指出控件的當前狀態?梢允且韵轮担篴dcReadyStateComplete(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





      日韩精品一区二区三区高清