使用经典ASP,是否有人知道是否可以(或建议)将字典对象数组放入应用程序对象?我尝试了但是在大约50,000次左右的点击下面的应用程序池中的脚本被损坏或者什么东西和“可陷阱”C0000005错误在这一行运行时生成:dictLanguage = Application(“lang”)
虽然工作正常几天。是否与我将应用程序对象分配给另一个变量的方式有关,我认为它会传递指针而不是副本?比我聪明的人都知道这里发生了什么?
if isempty(Application("lang")) then
''# called when first visitor hits the page (following server reboot or app pool recycle)
init()
dictLanguage=Application("lang")
else
''# called for all other page hits
dictLanguage=Application("lang") ''# ***** TRAPPABLE ERROR after a few thousand page views *******
end if
''# // fill the application object with an array containing 10 dictionary objects, each holding a different language.
''# // This function appears to run just fine.
function init
Set initcn = Server.CreateObject("ADODB.Connection")
initcn.Open dbConStr
strSQL = "SELECT languageNo,quickRef,text FROM tblTranslation"
Set rs = initcn.Execute(strSQL)
dim d(10)
Set d(1)=Server.CreateObject("Scripting.Dictionary")
Set d(2)=Server.CreateObject("Scripting.Dictionary")
Set d(3)=Server.CreateObject("Scripting.Dictionary")
Set d(4)=Server.CreateObject("Scripting.Dictionary")
Set d(5)=Server.CreateObject("Scripting.Dictionary")
Set d(6)=Server.CreateObject("Scripting.Dictionary")
Set d(7)=Server.CreateObject("Scripting.Dictionary")
Set d(8)=Server.CreateObject("Scripting.Dictionary")
Set d(9)=Server.CreateObject("Scripting.Dictionary")
Set d(10)=Server.CreateObject("Scripting.Dictionary")
while not rs.eof
a=rs("languageNo")
b=rs("quickRef")
c=rs("text")
''# on error resume next
d(a).Add b,c
rs.movenext
wend
initcn.close
''# Storing the array in the Application object
Application.Lock
Application("lang") = d
Application.Unlock
end function
答案 0 :(得分:3)
一个现成的并且支持存储在应用程序对象中的对象具有ProgID“MSXML2.FreeThreadedDOMDocument.3.0”
这是加载相当静态的应用程序范围数据的一个非常好的解决方案,如果您使用SQL Server,那么SQL Server FOR XML
功能可以很容易地构建一些XML以加载到DOM中。
答案 1 :(得分:2)
由于其线程模型,您不应将Dictionary对象用作应用程序级变量。如果你需要在应用程序级别使用类似字典的对象,请使用Microsoft的免费查找组件(或Caprock Consulting的免费字典组件)。
要了解详情,请访问this网址。