Бе доступ к БД вздутие живота при подключении из Excel - PullRequest
1 голос
/ 27 января 2020

У меня есть приложение Access, разделенное FE / BE, которое импортирует данные и экспортирует отчеты в файл Excel xlsm. Пользователи выполняют различные действия в отчете Excel, которые добавляют записи в БД BE. Все соединения с BE DB открыты и закрыты, а наборы записей закрыты до того, как соединение db закрыто, и для него не установлено ничего. BE защищен паролем, и у меня около 20 активных пользователей каждый день.

Бэкэнд-база данных вздувается во время использования в течение дня и требует сжатия каждую ночь. Я пытаюсь определить, почему бэкэнд растет. В течение дня он увеличится с 10 МБ до более 100 МБ к концу дня.

Раздувание вызвано ссылками Excel, если все действия завершены в Access, БД BE увеличивается только на несколько КБ.

Я нашел много постов здесь и в Google и не могу найти никаких предложений, которые бы поддерживали БД в нормальном размере. Мне известно, что удаление и добавление записей вызывает вздутие живота, но мы добавляем только несколько сотен записей каждый день.

Образец кода Excel: мы используем пять отчетов Excel. Эти отчеты открываются, и макросы вызываются примерно 100 раз в день.

Dim db As DAO.Database, rstJournal As DAO.Recordset

Set db = DAO.OpenDatabase(tmpDir & "DBname.accdb", False, False, "MS Access;PWD=Password")

Set rstJournal = db.OpenRecordset("Select * from tblJournal", Options:=dbAppendOnly)

rstJournal.AddNew
rstJournal!J_Name = ActiveCell.Offset(i, 1).Value

...

RstJournal.Update

If Not rstJournal Is Nothing Then rstJournal.Close
If Not db Is Nothing Then db.Close

Set rstJournal = Nothing
Set db = Nothing

1 Ответ

0 голосов
/ 27 января 2020

Кажется, что каждый l oop вы открываете и закрываете базу данных, и это может быть проблемой.

Но вы можете захотеть использовать код таким образом.

Const dbFailOnError = 128
Dim db As DAO.Database
Dim strSQL As String

Set db = DAO.OpenDatabase(tmpDir & "DBname.accdb", False, False, "MS Access;PWD=Password")

For I = 0 To ActiveSheet.Cells(Rows.Count, ActiveCell.Column).End(xlUp).Row
    strSQL = "INSERT INTO tblJournal ( J_Name , field2 ) "
    strSQL = strSQL & "SELECT '" & ActiveCell.Offset(I, 1).value & "', '" & ActiveCell.Offset(I, 2).value & "'"

    ' If next line throw an error then use it without dbFailOnError and disable this one
    db.Execute strSQL, dbFailOnError

    ' db.Execute strSQL

Next I

If Not db Is Nothing Then db.Close
Set db = Nothing

Извините, вы не указали имена полей. Поэтому я использовал форму field2

Asaf

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...