當(dāng)前位置: 首頁IT技術(shù) → 非數(shù)據(jù)庫實現(xiàn)數(shù)據(jù)對象的實例及說明

非數(shù)據(jù)庫實現(xiàn)數(shù)據(jù)對象的實例及說明

更多

本文提供給大家學(xué)習(xí)分享的是關(guān)于ASP中非數(shù)據(jù)庫實現(xiàn)數(shù)據(jù)對象的實例及說明,希望能給大家?guī)韼椭騿l(fā)。

有些時候,在資源有限及功能簡單的情況下,利用文件管理本身就能很好的實現(xiàn)一個系統(tǒng),又何必非用數(shù)據(jù)庫不可呢?

  好的,開說ASP程序,ASP程序強大的原因主要在于COM對象的擴展,所以在一陣的頭腦風(fēng)暴后,打起了一套組合拳:Scripting.FileSystemObject,Scripting.Dictionary以及Msxml2.DOMDocument.4.0。

  下面就以文件管理程序為例,對實現(xiàn)做簡要說明:

  首先,是構(gòu)思。

  1. 管理的數(shù)據(jù)對象是文件對象,而文件對象可以對應(yīng)到XML中的某個結(jié)點

  2. 文件對象的結(jié)構(gòu),可以自行定義

  3. 文件對象的增加、刪除、修改以及查詢

  XML中充分利用Xpath,實現(xiàn)查詢比較簡單,所以構(gòu)思后問題主要應(yīng)該歸結(jié)為XML結(jié)點的增刪改的問題,以及對象結(jié)構(gòu)的定義。增刪改不必多說,關(guān)鍵是對象結(jié)構(gòu)的自定義(在面向?qū)ο笾芯褪穷惖穆暶鳎?/p>

  接下來,是實現(xiàn)。

  一是結(jié)構(gòu)文件

  這里結(jié)構(gòu)包括:英文名字,中文顯示名,類型,顯示模版(或參照),默認值等

  其實就是類似schema的東西,然后把這些結(jié)構(gòu)保存在一個文件中,很多操作時就可以在循環(huán)中自動處理了,比如顯示一個文件時,就可以按照這個結(jié)構(gòu)來顯示所有屬性字段。

  如下為一個結(jié)構(gòu)文件documentx.dna的示范內(nèi)容:

*/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處理。

英文名稱前加*號表示為系統(tǒng)字段,同時也是非文件對象的屬性字段

英文名稱前加+表示該字段對用戶來說是只讀的,其值由系統(tǒng)指定。

另外前加*或者加+號也好,也有防止誤刪的原因,因為*號或+號是不會顯示給用戶的。

用=號分隔英文名稱與其他部分,而其他部分中用%%分隔,依次為中文顯示名,該項類型,顯示模版(或參照),默認值。

  需要說明的是類型,如果類型為DICTIONARY的話,顯示模版(或參照)或參照的為具體的DICTIONARY文件,DICTIONARY的保存形式,形同Delphi中TstringList的保存形式,用=號把關(guān)鍵字與值分隔:

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的內(nèi)容

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"     '也就是說@為一般為內(nèi)置屬性

    End If

    AttrID = "ATTR_" & AttrID

%>

                     <tr>

                            <td width="10%"><%=Values(0)%></td>

                            <td>

<%

    If Sign="+" Then    '如果為只讀屬性

%>

<input type="hidden" name="<%=AttrID %>" value="" />系統(tǒng)計算:<%=Values(3) %>

<%

