下面是我的算法, 已做到类插件管理器的模块里了, 这是不是就是老江说的 Move? 呵呵.
算上调用类共读两次数据库, 而利用了缓存大部分时候只读一次, 还行吧?
复制内容到剪贴板
代码:
Dim strID,aryID,tmpID,tmpURL
'Application.Contents.RemoveAll 'Test Olny
Application.Lock
aryID=Application(ZC_BLOG_CLSID & "MYCUSTOMPAGES_ARYARTICLEID")
Application.UnLock
If (Not IsArray(aryID)) Then '如果服务器变量不是数组--那就是服务器变量不存在了, 重新取得吧.
Dim objRS
Set objRS=objConn.Execute("SELECT [log_ID] FROM [blog_Article] WHERE ([log_Level]>2) ")
If (Not objRS.bof) And (Not objRS.eof) Then
Do While Not objRS.eof
strID = strID &" "& objRS("log_ID")
objRS.MoveNext
Loop
End If
objRS.close
Set objRS=Nothing
strID=Trim(strID)
aryID=Split(strID," ")
Application.Lock
Application(ZC_BLOG_CLSID & "MYCUSTOMPAGES_ARYARTICLEID")=aryID
Application.UnLock
End If
Dim i,n
For i=0 To 2 '删除文章到索引重建的时间差内, 或停用插件后却保留本页的情况下可能会弹空, 所以才有重试机制, 但只试三次.
Randomize
n=Int((UBound(aryID,1)+1) * Rnd)
tmpID=aryID(n)
Dim objArticle
Set objArticle = New TArticle
If objArticle.LoadInfoByID(tmpID) Then
If objArticle.Level>2 Then
tmpURL = objArticle.Url
Set objArticle=Nothing
Exit For
End If
End If
Application.Lock
Application(ZC_BLOG_CLSID & "MYCUSTOMPAGES_ARYARTICLEID")=Empty '弹空一次则清空这个已经过时的服务器变量, 消除潜在错误.
Application.UnLock
Set objArticle=Nothing
Next
If (Not InStr(tmpURL,ZC_BLOG_HOST)>0) Then '重试找不到结果...点儿很背, 不得不报错了.
Call ShowError(2)
End If
tmpURL=Replace(tmpURL,ZC_BLOG_HOST,"") : tmpURL="../"& tmpURL '得到相对路径
tmpURL = Replace(tmpURL,"//","/") '防 ServerTransfer 出路径错误.
Server.Transfer tmpURL