请解释为什么表单更改触发运行时错误3464

时间:2018-10-14 12:15:03

标签: vba ms-access access-vba audit-trail

我想让自己更多地了解Access,所以请原谅我对正确术语/专业术语的无知。我想在我的数据库中放置一个审计跟踪,并一直在遍历here中使用该代码。直到我对表单进行了一些编辑之前,它对我来说都是完美的。现在,它在“ db.Execute sSQL,dbFailOnError”行上给了我一个运行时错误3464,并且我不知道我所做的更改导致了此错误。请并预先感谢您提供的任何/所有帮助!

代码在下面,

    Option Compare Database
   Dim bWasNewRecord As Boolean

Private Sub Form_Delete(Cancel As Integer)
   Call AuditDelBegin("Employee", "audTmpEmployee", "db_number", Nz(Me.EmployeeID, 0))

End Sub

Private Sub Form_AfterDelConfirm(Status As Integer)
   Call AuditDelEnd("audTmpEmployee", "audEmployee", Status)
End Sub

Private Sub Form_BeforeUpdate(Cancel As Integer)
   bWasNewRecord = Me.NewRecord
   Call AuditEditBegin("Employee", "audTmpEmployee", "db_number", Nz(Me.db_number, 0), bWasNewRecord)

End Sub

Private Sub Form_AfterUpdate()
    Call AuditEditEnd("Employee", "audTmpEmployee", "audEmployee", "db_number", Nz(Me!db_number, 0), bWasNewRecord)

End Sub

Private Sub Reset_Click()
  DoCmd.GoToRecord , , acNewRec



End Sub


Option Compare Database
Option Explicit

Private Const conMod As String = "ajbAudit"
Private Declare Function apiGetUserName Lib "advapi32.dll" Alias _
    "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long


Function NetworkUserName() As String
'On Error GoTo Err_Handler

    Dim lngLen As Long
    Dim lngX As Long
    Dim strUserName As String

    NetworkUserName = "Unknown"

    strUserName = String$(254, 0)
    lngLen = 255&
    lngX = apiGetUserName(strUserName, lngLen)
    If (lngX > 0&) Then
        NetworkUserName = Left$(strUserName, lngLen - 1&)
    End If

Exit_Handler:
    Exit Function

Err_Handler:
    Call LogError(Err.Number, Err.Description, conMod & ".NetworkUserName", , False)
    Resume Exit_Handler
End Function


Function AuditDelBegin(sTable As String, sAudTmpTable As String, sKeyField As String,         
lngKeyValue As Long) As Boolean
'On Error GoTo Err_AuditDelBegin

    Dim db As DAO.Database
    Dim sSQL As String

    Set db = DBEngine(0)(0)
    sSQL = "INSERT INTO " & sAudTmpTable & " ( audType, audDate, audUser ) " & _
        "SELECT 'Delete' AS Expr1, Now() AS Expr2, NetworkUserName() AS Expr3, " &         sTable & ".* " & _
        "FROM " & sTable & " WHERE (" & sTable & "." & sKeyField & " = " & lngKeyValue & ");"
    db.Execute sSQL, dbFailOnError

Exit_AuditDelBegin:
    Set db = Nothing
    Exit Function

Err_AuditDelBegin:
    Call LogError(Err.Number, Err.Description, conMod & ".AuditDelBegin()", , False)
    Resume Exit_AuditDelBegin
End Function


Function AuditDelEnd(sAudTmpTable As String, sAudTable As String, Status As Integer) As     Boolean
'On Error GoTo Err_AuditDelEnd
    Dim db As DAO.Database
    Dim sSQL As String

    Set db = DBEngine(0)(0)
    If Status = acDeleteOK Then
        sSQL = "INSERT INTO " & sAudTable & " SELECT " & sAudTmpTable & ".* FROM " &     sAudTmpTable & _
            " WHERE (" & sAudTmpTable & ".audType = 'Delete');"
        db.Execute sSQL, dbFailOnError
    End If

    sSQL = "DELETE FROM " & sAudTmpTable & ";"
    db.Execute sSQL, dbFailOnError
    AuditDelEnd = True

Exit_AuditDelEnd:
    Set db = Nothing
    Exit Function