Else

  '按照類型進行顯示

      If Values(1)="BOOL" Then

        Response.Write "<input type=""checkbox"" name=""" & AttrID & """ value=""1"" />"

      Else

        If Values(1)="DICTIONARY" Then

          'ENVIRONMENT為Scripting.Dictionary對象

'ENVIRONMENT.Item(“ROOT”)中存儲了該程序管理的根目錄

          FName = ENVIRONMENT.Item("ROOT") & "\dictionary\" & Values(2) & ".dic"

%>

          <select name="<%=AttrID %>">

<%

          If FSO.FileExists(FName) Then

            Set F = FSO.OpenTextFile(FName, 1, False)

            Do While Not F.AtEndOfStream

              sValue = F.ReadLine

              Pos = InStr(sValue, "=")

              If Pos>0 Then

                Response.Write "<option value=""" & Left(sValue, Pos-1) & """>" & Right(sValue, Len(sValue)-Pos) & "</option>"

              End If

            Loop

            F.Close

          End If

%>

          </select>

<%

        Else

          Response.Write "<input type=""textbox"" name=""" & AttrID & """ size=""30"" />"

        End If

      End If

    End If

%>

                            </td>

                     </tr>

<%

    'Count = Count + 1

  End If

Next

%>

                     <tr>

                            <td width="10%"> </td>

                            <td> </td>

                     </tr>

                     <tr>

                            <td width="10%"> </td>

                            <td> </td>

                     </tr>

              </table>

              </td>

       </tr>

       <tr>

              <td bgcolor="#C0C0C0" align="right" valign="middle"><input type="submit" name="btnSave" value="保存" /> <input type="button" name="btnReset" value="重輸" /></td>

       </tr>

</table>

</form>

</body>

</html>

  三是利用代碼說明xml存儲的實現(xiàn)

<% @LANGUAGE=VBSCRIPT %>

<!-- #include file="System.inc.asp" -->

<!-- #include file="Document.inc.asp" -->

<%

'System.inc.asp中包含UniqueID()函數(shù)

'首先,獲取用戶客戶端提交的數(shù)據(jù)信息

Dim PostData

Set PostData = Server.CreateObject("Scripting.Dictionary")

Dim Values, Key, Value, AttrID, Pos, Sign

For Each Key In DOCUMENTX

  Sign = Left(Key, 1)

  If Sign<>"*" Then

    Value = DOCUMENTX.Item(Key)

    Values = Split(Value & "%%%%%%", "%%")

    Pos = InStrRev(Key, "/")

    AttrID = Mid(Key, Pos + 1)

    If Left(AttrID,1)="@" Then

      AttrID = Mid(AttrID, 2) & "_INLINE"     '也就是說@為一般為內(nèi)置屬性

    End If

    AttrID = "ATTR_" & AttrID

    If Sign="+" Then

      Key = Mid(Key, 2)

    End If

    'If Sign="+" Then    '系統(tǒng)屬性

    'End If

    PostData.Item(Key) = Request.Form(AttrID)   '取得用戶提交的數(shù)據(jù)

  End If

Next

'下面是把PostData中的數(shù)據(jù)存儲到XML中去

Dim oXml

Set oXml = Server.CreateObject("Msxml2.DOMDocument.4.0")

Dim TimeSpec, ZoneID, DocID, FName, FPath

'計算該文檔屬于的區(qū)域

'注意:創(chuàng)建新文檔與修改原有文檔的計算方式不同,這里只做了創(chuàng)建的處理

'新建文檔的處理

TimeSpec = Now

'ZoneID為YYYYMM形式

ZoneID = Right ("20" & Year(TimeSpec), 4) & Right("0" & Month(TimeSpec), 2)

FPath = ENVIRONMENT.Item("ROOT")

If Not FSO.FileExists(FPath & "\data\" & ZoneID & ".dat") Then

  If Not FSO.FileExists(FPath & "\etc\blank.dat") Then

    Application("*FAIL") = "系統(tǒng)配置不正確,空白數(shù)據(jù)模版文件未找到!"

    Set oXml = Nothing

    Set PostData = Nothing
    Response.Redirect "Fail.asp"
  End If
  FSO.CopyFile FPath & "\etc\blank.dat", FPath & "\data\" & ZoneID & ".dat"
End If
oXml.load FPath & "\data\" & ZoneID & ".dat"
'由于這里處理的是新建的情況,所以指定新的DocumentID
PostData.Item("/DOCS/DOC/@ID") = UniqueID()
PostData.Item("/DOCS/DOC/@HOT") = "0"
DocumentSaveToXml PostData, oXml
oXml.save FPath & "\data\" & ZoneID & ".dat"
Set oXml = Nothing
Set PostData = Nothing
Response.Write "OK!"
%>

  DocumentSaveToXml函數(shù)在Document.inc.asp中

<%
'DocumentSaveToXml
'目的:把Dict中的數(shù)據(jù)導(dǎo)入到指定的Xml對象中去
'說明:如果Dict中指定ID的數(shù)據(jù)已經(jīng)存在于Xml中,則替換原有數(shù)據(jù)
Function DocumentSaveToXml(ByRef Dict, ByRef oXml)
  DocumentSaveToXml = False
  If Dict Is Nothing Or oXml Is Nothing Then
    Exit Function
  End If
  Dim oXmlRoot, oXmlNode, oXmlSubNode
  Set oXmlRoot = oXml.documentElement
  Set oXmlNode = oXml.createElement("DOC")
  Dim Key, Value
  Dim Pos, AttrID, DocID
  For Each Key In Dict
    Value = Dict.Item(Key)
    '根據(jù)Key
    Pos = InStrRev(Key, "/")
    AttrID = Mid(Key, Pos + 1)
    If Left(AttrID, 1)="@" Then   '如果是屬性
      oXmlNode.setAttribute Mid(AttrID, 2), Value
    Else
      Set oXmlSubNode = oXml.createElement(AttrID)
      oXmlSubNode.text = Value
      oXmlNode.appendChild oXmlSubNode
    End If
  Next
 
  '別忘了,這里的ID屬性定義,在documentx.dna中前面加上了+號

  '也正是這些加*或者加+號屬性結(jié)構(gòu)不可以刪的原因

  DocID = oXmlNode.getAttribute("ID")
  Set oXmlSubNode = oXml.selectSingleNode("/DOCS/DOC[@ID=""" & DocID & """]")
  If oXmlSubNode Is Nothing Then
    oXmlRoot.appendChild oXmlNode
  Else
    oXmlRoot.replaceChild oXmlNode, oXmlSubNode
  End If
  DocumentSaveToXml = True
End Function
%>

熱門評論
最新評論
發(fā)表評論 查看所有評論(0)
昵稱:
表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
字數(shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)