有没有既懂VB又懂ASP的高手???

micorosoft 2002-07-30 02:50:03
我做了一些关于随机选择纪录的VB程序代码,现我想把它转化为ASP页面,请问能不能实现?如何实现?
代码如下:

'程序功能  :在选定表的记录范围内生成不重复的记录数
'****************************************************
'程序用到两个表
'****************************************************
'表名一为:test.dbo.test,结构为: id int 4 标识,主索引;Type nvarchar;TXT nvarchar;
'表名二为:test.dbo.pk ,结构为: pkid int 4,主索引 此表为存放取出的test表中的ID
'****************************************************
'一个存储过程
'****************************************************
'存储过程:Rnd
'CREATE PROCEDURE Rnd --Rnd为存储过程名
' @Rnd int, --传入的参数,生成的随机数
' @Retu int output --返回的值
' AS
' if exists(select * from pk where pkid=@Rnd) --如果传入的随机数在表Pk中存在,则返回0
' begin
' set @Retu=0--设置返回值@Retu为0
' End
' Else
' begin
' insert into pk(PKID) values(@Rnd)--如果传入的随机数在表PK中不存在,则在PK表中加入此随机数
' set @Retu=1--设置返回值@Retu为1
' End
'GO
'****************************************************
Dim Cn As ADODB.Connection
Dim Rs As ADODB.Recordset
Dim Rs1 As ADODB.Recordset
Dim Cm As ADODB.Command
Dim VarRnd As Integer
Private Sub Command1_Click()
'******************************************************************
'测试用户输入的是否为数字
For i = 1 To 2
If IsNumeric(Choose(i, Text1.Text, Text2.Text)) = False Then
response.write "请输入数字!", vbCritical + vbOKOnly, "警告"
Choose(i, Text1, Text2).SetFocus
SendKeys "{Home}+{End}" '把TEXT1控件中的所有资料全部选中
Exit Sub '退出子程序
End If
Next i
'******************************************************************

'******************************************************************
If Rs.State = 1 Then Rs.Close
Rs.Open "select type,count(*) from test.dbo.temp group by type", _
Cn, adOpenDynamic, adLockOptimistic, adCmdText
'按类型分组计算出每组的记录数,也就是每种题目的数量

For i = 1 To Rs.RecordCount
Rs.MoveFirst '记录指针移动到最前面
Rs.Find "type='" & Choose(i, "TK", "WD") & "'" '在记录集中定位
If Choose(i, Val(Text1.Text), Val(Text2.Text)) > Rs.Fields(1) Then
MsgBox Choose(i, "TK", "WD") & "要取出的记录数大于总记录数" & Chr(13) & _
"总记录数为:" & Trim(CStr(Rs.Fields(1))) & "条", vbCritical + vbOKOnly, "警告"
Choose(i, Text1, Text2).SetFocus
SendKeys "{Home}+{End}" '把TEXT控件中的所有资料全部选中
Exit Sub '退出子程序
End If
Next i
'校验用户输入的选题量是否超出了题库总量
'******************************************************************

'******************************************************************
Cm.CommandType = adCmdStoredProc '设置Cm的命令类型为执行存储过程
Cm.CommandText = "Rnd" '设置存储过程名称
If Cm.Parameters.Count > 0 Then '如果Cm的参数大于0.那么删除参数
Cm.Parameters.Delete ("@Rnd") '删除参数
Cm.Parameters.Delete ("@Retu") '删除参数
End If
Cm.Parameters.Append _
Cm.CreateParameter("@Rnd", adInteger, adParamInput)
'添加参数
Cm.Parameters.Append _
Cm.CreateParameter("@Retu", adInteger, adParamOutput) '添加参数
'把得到的随机数赋给Cm的第1个参数
Cn.Execute "delete from test.dbo.pk" '清除表PK里所有记录
Cm.Prepared = True
'******************************************************************

'******************************************************************
For i = 1 To Rs.RecordCount
Label1.Caption = "正在执行,请稍候......"
If Rs1.State = 1 Then Rs1.Close
Rs1.Open "select * from temp where Type='" & _
Choose(i, "TK'", "WD'"), Cn, adOpenDynamic, adLockOptimistic, adCmdText
'得到当前类型的记录集

For j = 1 To Choose(i, Val(Text1.Text), Val(Text2.Text)) '循环
Do While True '生成随机数的循环
If Int((Rnd * Rs1.RecordCount) + 1) = 0 Then
'以当前类型的记录数为种子得到随机数
'(这样得到的随机数在Temp表的总记录数中),把得到的0值转换成1
VarRnd = 1
Else
VarRnd = Int((Rnd * Rs1.RecordCount) + 1)
End If
Rs1.AbsolutePosition = VarRnd
'将当前类型的记录集的记录指针指向生成的随机数
Cm.Parameters(1).Value = Rs1.Fields(0)
'把当前类型记录集的记录指针赋给存储过程的输入参数
Cm.Execute '执行存储过程
If Cm.Parameters(2).Value >= 1 Then
'如果返回的值为大于或等于1.那么说明现在生成的随机数没有重复, _
则退出生成随机数的循环 , 进入下一个j
Exit Do '退出生成随机数的循环
End If
Loop '继续生成随机数
Next j
Next i
Rs.Close '关闭recordset
Rs.Open "select * from temp where " & _
" id in (select pkid from pk)" & _
" Order By Type,id", Cn, adOpenDynamic, adLockOptimistic, adCmdText
Set DataGrid1.DataSource = Rs '设置表格的数据源为Rs
Label1.Caption = "执行完毕!"
End Sub
Private Sub Form_Load()
Set Cn = New ADODB.Connection
Cn.Open "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=test;Data Source=zx"
Set Rs1 = New ADODB.Recordset
Rs1.CursorLocation = adUseClient
Set Rs = New ADODB.Recordset
Rs.CursorLocation = adUseClient
Set Cm = New ADODB.Command
Set Cm.ActiveConnection = Cn
End Sub
Private Sub Form_Unload(Cancel As Integer)
Set Rs = Nothing
Set Cn = Nothing
Set Rs1 = Nothing
Set Cm = Nothing
End Sub

...全文
6 点赞 收藏 1
写回复
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
walkingpoison 2002-07-30
给你一些建议:如果你要把vb程序移植到asp中运行,那么就要把vbscript中不支持的部分修改掉。
1.所有的dim rs as adodb.recordset这样的定义修改成dim rs。vbscript只能定义variant类型的变量。
2.所有next i这样的语句改成next,不能加上i。
3.类似于adUseClient这样的ado常量,需要你自己定义一下,否则就直接用数值(3)
暂时想到这些,你自己先修改了看看
回复
发动态
发帖子
ASP
创建于2007-09-28

2.8w+

社区成员

ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
申请成为版主
社区公告
暂无公告