国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

如何制作無(wú)狀態(tài)的ASP組件

2019-11-18 20:32:44
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
  一般我們?cè)趙eb或其它有關(guān)的無(wú)狀態(tài)應(yīng)用中使用組件時(shí),腳本運(yùn)行完畢后我們都會(huì)丟失組件的所有參照。當(dāng)然可以簡(jiǎn)單地將組件的參照保存在會(huì)話(session )變量中,但這浪費(fèi)資源。更聰明的方法是用會(huì)話變量或隱式表單標(biāo)簽保存組件的一些信息。當(dāng)重新制作組件的實(shí)例時(shí),試圖用保存在會(huì)話變量中的信息恢復(fù)組件的狀態(tài)。但兩種方法的弊端都在于:從資源的角度來(lái)看過(guò)于昂貴,甚至恰好難以實(shí)現(xiàn)。

  很幸運(yùn)有個(gè)好消息。我們都知道可持續(xù)性的整個(gè)前提是能夠?qū)⒆兞炕謴?fù)到這樣的狀態(tài),以至于組件知道在上次的例示中它在哪。這有助于組件現(xiàn)在去做它假定要做的。這個(gè)方案的一個(gè)典型例子是網(wǎng)頁(yè)上資料的翻頁(yè)。當(dāng)用戶點(diǎn)擊Page Down時(shí),我們需要知道我們?cè)谇耙豁?yè)的位置。 不把變量保存在內(nèi)存中(如會(huì)話變量),如果我們能將它們保存在文件中,等以后需要時(shí)檢索不是會(huì)很好嗎?用基礎(chǔ)的數(shù)據(jù)形式(字符串與數(shù)字)保存數(shù)據(jù)很容易。用對(duì)象和數(shù)組會(huì)怎樣呢?對(duì)象和數(shù)組本質(zhì)上是存儲(chǔ)器中的二進(jìn)制數(shù)據(jù)流。如果我們能讀這個(gè)數(shù)據(jù)我們就能將它寫進(jìn)文件以便以后的檢索。關(guān)于對(duì)象有個(gè)好注意。盡管數(shù)組的情況不同。首先你不能用數(shù)組做組件的屬性(VB6.0)。你可以用他們做變量,但以后你會(huì)碰到路障。幸運(yùn)地是我們?yōu)檫@種情況發(fā)現(xiàn)了一個(gè)工作區(qū)。

  你可以將所有或部分屬性保存在一個(gè)PRopertyBag對(duì)象中。PropertyBag對(duì)象控制在一個(gè)對(duì)象調(diào)用過(guò)程中可以保存和恢復(fù)的信息。PropertyBag對(duì)象的內(nèi)容(Content)屬性提供你任何存在組中的二進(jìn)制數(shù)據(jù)流。由你來(lái)將這些二進(jìn)制數(shù)據(jù)流寫進(jìn)文件中以便日后的檢索。

實(shí)例:

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

以下是這個(gè)類模塊的代碼:

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


在客戶應(yīng)用中保存屬性

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

  先別激動(dòng),你在自己的應(yīng)用中運(yùn)行這個(gè)酷件之前,必須了解它的局限性。用于保存的時(shí)間取決于屬性的大小和數(shù)據(jù)類型。注意大部分時(shí)間用在ReadProperty 和 WriteProperty 中。原因很簡(jiǎn)單,當(dāng)我們處理象ADO記錄集這樣的結(jié)構(gòu)型數(shù)據(jù)時(shí),過(guò)程可不象拷貝字節(jié)流那樣簡(jiǎn)單。數(shù)據(jù)也得被解釋。

保存記錄集時(shí)我觀察到以下情況:

1、保存100,000行每列有25個(gè)字符的記錄集用了50秒。
2、檢索同樣的數(shù)據(jù)用了20秒。

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

選擇使用數(shù)組

  持續(xù)的ADO記錄集為在你的應(yīng)用中使用數(shù)組提供了一個(gè)好方法。想想,如果你使用起來(lái)你就有所有ADO的簡(jiǎn)便方法可以使用,象FIND,SORT,F(xiàn)ILTER等等。實(shí)際上,如果你觀察仔細(xì),會(huì)發(fā)現(xiàn)我們?cè)谏鲜鰧?shí)例中用持續(xù)的記錄集實(shí)現(xiàn)了職工記錄的數(shù)組。純理論化的人可能會(huì)反對(duì),因?yàn)槟悴坏貌辉谀愕脑O(shè)計(jì)中包含ADO,而這將增加你分布磁盤的大量存儲(chǔ)。

小結(jié)

  在Web類的無(wú)狀態(tài)應(yīng)用中組件的可持續(xù)性是非常重要的功能。使用PropertyBag對(duì)象保存和檢索屬性。對(duì)于記錄集對(duì)象分別使用ADO的Save和Open方法保存和檢索數(shù)據(jù)。將上述例子作為摸板,給每一個(gè)實(shí)例加上變量文件名就可以制作你自己的組件。 
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 长阳| 那坡县| 大名县| 普定县| 枣强县| 蒙城县| 泽普县| 海宁市| 磐安县| 常州市| 盱眙县| 麻城市| 西丰县| 鹤岗市| 清远市| 方正县| 栾城县| 剑阁县| 蛟河市| 疏勒县| 怀柔区| 大石桥市| 来凤县| 米脂县| 犍为县| 泾阳县| 寿阳县| 肇东市| 榆中县| 响水县| 信丰县| 白河县| 金堂县| 泰顺县| 永靖县| 弋阳县| 独山县| 山西省| 阜新市| 承德市| 苗栗县|