Растущая проблема с размером файла MS Access - PullRequest
6 голосов
/ 16 января 2009

У меня есть большое приложение MS Access с большим количеством вычислений в коде VBA. Когда я запускаю его, он в конечном итоге падает из-за чрезмерного размера файла. Существует много промежуточных таблиц и запросов, созданных и впоследствии удаленных, но Access не освобождает место. Я старательно закрыл все промежуточные наборы записей и установил все временные объекты в ничто, но ничто не помогает. Единственный способ заставить мой код работать, это запустить его часть, остановить и восстановить / сжать файл, а затем перезапустить код.

Нет лучшего способа?

Спасибо

Ответы [ 9 ]

9 голосов
/ 16 января 2009

Вы должны иметь возможность запускать компактную функцию из кода VBA.

У меня был фрагмент ниже, добавленный в закладки давным-давно, когда я делал доступ.

Public Sub CompactDB() 
    CommandBars("Menu Bar").Controls("Tools").Controls("Database utilities").Controls("Compact and repair database...").accDoDefaultAction 
End Sub 

Вы можете вставить это в свой код, чтобы обойти это.

ПРИМЕЧАНИЕ. Если вы столкнулись с такими проблемами масштабирования, вы также можете рассмотреть вопрос о переходе на систему большего размера.

3 голосов
/ 16 января 2009

С какими размерами вы имеете дело? Какой код ошибки при сбое? Я был бы удивлен, если бы это было просто потому, что файл становится "слишком большим", но я предполагаю, что есть предел. Из вашего описания всего временного материала звучит, что могут быть улучшения дизайна, которые могут помочь.

РЕДАКТИРОВАТЬ: Я ожидаю, что вы понимаете, что заменить базу данных на что-то другое нетривиально - даже если вы пытаетесь сохранить все, что находится в базе данных, кроме таблиц. Access querydefs уникальны, Access SQL нестандартен, и вы бы в основном начинали заново.

Большинство приложений Access, которые я видел, имеют много возможностей для рефакторинга; и обычно это не так сложно, если а) вы понимаете логику и бизнес-правила и б) у вас есть четкое понимание программирования Access. Но это было бы более или менее верно для любых альтернатив. Если бы я был тобой, и ты немного не в себе в любой области, возможно, ты мог бы получить некоторую помощь. Но я бы сначала попытался спасти приложение Access.

Есть также предложение от другого автора о переносе таблиц в один или несколько прикрепленных MDB. Это надежная, проверенная техника в целом. Но сначала я бы выяснил, какова реальная причина проблемы.

2 голосов
/ 16 января 2009

Я бы перенес данные в MS SQL (постоянные данные и промежуточные таблицы); и вы можете на время оставить часть кода в MS Access.

Это решает две большие проблемы:

  1. Данные по своей природе будут более стабильными / надежными (я не могу сказать, сколько раз у меня была поврежденная база данных MS Access).
  2. Ваша база данных Access не будет сильно расширяться / изменяться (она должна достичь равновесия после запуска и компиляции всего кода).

Оба эти значения означают, что вам больше не нужно сжимать / восстанавливать базу данных; Вы можете получить бесплатную версию (Express Edition) MS SQL, и это не так сложно сделать.

1 голос
/ 18 января 2009

Если вы не хотите переходить на SQL Express или аналогичный, вы можете найти следующие идеи:

  • Откройте другую «внешнюю» базу данных доступа (файл mdb) для всех временных таблиц, чтобы вы могли поместить все временные данные во внешний файл, выбрасывая файл mdb при закрытии приложения. Затем вы будете манипулировать в своем коде объектом 'currentDb' и другой базой данных, которую вы создаете при запуске и к которой подключаетесь через соединение Jet, OLEDB или ODBC
  • Отделите ваши постоянные таблицы от кода и, при необходимости, перенесите данные в локальный клиентский интерфейс для создания временных таблиц. Это можно сделать, например, связав внешнюю базу данных с локальным / клиентским файлом, используя «DoCmd.transferDatabase acLink». Это также можно сделать, подключившись к постоянным данным через соединение OLEDB, открыв необходимые наборы записей и сохранив их локально в виде файлов XML. Здесь можно реализовать множество других решений.
0 голосов
/ 09 апреля 2018

Я столкнулся с подобной проблемой, когда моя база данных раздувалась при импорте необработанных данных. Вместо того, чтобы разделять базу данных и регулярно сжимать серверную часть, я решил использовать объект базы данных (DAO) для создания временной базы данных, импорта данных, запроса / изменения данных в этой временной базе данных, передачи их в исходную базу данных с помощью SQL и затем удалите его. Код YBase показан ниже:

