我有一个允许用户有效地TRUNCATE Access表的功能。
这是一个相当基本的功能;它会删除所有行,然后通过将ID列的数据类型更改为INT
,然后再返回AUTOINCREMENT
来重置自动增量索引。
然而,我遇到了一个问题;有时,当用户按下调用该功能的按钮时,我会被错误暂停 -
数据库引擎无法锁定表'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