Office中国论坛/Access中国论坛

标题: 高手帮下忙啊?急急急 [打印本页]

作者: 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

    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 10:20
好心 人看下是不是哪儿写错了,万分感谢
作者: Grant    时间: 2011-6-4 10:46
这个写法只读取第一条记录进行比对,当然也只能有一个人通过

strsql = "select 用户名,密码 from 用户名 where 用户名='"& 用户名控件 &"' and 密码 ='"& 密码控件 &"'

rst.Open strsql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic

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

    stDocName = ChrW(20999) & ChrW(25442) & ChrW(-26782) & ChrW(26495)
    DoCmd.OpenForm stDocName, , , stLinkCriteria

    Else
    MsgBox "登陆失败,请重新登陆"
    Me.Combo13.SetFocus
End If
End Sub







欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3