Err_AuditDelEnd:
    Call LogError(Err.Number, Err.Description, conMod & ".AuditDelEnd()", False)
    Resume Exit_AuditDelEnd
End Function


Function AuditEditBegin(sTable As String, sAudTmpTable As String, sKeyField As String, _
    lngKeyValue As Long, bWasNewRecord As Boolean) As Boolean
'On Error GoTo Err_AuditEditBegin

    Dim db As DAO.Database
    Dim sSQL As String

    Set db = DBEngine(0)(0)
    sSQL = "DELETE FROM " & sAudTmpTable & ";"
    db.Execute sSQL


    If Not bWasNewRecord Then
        sSQL = "INSERT INTO " & sAudTmpTable & " ( audType, audDate, audUser ) " & _
            "SELECT 'EditFrom' AS Expr1, Now() AS Expr2, NetworkUserName() AS Expr3, " & sTable & ".* " & _
            "FROM " & sTable & " WHERE (" & sTable & "." & sKeyField & " = " &     lngKeyValue & ");"
        db.Execute sSQL, dbFailOnError
    End If
    AuditEditBegin = True

Exit_AuditEditBegin:
    Set db = Nothing
    Exit Function

Err_AuditEditBegin:
    Call LogError(Err.Number, Err.Description, conMod & ".AuditEditBegin()", , False)
    Resume Exit_AuditEditBegin
End Function


    Function AuditEditEnd(sTable As String, sAudTmpTable As String, sAudTable As String, _
    sKeyField As String, lngKeyValue As Long, bWasNewRecord As Boolean) As Boolean
'On Error GoTo Err_AuditEditEnd

    Dim db As DAO.Database
    Dim sSQL As String
    Set db = DBEngine(0)(0)

    If bWasNewRecord Then

        sSQL = "INSERT INTO " & sAudTable & " ( audType, audDate, audUser ) " & _
            "SELECT 'Insert' AS Expr1, Now() AS Expr2, NetworkUserName() AS Expr3, " & sTable & ".* " & _
            "FROM " & sTable & " WHERE (" & sTable & "." & sKeyField & " = " & lngKeyValue & ");"
        db.Execute sSQL, dbFailOnError
    Else

        sSQL = "INSERT INTO " & sAudTable & " SELECT TOP 1 " & sAudTmpTable & ".* FROM " & sAudTmpTable & _
            " WHERE (" & sAudTmpTable & ".audType = 'EditFrom') ORDER BY " & sAudTmpTable & ".audDate DESC;"
        db.Execute sSQL

        sSQL = "INSERT INTO " & sAudTable & " ( audType, audDate, audUser ) " & _
            "SELECT 'EditTo' AS Expr1, Now() AS Expr2, NetworkUserName() AS Expr3, " & sTable & ".* " & _
            "FROM " & sTable & " WHERE (" & sTable & "." & sKeyField & " = " & lngKeyValue & ");"
        db.Execute sSQL
        ' Empty the temp table.
        sSQL = "DELETE FROM " & sAudTmpTable & ";"
        db.Execute sSQL, dbFailOnError
    End If
    AuditEditEnd = True

Exit_AuditEditEnd:
    Set db = Nothing
    Exit Function

Err_AuditEditEnd:
    Call LogError(Err.Number, Err.Description, conMod & ".AuditEditEnd()", , False)
    Resume Exit_AuditEditEnd
End Function

1 个答案:

答案 0 :(得分:0)

我看到的是,您在INSERT INTO部分中定义了4个字段,而在SELECT中定义了3个字段。 进行INSERT INTO查询时,在VALUES/SELECT部分中,您需要匹配查询中所有符合条件的列(以及正确的顺序),(如果没有列符合条件,则必须考虑所有列对于(对于SELECT,如果第二个表的列与第一个表匹配,那么也很好)。 我用粗体标记了该问题(编辑:我看到粗体没有显示在code块中,我将其标记为包裹在**中)。 sSQL = "INSERT INTO " & sAudTmpTable & " ( **audType, audDate, audUser** ) " & _ "SELECT 'Delete' AS Expr1, Now() AS Expr2, NetworkUserName() AS Expr3, " **& sTable & ".* "** & _ "FROM " & sTable & " WHERE (" & sTable & "." & sKeyField & " = " & lngKeyValue & ");" db.Execute sSQL, dbFailOnError