У меня есть база данных 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 тысячах файлов при использовании одной и той же начальной папки.
Есть идеи, что можно сделать?