You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Access数据库修改密码时遇Runtime Error 15-类型不匹配问题求助

问题根源:类型不匹配的直接原因

你遇到的Runtime Error 15(类型不匹配)是变量类型与赋值内容不兼容导致的:

  • MyuserID被声明为Long(数值类型),但你试图把文本框txtfirstname的字符串值(用户姓名)赋值给它,字符串和数值类型无法直接转换,自然触发错误。
  • 更关键的逻辑问题:MyuserID应该存储用户的唯一数值型UserID,姓名只是用来匹配记录的钥匙,匹配后要从记录集里提取对应的UserID才对。

分步解决方法


1. 修正UserID的赋值逻辑(核心修复)

在cmdproceed_Click中,当你通过rs.FindFirst找到匹配的用户记录后,应该从记录集里取出UserID字段的值赋值给MyuserID,替换掉错误的赋值语句:
把这行:

MyuserID = Me.txtfirstname.Value

改成:

MyuserID = rs!UserID ' 从匹配的记录中提取数值型的UserID,类型完全匹配

2. 修复密码修改代码中的SQL语法错误

你的cmdchange_Click里的SQL语句有明显语法bug:Select'多了一个单引号,还缺少查询字段。修正后的SQL语句:

Set rs = CurrentDb.OpenRecordset("SELECT * FROM [User Registration Details] WHERE [UserID] = " & MyuserID)

如果要更安全(避免SQL注入风险),可以改用参数查询:

Dim qdf As DAO.QueryDef
Set qdf = CurrentDb.CreateQueryDef("", "SELECT * FROM [User Registration Details] WHERE [UserID] = ?")
qdf.Parameters(0) = MyuserID
Set rs = qdf.OpenRecordset(dbOpenDynaset)
Set qdf = Nothing

3. 移除滥用的On Error Resume Next

On Error Resume Next会掩盖所有错误,导致你无法发现其他潜在问题(比如刚才的SQL语法错误),直接删掉这行,换成针对性的错误捕获:

Private Sub cmdchange_Click()
    On Error GoTo Err_Handler ' 替换成错误捕获
    ' ... 原有代码 ...
    
Exit_Handler:
    If Not rs Is Nothing Then
        rs.Close
        Set rs = Nothing
    End If
    Exit Sub
    
Err_Handler:
    MsgBox "Error: " & Err.Number & " - " & Err.Description, vbCritical
    Resume Exit_Handler
End Sub

4. 优化表单验证逻辑(可选体验提升)

原代码的两个If判断会同时执行,比如如果txtfirstname为空,会先显示mand1,然后又检查txtemail导致焦点跳转,体验不好。改成ElseIf结构:

If IsNull(Me.txtfirstname) Or Me.txtfirstname = "" Then
    Me.mand1.Visible = True
    Me.txtfirstname.SetFocus
    Exit Sub
ElseIf IsNull(Me.txtemail) Or Me.txtemail = "" Then
    Me.mand2.Visible = True
    Me.txtemail.SetFocus
    Exit Sub
End If

修正后的完整代码示例


修正后的cmdproceed_Click

Option Compare Database
Option Explicit
Private Sub cmdproceed_Click()
    ' 优化验证逻辑
    If IsNull(Me.txtfirstname) Or Me.txtfirstname = "" Then
        Me.mand1.Visible = True
        Me.txtfirstname.SetFocus
        Exit Sub
    ElseIf IsNull(Me.txtemail) Or Me.txtemail = "" Then
        Me.mand2.Visible = True
        Me.txtemail.SetFocus
        Exit Sub
    End If
    
    Dim rs As Recordset
    Set rs = CurrentDb.OpenRecordset("User Registration Details", dbOpenSnapshot, dbReadOnly)
    rs.FindFirst "Firstname='" & Nz(Me.txtfirstname, "") & "'"
    
    If rs.NoMatch Then
        Me.lbl1.Visible = True
        Me.txtfirstname.SetFocus
        rs.Close
        Set rs = Nothing
        Exit Sub
    End If
    
    If rs!Username <> Nz(Me.txtemail, "") Then
        Me.lbl2.Visible = True
        Me.txtemail.SetFocus
        rs.Close
        Set rs = Nothing
        Exit Sub
    End If
    
    ' 核心修复:赋值UserID而非姓名
    MyuserID = rs!UserID
    rs.Close
    Set rs = Nothing
    
    DoCmd.OpenForm "frmnewpassword" ' 去掉表单名前的空格,避免打开失败
    DoCmd.Close acForm, Me.Name
End Sub

修正后的cmdchange_Click

Option Compare Database
Option Explicit
Private Sub cmdchange_Click()
    On Error GoTo Err_Handler
    
    If Trim(Nz(Me.txtnewpass, "")) <> Trim(Nz(Me.txtconfirmpass, "")) Then
        MsgBox "Passwords do not match", vbExclamation + vbOKOnly, "Error"
        Me.txtnewpass.SetFocus ' 让用户重新输入密码
        Exit Sub
    End If
    
    Dim rs As DAO.Recordset
    Set rs = CurrentDb.OpenRecordset("SELECT * FROM [User Registration Details] WHERE [UserID] = " & MyuserID, dbOpenDynaset)
    
    If Not rs.EOF And Not rs.BOF Then
        rs.Edit
        rs("Password") = Me.txtconfirmpass.Value ' 明确引用控件值
        rs.Update
        MsgBox "Your Password has been successfully changed", vbInformation, "Electporl"
        DoCmd.Close acForm, "frmnewpassword", acSaveNo
        DoCmd.OpenForm "frmlogin"
    Else
        MsgBox "User record not found", vbExclamation
    End If
    
Exit_Handler:
    If Not rs Is Nothing Then
        rs.Close
        Set rs = Nothing
    End If
    Exit Sub
    
Err_Handler:
    MsgBox "Error updating password: " & Err.Number & " - " & Err.Description, vbCritical
    Resume Exit_Handler
End Sub

内容的提问来源于stack exchange,提问作者JOSHUA KWABA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 08:57:27