2012-06-21 2 views
2

У меня есть приложение, которое создает базу данных Jet во время выполнения и импортирует записи ~ 100 тыс., Чтобы я мог использовать индексирование по соображениям производительности (1 минута против почти 10 не используя базу данных Jet).Доступ к «ремонту» нарушает несколько сложный запрос

База данных создается с использованием расширения ADO Extensibility в Excel, и все работает отлично. Однако моя проблема возникает, когда я открываю файл MDB в интерфейсе Access, он автоматически начинает «восстанавливать» базу данных.

Данные сохраняются после «ремонта», однако мой основной выходной запрос не может быть просмотрен в Access, поскольку он сообщает мне, что он не может представлять объединения, и если я затем просмотрю его в SQL, необходимые соединения не будут там, и запрос больше не может работать. Это все равно, если я разрешу ему «восстановить», но не открывать этот запрос, т. Е. Это «ремонт», который прерывает запрос, а не попытку просмотреть его в Access. Самое забавное в том, что я использовал конструктор запросов GUI Access для построения SQL, поскольку моя жизнь слишком короткая, чтобы беспокоиться о том, что это сумасшедший стиль брекетинга, но потом он решает, что он слишком сложный для себя?

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

Это не является нарушителем сделки для меня, поскольку мое решение заключается в том, чтобы сделать MDB скрытым и сообщить пользователям, которые могут видеть его, чтобы не открывать его.

Тем не менее, мне бы очень хотелось, чтобы база данных открывалась, и мне не нужно было ее скрывать. Поэтому мой вопрос заключается в том, есть ли способ предотвратить «ремонт» MDB автоматически?

Спасибо!

+0

Должна быть предусмотрена возможность создания БД, которая не нуждается в ремонте. Возможно, вы могли бы разместить небольшой код? – Fionnuala

+0

Мой код для создания базы данных выглядит следующим образом, и я проверил, что этого достаточно для принудительного восстановления: Set objCat = CreateObject ("ADOX.Catalog") objCat.Create ConnectionString() Что мне пришло в голову, что я создаю MDB, но открываю Access 2007, и это все, что у меня есть. Возможно, это проблема? – CrazyHorse

+0

Что такое ConnectionString()? – Fionnuala

ответ

1

Microsoft Access «восстанавливает» файл при открытии, поскольку ему не хватает некоторых таблиц, специфичных для пользовательского интерфейса Microsoft Access. Поскольку вы создали файл MDB напрямую с помощью OLEDB с Microsoft.ACE.OLEDB.12.0, эти таблицы не присутствуют и должны быть созданы, когда Access открывает MDB в первый раз. Существует несколько способов обойти это:

1) Назовите MDB чем-то иным, чем .mdb - например: MyAccessDatabase.mad - это предотвратит использование Windows Microsoft для открытия файла.

2) Используйте COM +, чтобы открыть экземпляр Microsoft Access, и создать файл .MDB. Этот .MDB-файл будет иметь все необходимые таблицы и не нуждается в исправлении файла.

FYI, когда Microsoft Access открывает MDB, который нуждается в ремонте таким образом, он проверит все объекты QueryDef для недопустимого SQL и исправьте их по мере необходимости. Вот почему ваш «сложный» запрос ломается.

+0

Спасибо, это отличный ответ. Я не могу работать, полагая, что все пользователи будут иметь доступ, поэтому не могут реализовать ваше предложение в 2), но теперь я, по крайней мере, знаю, что вызывает проблему, это дает мне душевное спокойствие, что мне просто нужно будет пересчитать SQL из моего «сложного» запроса, если когда-либо открывался .MDB. еще раз спасибо – CrazyHorse