[/code]方案三:和上面连个代码大同小异,只是实现方式不一样[code]"&rs("id")rs.Move(-ThisRnd)NextEnd Sub'# 函数GetRnd(bound)返回一个不重复的随机数字'#参数bound:随机范围Function GetRnd(bound)DIM ranNumRandomize()ranNum=int(bound*rnd)If Instr(Appeared,"["&ranNum&"]") Then'产生的随机数是否出现过ranNum=getRnd(bound)End IfAppeared=Appeared&"["&ranNum&"]"'记录已出现的随机数GetRnd=ranNumEnd Functionrs.closeSet rs=Nothingconn.closeSet conn=Nothing%>[/code]方案四:网上很多朋友使用过的代码,个人还是推荐前三种代码[code]0 ’判断是否记录是否已在数组中 k=int(rnd*Item+1) loop t(k)=1 ’第k条记录被选中,设置为1,下次将不再选中next’--------------------------------------j=1:i=1’定义下标’ 循环选取数据集objRS中的部分记录存放到数组中Do While Not objRS.Eof if t(j)=1 then a(i,1)=objRS("id") ’记录id a(i,2)=objRS("DataColumn") ’记录内容 i=i+1 end ifj=j+1objRS.MoveNext Loop’----------------------------显示内容--------------------for i=1 to Item Response.write "序号"&a(i,1)&"" Response.write "内容"&a(i,2)&""next’----------------------------显示内容完毕--------------------’释放资源objRs.Closeset objRs=nothingobjConn.Closeset objConn=nothing%>[/code], - 三思随然 - 主动即自由,阅历即财富!简简单单,一切随然!" /> ASP实现access随机显示不重复记录解决方案 - 三思随然

ASP实现access随机显示不重复记录解决方案


网上这方面的代码很多,随便搜索一下就可以看到很多不同的代码。
我这里列举几种我比较喜欢的方法。
方案一:比较简洁的方式
Randomize
dim i,DispRecord
i=0
DispRecord=10 '设置显示的随机记录数量

sql="select id,caption from table"
set rs=server.CreateObject("adodb.recordset")
rs.open sql,conn,1,3

lngCount = rs.RecordCount
redim idList(lngCount)
while i<DispRecord

     lngRnd = Int((lngCount * Rnd) + 1)
     rs.AbsolutePosition = lngRnd
     if isEmpty(idList(lngRnd)) then '如果第lngRnd条记录在数组中为空,则显示该条记录

          response.write rs(0)&"<Br>"   '你可以自己设定需要输出的内容

          idList(lngRnd)=1     '第lngRnd条记录已经显示,把他在数组中的值设定为1,下次就不再显示
          i=i+1
     end if

wend
rs.close
set rs=nothing
Erase idList


方案二:可以生成指定范围内不重复的随机记录
<%
Dim objConn, objRs, db, strSQL
Dim totalCount, rndArray, rsOutputMax, intI
'-----------------
'|连接数据库|
'-----------------
db = "db/dbname.mdb"
strSQL = "Select id,name FROM table_name"
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(db)
Set objRs = Server.CreateObject("ADODB.Recordset")
objRs.Open strSQL, objConn, 1, 3
'--------------
'|读取数据|
'--------------
totalCount = objRs.RecordCount '生成随机数范围的上限
rsOutputMax = 10 '输出记录条数
rndArray = myRnd(rsOutputMax,totalCount,1)
Response.Write "  id          name"
Response.Write "------------------"
For intI = 1 To rsOutputMax
  objRs.AbsolutePosition = rndArray(intI)
  Response.Write "  " & objRs("id") & "          " & objRs("name") & "<br>"
Next
'--------------
'|清理资源|
'--------------
Set objRs = Nothing
objConn.Close
Set objConn = Nothing
'--------------------------------------------------
'|生成指定范围内不重复随机数的函数|
'|nMax:输出随机数的个数                |
'|upper:指定范围上限                     |
'|lower:指定范围下限                     |
'--------------------------------------------------
Function myRnd(nMax,upper,lower)
  Dim a(), i, j, k, reCount
  ReDim a(nMax)
  Randomize Timer
  For i = 1 To nMax
    reCount = False
    k = Int((upper - lower + 1) * Rnd + lower)
    For j = 1 To i - 1
      If k = a(j) Then reCount = True : Exit For
    Next
    If reCount = True Then
      i = i - 1
    Else
      a(i) = k
    End If
  Next
  myRnd = a
