=================主程序
Private Sub cmdt_Click()
Dim cn As New Adodb.Connection
Dim rs As New Adodb.Recordset
Dim sql As String
Dim username As String
Dim password As String
username = Trim(tbusername.Text)
If username = "" Then
    MsgBox "用户名不能为空!", vbInformation, "系统登陆提示"
    Exit Sub
End If
password = checkpwd.md5((tbpwd.Text))
sql = "select * from 系统表 where 用户名='" & username & "'"
MsgBox sql
Set rs = ExeSQL(sql)If rs.EOF = True Then      '====对象变量或With块变量未设置
   If errortime > 2 Then
       MsgBox "连续三次输入错误,系统自动退出!如果有何疑问请与系统管理员联系.", vbCritical, "系统提示"
        Unload Me
    Else
        MsgBox "没有此用户,请重新输入用户名!", vbExclamation
        errortime = errortime + 1
        tbusername.Text = ""
        tbusername.SetFocus
    End If
Else
    If password = rs!密码 Then
        Load frmmain
        Load MDIFormmain
        MDIFormmain.Show
        frmmain.Show
        Me.Hide
        Unload Me
   Else
        MsgBox "密码输入错误,请重试!", vbInformation, "系统登陆提示"
        errortime = errortime + 1
        tbpwd.Text = ""
        tbpwd.SetFocus
    End If
End If
rs.Close
Set rs = Nothing
End Sub===============调用的ExeSQL(sql)过程
Public Function ExeSQL(ByVal sql As String) As Adodb.Recordset
    On Error GoTo ErrHandler:
    
    Dim cn As Adodb.Connection
    Dim rs As Adodb.Recordset
    Dim strArray() As String
  ConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\jxcdbase.mdb;Persist Security Info=False"    
    Set cn = New Adodb.Connection
    Set rs = New Adodb.Recordset
    cn.Open ConnStr    strArray = Split(sql)
 
    If StrComp(UCase$(strArray(0)), "select", vbTextCompare) = 0 Then
           rs.Open Trim$(sql), cn, adOpenKeyset, adLockOptimistic
        Set ExeSQL = rs
    Else
        cn.Execute sql
    End IfExeSQl_Exit:
    Set rs = Nothing
    Set cn = Nothing
    Exit Function
    
ErrHandler:
    ' 显示错误信息
    MsgBox "错误号:" & Err.Number & " 错误信息:" & Err.Description, vbExclamation
    Resume ExeSQl_Exit
 End Function

解决方案 »

  1.   

    =================主程序
    Private Sub cmdt_Click()
    Dim cn As New Adodb.Connection
    Dim rs As New Adodb.Recordset
    Dim sql As String
    Dim username As String
    Dim password As String
    username = Trim(tbusername.Text)
    If username = "" Then
        MsgBox "用户名不能为空!", vbInformation, "系统登陆提示"
        Exit Sub
    End If
    password = checkpwd.md5((tbpwd.Text))
    sql = "select * from 系统表 where 用户名='" & username & "'"
    MsgBox sql
    Set rs = ExeSQL(sql)'=====================建议修改方案(换种方式)
    sql="select * from 系统表 where 用户名='"& username & "'"
    rs.open sql,conn,1,3msbox rs.eof
    这样子调试看看'========================================If rs.EOF = True Then      '====对象变量或With块变量未设置
       If errortime > 2 Then
           MsgBox "连续三次输入错误,系统自动退出!如果有何疑问请与系统管理员联系.", vbCritical, "系统提示"
            Unload Me
        Else
            MsgBox "没有此用户,请重新输入用户名!", vbExclamation
            errortime = errortime + 1
            tbusername.Text = ""
            tbusername.SetFocus
        End If
    Else
        If password = rs!密码 Then
            Load frmmain
            Load MDIFormmain
            MDIFormmain.Show
            frmmain.Show
            Me.Hide
            Unload Me
       Else
            MsgBox "密码输入错误,请重试!", vbInformation, "系统登陆提示"
            errortime = errortime + 1
            tbpwd.Text = ""
            tbpwd.SetFocus
        End If
    End If
    rs.Close
    Set rs = Nothing
    End Sub
      

  2.   

    If StrComp(UCase$(strArray(0)), "select", vbTextCompare) = 0 Then改为:
      If StrComp(UCase$(strArray(0)), "SELECT", vbTextCompare) = 0 Then

      If StrComp(LCase$(strArray(0)), "select", vbTextCompare) = 0 Then否则, 这个条件永远不可能是真。这个条件不为真的话, 你的SELECT语句被Execute了, 且ExeSQL函数不会返回数据集对象, 就造成了:
    If rs.EOF = True Then     '====出错处:对象变量或With块变量未设置
      

  3.   

    行了 ,太感谢了~~~``
    就是不知道UCase和LCase是什么意思?
      

  4.   

    我用一样的程序,换一台电脑调试,又出现这个问题了, 
    If StrComp(LCase$(strArray(0)), "select", vbTextCompare) = 0 Then 
    已经改了,还有那里可能有问题??
      

  5.   

    检查你调用ExeSQL函数时传递过去那个参数的值, 只有当它是类似"select ......"这样格式的时候, ExeSQL才会返回一个数据集。
    看来这个程序并非楼主自己写的,对里面的函数的功能不是太了解哇。
      

  6.   

    If StrComp(LCase$(strArray(0)), "select", vbTextCompare) = 0 Then   能通过的.cn.Open ConnStr 
    或者rs.Open Trim$(sql), cn, adOpenKeyset, adLockOptimistic
            Set ExeSQL = rs
    有问题吗?