非數據庫實現數據對象的實例及說明
本文提供給大家學習分享的是關于ASP中非數據庫實現數據對象的實例及說明,希望能給大家帶來幫助或啟發。
有些時候,在資源有限及功能簡單的情況下,利用文件管理本身就能很好的實現一個系統,又何必非用數據庫不可呢?
好的,開說ASP程序,ASP程序強大的原因主要在于COM對象的擴展,所以在一陣的頭腦風暴后,打起了一套組合拳:Scripting.FileSystemObject,Scripting.Dictionary以及Msxml2.DOMDocument.4.0。
下面就以文件管理程序為例,對實現做簡要說明:
首先,是構思。
1. 管理的數據對象是文件對象,而文件對象可以對應到XML中的某個結點
2. 文件對象的結構,可以自行定義
3. 文件對象的增加、刪除、修改以及查詢
XML中充分利用Xpath,實現查詢比較簡單,所以構思后問題主要應該歸結為XML結點的增刪改的問題,以及對象結構的定義。增刪改不必多說,關鍵是對象結構的自定義(在面向對象中就是類的聲明)。
接下來,是實現。
一是結構文件
這里結構包括:英文名字,中文顯示名,類型,顯示模版(或參照),默認值等
其實就是類似schema的東西,然后把這些結構保存在一個文件中,很多操作時就可以在循環中自動處理了,比如顯示一個文件時,就可以按照這個結構來顯示所有屬性字段。
如下為一個結構文件documentx.dna的示范內容:
*/DOCS=文件
*/DOCS/@VERSION=版本%%STRING%%[NUM].[NUM].[NUM].[NUM]%%1.0.0.0
*/DOCS/DOC=文件
+/DOCS/DOC/@ID=標識%%STRING%%%%=UniqueID()
+/DOCS/DOC/@HOT=人氣%%NUM%%%%0
/DOCS/DOC/TITLE=標題
/DOCS/DOC/DEPARTFROM=來文單位%%DICTIONARY%%department%%
/DOCS/DOC/@DONE=是否處理完畢%%BOOL%%%%
需要說明的是英文名稱采用Xpath的方式,是為了方便XML處理。
英文名稱前加*號表示為系統字段,同時也是非文件對象的屬性字段
英文名稱前加+表示該字段對用戶來說是只讀的,其值由系統指定。
另外前加*或者加+號也好,也有防止誤刪的原因,因為*號或+號是不會顯示給用戶的。
用=號分隔英文名稱與其他部分,而其他部分中用%%分隔,依次為中文顯示名,該項類型,顯示模版(或參照),默認值。
需要說明的是類型,如果類型為DICTIONARY的話,顯示模版(或參照)或參照的為具體的DICTIONARY文件,DICTIONARY的保存形式,形同Delphi中TstringList的保存形式,用=號把關鍵字與值分隔:
CS1=測試單位1
CS2=測試單位2
二是利用新建一個文件,說明顯示的問題
先看示范文件:
<% @LANGUAGE=VBSCRIPT %>
<%
Dim sKey, sValue, Sign, Pos, AttrID, Values, F, FName, Count
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta http-equiv="Content-Language" content="zh-cn">
</head>
<body>
<form method="POST" action="Documents!Save.asp">
<table border="0" width="100%" cellpadding="0" style="border-collapse: collapse">
<tr>
<td bgcolor="#C0C0C0"><b>新建</b></td>
</tr>
<tr>
<td>
<table border="1" width="100%" cellspacing="0" cellpadding="0" style="border-collapse: collapse" bordercolor="#000000">
<tr>
<td width="10%">項</td>
<td>值</td>
</tr>
<%
'Count = 0
'DOCUMENTX為Scripting.Dictionary對象,為documentx.dna的內容
For Each sKey In DOCUMENTX
Sign = Left(sKey, 1)
If Sign<>"*" Then
sValue = DOCUMENTX.Item(sKey)
Values = Split(sValue & "%%%%%%", "%%")
Pos = InStrRev(sKey, "/")
AttrID = Right(sKey, Len(sKey) - Pos)
If Left(AttrID,1)="@" Then
AttrID = Mid(AttrID, 2) & "_INLINE" '也就是說@為一般為內置屬性
End If
AttrID = "ATTR_" & AttrID
%>
<tr>
<td width="10%"><%=Values(0)%></td>
<td>