访问数据库引擎无法锁定表 - 为表单上的字段创建表脚本

时间:2013-03-06 15:27:57

标签: ms-access ms-access-2010

我在使用某个vba脚本时遇到了一些麻烦,我试图从表单上的按钮运行。

通过链接的MDB文件,我编写了一串Make Table查询,帮助某些其他查询工作。我没有让用户逐个重新运行每个Make Table查询,而是将查询放在VBA脚本中(使用 DoCmd.RunSQL ),然后将该脚本分配给按钮在表格上。

我正在使用的数据源还有一个文件信息表,其中包含数据的文件名和文件日期。

当用户点击按钮时,我希望他们知道在运行Make Tables查询字符串时使用了什么数据源;这样他们就知道脚本运行的是什么数据。

我的方法是使用文件信息表创建一个最终的Make Table查询,将文件名和文件日期放在它自己的表中。

然后我会将这些字段添加到表单中,并将 DoCmd.RunSQL 添加到此最终的Make Table查询中,并将其添加到按钮的VBA脚本的底部;一旦所有Make Tables都运行,然后将在表单上显示/更新文件信息和文件日期字段,告诉用户上次运行脚本时使用了哪些数据文件。

以下是此代码(为简洁起见,我将所有在FileInfo之前运行的Make Table脚本汇总为一些虚假的“AllOtherMakeTables”字符串)

Private Sub Command0_Click()

On Error GoTo Err_Command0_Click

DoCmd.SetWarnings False

Dim AllOtherMakeTables As String
Dim FileInfoStamp As String

AllOtherMakeTables = " SELECT SomeField INTO AnotherTable" _
& " FROM SomeTable" _

FileInfoStamp = " SELECT FileInfo.FileName, FileInfo.FileDate INTO FileInfoStamp" _
& " FROM FileInfo;" _

DoCmd.RunSQL AllOtherMakeTables
DoCmd.RunSQL FileInfoStamp

DoCmd.SetWarnings True

Exit_Command0_Click:
Exit Sub

Err_Command0_Click:
    MsgBox Err.Description
    Resume Exit_Command0_Click

End Sub

使用上面的脚本单击按钮会产生以下错误消息:

  

数据库引擎无法锁定表'FileInfoStamp',因为它是   已被其他人或过程使用

我认为发生的事情是我添加到表单中的字段(FileName和FileDate)在表单打开时锁定FileInfoStamp表,因此当脚本尝试重新创建FileInfoStamp时,它无法像表那样执行此操作被锁定了。

我认为只需在上述脚本的开头添加 DoCmd.Close ,然后在脚本末尾添加 DoCmd.OpenForm 即可解决此问题。 (基本上在运行Make Table命令时关闭表单,然后在结束时重新打开表单)。

所有这些确实关闭了表单并显示相同的错误消息。所以我猜即使表单“关闭”,表单上字段的连接仍然以某种方式保持活动状态(...?)

任何有关我如何解决这个问题的帮助都将非常感激。谢谢。

1 个答案:

答案 0 :(得分:0)

每次都不要重新创建FileInfoStamp。改为使用以下两个步骤:

  1. 丢弃现有行
  2. 追加新数据
  3. Dim db As DAO.database
    Dim FileInfoStamp As String
    
    FileInfoStamp = "INSERT INTO FileInfoStamp(FileName, FileDate)" & vbCrLf & _
        "SELECT fi.FileName, fi.FileDate FROM FileInfo AS fi;"
    Debug.Print FileInfoStamp
    
    Set db = CurrentDb
    ' empty out FileInfoStamp
    db.Execute "DELETE FROM FileInfoStamp;", dbFailOnError
    ' add new data to FileInfoStamp
    db.Execute FileInfoStamp, dbFailOnError
    Set db = Nothing
    

    添加错误处理程序以处理dbFailOnError中出现的任何问题。

    而不是DoCmd.RunSQL,请使用DAO数据库.Execute方法进行其他查询。使用这种方法,您将没有动力使用DoCmd.SetWarnings False。关闭SetWarnings是不明智的,因为它会抑制诊断问题所需的信息。