Access 2010 выдает ошибку блокировки -2147217887 (80040e21) в однопользовательской базе данных - PullRequest
0 голосов
/ 16 января 2019

У меня есть база данных Access 2010, которую я использую для сканирования жесткого диска, чтобы обнаружить несколько версий файлов.По сути, у меня есть таблица с файлами, для которой у меня есть набор записей 'filesTable':

Private filesTable As ADODB.Recordset
Private foldersTable As ADODB.Recordset

Sub initFilesTable()
    CurrentProject.Connection.Execute "DELETE ALL * FROM files", , adCmdText
    Set filesTable = New ADODB.Recordset
    filesTable.Open "SELECT files.[folderName], " & _
    " files.[fileName], " & _
    " files.[fileSize], " & _
    " files.[dateModified] " & _
    " FROM files;", _
    CurrentProject.BaseConnectionString, adOpenForwardOnly, _
    adLockPessimistic, adCmdText
End Sub

и таблица с папками с набором записей folderTable:

Sub initFoldersTable()
    CurrentProject.Connection.Execute "DELETE ALL * FROM folders1", , adCmdText
    Set foldersTable = New ADODB.Recordset
    foldersTable.Open "SELECT folders1.[folderName], " & _
    " folders1.[folderCount], " & _
    " folders1.[fileCount], " & _
    " folders1.[fullPath], " & _
    " folders1.[size] " & _
    " FROM folders1;", _
    CurrentProject.BaseConnectionString, adOpenForwardOnly, _
    adLockPessimistic, adCmdText
End Sub

Первоначально я записывал каждый файл с:

Sub addFileToTable(folder As folder, file As file)
With filesTable
    .AddNew
    !folderName = folder.path & "\"
    !fileName = file.Name
    !FileSize = file.Size
    !DateModified = file.DateLastModified
    .Update
End With
End Sub

, и он работал нормально.Подпрограмма рекурсивна для папок.Я мог прочитать сотни тысяч файлов в таблицу.

Затем я добавил запись папок, которая выполняется одновременно с записью файлов:

Sub addFolderToTable(folder As folder, folderFileCount As Long)
    With foldersTable
    .AddNew
    !folderName = folder.Name
    !FolderCount = folder.SubFolders.Count
    !FileCount = folderFileCount
    !FullPath = folder.path
    !Size = folder.Size
    .Update
    End With
End Sub

Затем база данных начала выдавать ошибки:

Ошибка времени выполнения '-2147217887 (80040e21)' Не удалось обновить;этот элемент в настоящее время заблокирован (не точная формулировка сообщения)

в строках с командой .update, либо в подпрограммах addFileToTable или addFolderToTable.

Не было в конкретном файлезапись.Система могла прочитать папку с сотнями файлов, и ошибки не было.Но когда я выбрал папку с тысячами файлов, я получаю сообщение об ошибке.Если я прокомментирую строку для обновления папок, я не получу сообщение об ошибке, поэтому проблема заключается в обновлении двух таблиц одновременно, когда выполняется много обновлений для таблиц.Я пробовал несколько комбинаций lockType и cursorType в команде recordSet.open, ничего не меняется.Иногда происходит сбой в 10 тысячах файлов, иногда в 5 тысячах файлов при использовании одной и той же начальной папки.

Есть идеи, что можно сделать?

...