Sub tempAccessDatabaseImport()
    Dim mySQL As String
    Dim tempDBPath As String
    Dim myWrk As DAO.Workspace
    Dim tempDB As DAO.Database
    Dim myObject

    'Define temp access database path
    tempPathArr = Split(Application.CurrentProject.Path, "\")
    For i = LBound(tempPathArr) To UBound(tempPathArr)
        tempDBPath = tempDBPath + tempPathArr(i) + "\"
    Next i
    tempDBPath = tempDBPath + "tempDB.accdb"

    'Delete temp access database if exists
    Set myObject = CreateObject("Scripting.FileSystemObject")
    If myObject.FileExists(tempDBPath) Then
        myObject.deleteFile (tempDBPath)
    End If

    'Open default workspace
    Set myWrk = DBEngine.Workspaces(0)

    'DAO Create database
    Set tempDB = myWrk.CreateDatabase(tempDBPath, dbLangGeneral)

    'DAO - Import temp xlsx into temp Access table
    mySQL = "SELECT * INTO tempTable FROM (SELECT vXLSX.*FROM [Excel 12.0;HDR=YES;DATABASE=" & RAWDATAPATH & "].[" & WORKSHEETNAME & "$] As vXLSX)"

    'DAO Execute SQL
    Debug.Print mySQL
    Debug.Print
    tempDB.Execute mySQL, dbSeeChanges

    'Do Something Else

    'Close DAO Database object
    tempDB.Close
    Set tempDB = Nothing

    myWrk.Close
    Set myWrk = Nothing

    'Delete temp access database if exists
    If myObject.FileExists(tempDBPath) Then
        'myObject.deleteFile (tempDBPath)
    End If
End Sub
0 голосов
/ 15 апреля 2010

Ситуация с размерами файлов Jet для меня бесконечно проблематична.

В настоящее время я наблюдаю часть своего собственного кода VBA из базы данных Access, поскольку он выполняет серию полей для одной записи обновления с использованием ADO для таблицы в базе данных Access B (с помощью запроса на обновление ссылка в базе данных А). Единственное поле - это CHAR (8). С каждыми 4 обновлениями база данных B увеличивается примерно на 8 Кбайт. Нет хорошего оправдания для этого. Добавление к размеру файла сильно снижает производительность; с каждым ростом файла обновления замедляются от примерно одной в секунду (в таблице из 30-40 тыс. записей с использованием поиска SQL с одной записью и без индексов в любом месте) до одного за 5-10 секунд. Теперь, я признаю, я выполнил сжатие / восстановление базы данных B до запуска этого кода обновления; возможно, если бы я этого не сделал, производительность не была бы такой плохой. Если бы целевое поле для обновления имело, скажем, тип Memo, то я бы ожидал этого. Но выполнять обновление поля CHAR () и получать этот результат просто нецелесообразно.

Большинство из вышеперечисленного (без особой критики за какое-либо одно предназначенное решение), по-видимому, являются допустимыми решениями для приложений, которые используют относительно постоянную схему бизнес-приложений (постоянно обращаются к одним и тем же целевым базам данных). Мой не так. , , Я не могу изменить целевую базу данных (база данных B), так как она создается и используется инструментом вендора, который мы используем для экспорта и импорта данных из их приложения.

Я понимаю и рекомендую вышеупомянутым авторам за то, что они нашли решения проблем пользователей. Тем не менее, я не могу позволить этому стоять, когда плохое проектирование / реализация программного обеспечения мешает пользователям, использующим продукт, поскольку пользователи ожидают, что он будет функционировать.

0 голосов
/ 16 января 2009

Согласно http://office.microsoft.com/en-us/access/HP051868081033.aspx, Access 2003 и 2007 имеют ограничение в 2 ГБ. Однако легко перенести некоторые или все таблицы в отдельный файл .mdb, а затем связать их с этими таблицами. В любом случае, рекомендуется иметь два файла: один для ваших данных и один для всех макросов, запросов и так далее. Вы даже можете иметь несколько файлов, если размер файла таблицы приближается к пределу в 2 ГБ.

0 голосов
/ 16 января 2009

К сожалению, у MS Access возникают проблемы, когда вы становитесь слишком большими - я думаю, что максимальный размер составляет 2 ГБ для БД доступа.

Вы можете перейти на Sql Express, VistaDB и т. Д.

0 голосов
/ 16 января 2009

Я не MVP, но Google нашел это. Может быть, они вам помогут:

http://www.mvps.org/access/general/gen0041.htm http://forums.devarticles.com/microsoft-access-development-49/compact-database-via-vba-24958.html

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