做网站我们更专业,服务我们更用心----厦门优艾网络工作室
建站热线:135~1596~4500

ASP记录随机排序完美解决方案最终版

12/19/2005 2:33:20 PM 来源: 作者: 浏览热度( 次) 字号:T|T
分享到:

首先利用GetRows()把要随机排序的id读到一个一维数组里面
MyArray=rsid.GetRows()
下面就是要想办法从这个数组得到另外一个随机排序的数组。
利用参考一里面的方法,不过首先要把MyArray数组里面的内容转到字符串数组a里面

a=array(MyArry(0,0),MyArry(0,1),MyArry(0,2),MyArry(0,3),MyArry(0,4),MyArry(0,5),MyArry(0,6),MyArry(0,7),MyArry(0,8),MyArry(0,9))

最开始我是直接手动写的,虽然觉得应该使用循环,但先得到结果再说了。
后来今天使用时发现换一张试卷就出错了,因为题目数目不等于固定数组的数目。所以还是得想办法改成转换动态数组的方法。
经过一天的努力终于把动态数组里面的内容转换到了字符串里面

dim aa()
for j=0 to rscount-1
redim Preserve aa(j)
aa(j)=MyArry(0,j)
next

dim aa()的时候如果换成dim a()则报错说“类型不匹配”(?)
就这么简单的一段代码,却折腾了俺一天的时间,主要还是在于对VBSCRIPT的基础不熟悉。最开始也曾经试过这个法子,但是得到的字符串是空的,不知道原因出在哪里;后来没辙为了应急自己手动写了一个select case代码把1-40的可能性统统检测一遍%^&*(_
后来又去csdn查找关于asp动态数组的帖子,在这篇里面找到了前面数组为空的根本所在,我开始写的代码是redim a(j),这样在追加新内容的时候前面的内容被清掉了,最终得到的是一个空字符串数组(也可能只有最后一个值),redim加上参数Preserve 就避免了这个问题。
这样我们就把数据集rsid的内容转换成了一个字符转数组。
字符串数组a转换好之后就可以利用下面参考一的方法得到一个新的随机字符串了。
参考一:字符串随机排序的问题
<%
a=array("1","2","3","4","5","6","7")
randomize
leng=ubound(a)
for i=0 to leng
b=int(rnd()*(leng+1))
temp=a(b)
a(b)=a(i)
a(i)=temp
next
for i=0 to leng
response.write a(i)
next
%>

最后利用for循环把新的随机数组a()里的id依次读出来……本来以为还要split一下的,结果发现不用。


完整代码:

<%
Set rsid=Server.CreateObject("Adodb.RecordSet")
sqlid="SELECT id FROM [table] order by id"
rsid.open sqlid,conn,1,3
if not rsid.eof then
rscount = rsid.recordcount
MyArry=rsid.GetRows()
''rs转换为字符串
dim aa()
for j=0 to rscount-1
redim Preserve aa(j)
aa(j)=MyArry(0,j)
next
''随机排序
randomize
leng=ubound(aa)
for ii=0 to leng-1
b=int(rnd()*leng)
temp=aa(b)
aa(b)=aa(ii)
aa(ii)=temp
next
ki=1
for i=0 to leng-1
Set rs=Server.CreateObject("Adodb.RecordSet")
sql="SELECT * FROM [table] WHERE id="&aa(i)
rs.open sql,conn,1,3
''中间显示记录
ki=ki+1
next
end if
%>
返回】 【关闭