标题: 高手帮下忙啊?急急急 [打印本页] 作者: a283054 时间: 2011-6-4 10:19 标题: 高手帮下忙啊?急急急 我做了个登录系统,设置了4个用户名和密码。但是只有第一个可以登录成功,其它3个不行,不知道为什么。急啊,不用怀疑,我很菜。Private Sub Command4_Click()
Dim rst As New ADODB.Recordset
Dim strsql As String
strsql = "select 用户名,密码 from 用户名"""
rst.Open strsql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
If Trim(Me.Combo13) = Trim(rst.Fields(0)) And Trim(Me.Text2) = Trim(rst.Fields(1)) Then
Dim stDocName As String
Dim stLinkCriteria As String
Else
MsgBox "登陆失败,请重新登陆"
Me.Combo13.SetFocus
End If
End Sub作者: a283054 时间: 2011-6-4 10:20
好心 人看下是不是哪儿写错了,万分感谢作者: Grant 时间: 2011-6-4 10:46
这个写法只读取第一条记录进行比对,当然也只能有一个人通过
strsql = "select 用户名,密码 from 用户名 where 用户名='"& 用户名控件 &"' and 密码 ='"& 密码控件 &"'
if rs.RecordCount=1 then
'通过
else
'错误
end if作者: caoguangyao 时间: 2011-6-4 11:59
应该循环读取用户表,进行用户名和相应密码的验证,形式如下:
rs.movefirst
for i=0 to rs.RecordCount -1
if 条件为真 then
执行表达式
exit sub'退出程序
else
MsgBox Err.Description'提示
endif
rs.movenext
next作者: a283054 时间: 2011-6-4 12:23
万分感谢,虽然我还是没有弄出来。作者: caoguangyao 时间: 2011-6-4 12:58
将楼主的代码修改了,如下:
Private Sub Command4_Click()
Dim rst As New ADODB.Recordset
Dim strsql As String
strsql = "select 用户名,密码 from 用户名"""
rst.Open strsql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
Dim i As Long ''---------
rst.MoveFirst ''---------
For i = 0 To rst.RecordCount - 1 ''---------
If Trim(Me.Combo13) = Trim(rst.Fields(0)) And Trim(Me.Text2) = Trim(rst.Fields(1)) Then
Dim stDocName As String
Dim stLinkCriteria As String
stDocName = ChrW(20999) & ChrW(25442) & ChrW(-26782) & ChrW(26495)
DoCmd.OpenForm stDocName, , , stLinkCriteria
Exit Sub ''---------
Else
MsgBox "登陆失败,请重新登陆"
Me.Combo13.SetFocus
End If
rst.MoveNext
Next ''---------
rst.Close ''---------
Set rst = Nothing ''---------
End Sub
''---------表示添加的代码行 作者: Grant 时间: 2011-6-4 14:38
循环无疑不是好方法,只需对比一下数据库是否有记录即可作者: a283054 时间: 2011-6-4 16:35
万分感激啊 作者: a283054 时间: 2011-6-4 16:38
呵呵,我改了,遇到新问题了。第一个用户名成功登陆。第二用户名登陆,显示登陆失败,请重新登陆,点击又成功登陆了。第三个用户名登陆显示两次登陆失败,请重新登陆,点击两次后又成功登陆。第四个用户名登陆显示三次登陆失败,请重新登陆,点击两次后又成功登陆。这又是杂回事哦。作者: roych 时间: 2011-6-4 19:02
Grant 发表于 2011-6-4 14:38
循环无疑不是好方法,只需对比一下数据库是否有记录即可
我个人不建议用循环,直接把控件名称作为Where条件来打开记录集会更好些。LZ不妨调试下一下代码:
Dim rst As New ADODB.Recordset
Dim strsql As String
strsql = "select 用户名,密码 from 用户名 where 用户名='" & Trim(Me.Combo13) &"' and 密码='" & Trim(Me.Text2) &"'"
rst.Open strsql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
if Not rst.EOF Then
Dim stDocName As String
Dim stLinkCriteria As String
stDocName = ChrW(20999) & ChrW(25442) & ChrW(-26782) & ChrW(26495)
DoCmd.OpenForm stDocName, , , stLinkCriteria
Else
MsgBox "登陆失败,请重新登陆"
Me.Combo13.SetFocus
End If
End Sub作者: a283054 时间: 2011-6-4 19:13 回复 caoguangyao 的帖子
万分感激啊 作者: LeeTien 时间: 2011-6-5 12:10
建议用条件查询
如果要安全性
建议先匹配用户名
如果存在再验证密码
这样对于爆破将是噩梦,当然还可以加个验证码,再整个MD5加密作者: flyyoung 时间: 2011-6-6 21:57
都可以,不过比较赞成10楼,易懂,可取。不会出错。楼主的问题是没搞清楚如何把账号密码查询匹配到数据库中的对应的数据中去。其实这问题不难,只不过楼主没有化时间去思考。作者: 雨农 时间: 2011-6-6 22:33
Dim rst As New ADODB.Recordset
Dim strsql As String strsql = "select 用户名,密码 from 用户名""" 条件在哪里?后面应该加where
' where 用户名='"&控件名 &"' and 密码='"& 控件名 &"'
rst.Open strsql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
If Trim(Me.Combo13) = Trim(rst.Fields(0)) And Trim(Me.Text2) = Trim(rst.Fields(1)) Then
Dim stDocName As String
Dim stLinkCriteria As String