0

我有一个允许用户有效地截断访问表的功能。

这是一个相当基本的功能;它删除所有行,然后通过将 ID 列的数据类型更改为 来重置自动增量索引,然后再更改INTAUTOINCREMENT

但是,我遇到了一个问题;有时,当用户按下调用该函数的按钮时,我会因错误而停止 -

数据库引擎无法锁定表“Active Directory”,因为它已被其他人或进程使用。

这个错误不是每次都会出现,但是一旦出现,我必须关闭Access才能让它消失。

错误发生在这一行 -

DB.Execute "ALTER TABLE [" & tableName & "] ALTER COLUMN [ID] INT"

有问题的表绝对不能用 Access 打开,甚至在调用此函数之前关闭表也不起作用 -

DoCmd.Close acTable, tableName, acSaveYes

我能做些什么来避免这个错误并让我的代码按我的要求工作吗?

Function Truncate(ByVal tableName As String, Optional ByVal resetIndex As Boolean = True) As Boolean

    On Error GoTo checkResult   ' Set up error handling

    Call Functions.setWarnings(False)    ' Disable warnings

    Dim DB As DAO.Database
    Set DB = CurrentDb  ' Set the DB object to use

    '**
     ' Clear the table contents
     '*
    DB.Execute "DELETE * FROM [" & tableName & "]"

    '**
     ' Change the data type of the ID field to INT
     '*
    DB.Execute "ALTER TABLE [" & tableName & "] ALTER COLUMN [ID] INT"

    '**
     ' Change the data type of the ID field back to AUTOINCREMENT
    DB.Execute "ALTER TABLE [" & tableName & "] ALTER COLUMN [ID] AUTOINCREMENT"

    '**
     ' Check the result of the TRUNCATE operation
     '*
checkResult:
    Call Functions.setWarnings(True)            ' Enable warnings
    Truncate = IIf(Err.Number = 0, True, False) ' Set the result

End Function
4

0 回答 0