End Function
%>


方案三:和上面连个代码大同小异,只是实现方式不一样
<%
'连接数据库代码略
DIM sql,rs
sql="select top 100 * from table order by rnd(id)"
Set rs=server.CreateObject("adodb.recordset")
rs.open sql,conn,1,1
DIM Appeared
Call DisRndRecord(10,rs.recordCount)'调用函数该位置显示记录
'#DisRndRecord(DisNum,rsBound)
'#参数DisNum:显示数量
'#参数rsBound:随机数产生范围
Sub DisRndRecord(DisNum,rsBound)
DIM i,ThisRnd
If rsBound<DisNum Then DisNum=rsBound'记录总数小于要抽取记录条数的情况
For i=0 To DisNum-1
ThisRnd=GetRnd(rsBound)'取得一个不重复的随机数
rs.Move(ThisRnd)'游标移动到随机数位置数读取
Response.Write "<br>"&rs("id")
rs.Move(-ThisRnd)
Next
End Sub
'# 函数GetRnd(bound)返回一个不重复的随机数字
'#参数bound:随机范围
Function GetRnd(bound)
DIM ranNum
Randomize()
ranNum=int(bound*rnd)
If Instr(Appeared,"["&ranNum&"]") Then'产生的随机数是否出现过
ranNum=getRnd(bound)
End If
Appeared=Appeared&"["&ranNum&"]"'记录已出现的随机数
GetRnd=ranNum
End Function
rs.close
Set rs=Nothing
conn.close
Set conn=Nothing
%>


方案四:网上很多朋友使用过的代码,个人还是推荐前三种代码
<%
’-------------------------数据库连接-----------------------
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" &_
"Data Source=" & Server.MapPath("data.mdb")
objConn.Open

’-------------------------检索数据-----------------------
strSQL = "Select id,DataColumn FROM DataTable"    ’Sql语句,检索数据库
Set objRS = Server.CreateObject("ADODB.Recordset")    ’创建记录集
objRS.Open strSQL, objConn, 1, 1                                    ’执行检索
Count=objRS.RecordCount            ’得到记录总数
Item=4                                           ’需要显示的记录数
’-------------------------检索数据完毕-----------------------

redim a(Item, 2),t(Count)   ’定义2数组,数组a用来储存记录,数组t用来删选记录

’初始数组数值,目的为了插入数据以后和此值做比较
for each j in t
    j=0
next

’ 随机抽取记录号
Randomize timer        ’初始化随机数生成器
for j=1 to Item
    k=int(rnd*Count+1)    ’从总数里面随机取一条记录
    do while t(k)<>0                    ’判断是否记录是否已在数组中
      k=int(rnd*Item+1)
    loop
    t(k)=1            ’第k条记录被选中,设置为1,下次将不再选中
next
’--------------------------------------
j=1:i=1’定义下标

’ 循环选取数据集objRS中的部分记录存放到数组中
Do While Not objRS.Eof
      if t(j)=1 then
          a(i,1)=objRS("id")                      ’记录id
          a(i,2)=objRS("DataColumn")     ’记录内容
          i=i+1
     end if
j=j+1
objRS.MoveNext
Loop

’----------------------------显示内容--------------------
for i=1 to Item
    Response.write "序号"&a(i,1)&"<br>"
    Response.write "内容"&a(i,2)&"<p>"
next
’----------------------------显示内容完毕--------------------

’释放资源
objRs.Close
set objRs=nothing
objConn.Close
set objConn=nothing
%>


[本日志由 随然 于 2009-07-04 09:51 PM 编辑]
上一篇: 超链接href="#"点击后会回到页首的解决办法
下一篇: 用ASP获取指定范围内的一组不重复的随机整数
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: ASP 代码
相关日志:
评论: 0 | 引用: 0 | 查看次数: 15762
发表评论
昵 称:
密 码: 游客发言不需要密码.
邮 箱: 邮件地址支持Gravatar头像,邮箱地址不会公开.
网 址: 输入网址便于回访.
内 容:
验证码:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1 字 | UBB代码 关闭 | [img]标签 关闭