如何製作無狀態的ASP組件

來源:互聯網
上載者:User
2000-08-05· 青苹果電腦工作室·Yesky

  一般我們在web或其它有關的無狀態應用中使用組件時,指令碼運行完畢後我們都會丟失組件的所有參照。當然可以簡單地將組件的參照儲存在會話(session )變數中,但這浪費資源。更聰明的方法是用會話變數或隱式表單標籤儲存組件的一些資訊。當重新製作組件的執行個體時,試圖用儲存在會話變數中的資訊恢複組件的狀態。但兩種方法的弊端都在於:從資源的角度來看過於昂貴,甚至恰好難以實現。

  很幸運有個好訊息。我們都知道可持久性的整個前提是能夠將變數恢複到這樣的狀態,以至於組件知道在上次的例示中它在哪。這有助於組件現在去做它假定要做的。這個方案的一個典型例子是網頁上資料的翻頁。當使用者點擊Page Down時,我們需要知道我們在前一頁的位置。 不把變數儲存在記憶體中(如會話變數),如果我們能將它們儲存在檔案中,等以後需要時檢索不是會很好嗎?用基礎的資料形式(字串與數字)儲存資料很容易。用對象和數組會怎樣呢?對象和數組本質上是儲存空間中的位元據流。如果我們能讀這個資料我們就能將它寫進檔案以便以後的檢索。關於對象有個好注意。儘管數組的情況不同。首先你不能用數組做組件的屬性(VB6.0)。你可以用他們做變數,但以後你會碰到路障。幸運地是我們為這種情況發現了一個工作區。

  你可以將所有或部分屬性儲存在一個PropertyBag對象中。PropertyBag對象控制在一個對象調用過程中可以儲存和恢複的資訊。PropertyBag對象的內容(Content)屬性提供你任何存在組中的位元據流。由你來將這些位元據流寫進檔案中以便日後的檢索。

執行個體:

比如你有一個類MyComp.clsMyDept,它有兩個屬性MyDepartment$ 和 MyEmployees (一個ADO記錄集對象)。

以下是這個類別模組的代碼:

Option Explicit
Option Compare Text

Public MyDepartment As String
Public MyEmployees As ADODB.Recordset

Dim objBag As New PropertyBag

Private Sub Class_InitProperties()
Set MyEmployees = New ADODB.Recordset
MyEmployees.Fields.Append "EmpName", adVarChar, 30
MyEmployees.Fields.Append "EmpSal", adCurrency
MyEmployees.Open
End Sub

Public Sub SaveMyProperties()
Dim intFile%, bytRec() As Byte
objBag.WriteProperty "MyDepartment", MyDepartment
objBag.WriteProperty "MyEmployees", MyEmployees
' Save this data in a file for later retrieval
intFile = FreeFile
If Dir("C:\MyData.txt", vbNormal) = "" Then
Else
Kill "C:\MyData.txt"
End If
Open "C:\MyData.txt" For Binary Access Write As #intFile
bytRec = objBag.Contents
Put #intFile, , bytRec
Close #intFile
End Sub

Public Sub RestoreMyProperties()
Dim intFile%, bytRec() As Byte
' Read the saved data from the file.
ReDim bytRec(FileLen("C:\MyData.txt"))
intFile = FreeFile
Open "C:\MyData.txt" For Binary Access Read As #intFile
Get #intFile, , bytRec
objBag.Contents = bytRec
Close #intFile
' PropertBag restored. Lets restore the properties now.
MyDepartment = objBag.ReadProperty("MyDepartment")
Set MyEmployees = objBag.ReadProperty("MyEmployees")
End Sub


在客戶應用中儲存屬性

Private Sub Command1_Click()
Dim objDept As New MyComp.clsMyDept
objDept.MyDepartment = "Research"
' Add one employee
objDept.MyEmployees.AddNew
objDept.MyEmployees!EmpName = "Harry"
objDept.MyEmployees!EmpSal = 2500
objDept.MyEmployees.Update
' Add second employee
objDept.MyEmployees.AddNew
objDept.MyEmployees!EmpName = "Potter"
objDept.MyEmployees!EmpSal = 3000
objDept.MyEmployees.Update
' Save the properties by calling the method from our component
objDept.SaveMyProperties
Set objDept = Nothing
End Sub


取回儲存的屬性

Private Sub Command2_Click()
Dim objDept As New MyComp.clsMyDept
' Restore properties by calling the method from our component
objDept.RestoreMyProperties
' Lets see what is restored
Debug.Print objDept.MyDepartment 'Will print Research

objDept.MyEmployees.MoveFirst
Debug.Print "" & objDept.MyEmployees!EmpName 'Will print Harry
objDept.MyEmployees.MoveNext
Debug.Print "" & objDept.MyEmployees!EmpName 'Will print Potter
Set objDept = Nothing
End Sub

  先別激動,你在自己的應用中運行這個酷件之前,必須瞭解它的局限性。用於儲存的時間取決於屬性的大小和資料類型。注意大部分時間用在ReadProperty 和 WriteProperty 中。原因很簡單,當我們處理象ADO記錄集這樣的結構型資料時,過程可不象拷貝位元組流那樣簡單。資料也得被解釋。

儲存記錄集時我觀察到以下情況:

1、儲存100,000行每列有25個字元的記錄集用了50秒。
2、檢索同樣的資料用了20秒。

  有個更好的方法儲存記錄集對象。他們有自己的Save方法。用Save方法儲存100,000個記錄集僅用了6秒。用Open方法檢索儲存的記錄集對象,從儲存的記錄集對象中檢索100,000行用了20秒(與PropertyBag方法的時間一樣)

選擇使用數組

  持續的ADO記錄集為在你的應用中使用數組提供了一個好方法。想想,如果你使用起來你就有所有ADO的簡便方法可以使用,象FIND,SORT,FILTER等等。實際上,如果你觀察仔細,會發現我們在上述執行個體中用持續的記錄集實現了職工記錄的數組。純理論化的人可能會反對,因為你不得不在你的設計中包含ADO,而這將增加你分布磁碟的大量儲存。

小結

  在Web類的無狀態應用中組件的可持久性是非常重要的功能。使用PropertyBag對象儲存和檢索屬性。對於記錄集對象分別使用ADO的Save和Open方法儲存和檢索資料。將上述例子作為摸板,給每一個執行個體加上變數檔案名稱就可以製作你自己的組件。



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。