Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/55: Рейтинг темы: голосов - 55, средняя оценка - 4.89
 Аватар для Kkarn
902 / 292 / 50
Регистрация: 02.12.2014
Сообщений: 1,229

Ошибка 3048: открытие дополнительных баз данных невозможно

04.04.2015, 13:25. Показов 12230. Ответов 19

Студворк — интернет-сервис помощи студентам
Ну вот, кажется, настал и мой черед поморочить себе голову с этой дурацкой ошибкой...

Предыстория.

Создал для клиента замечательную базу склада с учетом всех его пожеланий.

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

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

На каждой из этих форм имелось по нескольку вкладок с разными подформами для удобного представления данных (о заказе, товаре, поставщике и т.д.).

Так вот, в идеале все работало замечательно.

А когда база "ушла в работу" - тогда и начала вылазить эта вот ДУРАЦКАЯ "Ошибка 3048: открытие дополнительных баз данных невозможно".

Раньше я с ней, слава богу, не сталкивался, поскольку до этого как-то не приходилось делать разделенные базы данных, все больше обходился стандартным вариантом с одним файлом базы...

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

Из прочитанного на других форумах можно выделить такие главные моменты (далее будут цитаты):

"Ошибка 3048 Открытие дополнительных баз данных невозможно"
кроется в JET, не зависимо от версии самой JET. В JET заложено ограничение на количество одновременно открытих рекордсетов основаных именно на связанных таблицах. Число одновременно открытых рекордсетов около 20 максимум. При попытке открыть 21 рекордсет возникает указанная ошибка. 2 метода преодоления:
1. Вообще не использовать связанные таблицы, а применять другие методы для связи приложения с базой.
2. Контролировать количество одновременно открытых рекордсетов (При открытии нового отчёта закрывать открытый предыдущий и программно отвязывать подчинённые формы от источников данны, а при закрытии отчета восстанавливать связи форм с источниками данных) Но всё это конечно дыбилизм чистой воды.
Хоть MSAccess достаточно мощная и простая СУБД такие грабли которые подсовует Били и его компания с одной стороны веселят, а с другой навевают на размышления!!!!.
"Открытие дополнительных баз данных не возможно" - это Ахилессова пята Аксесса.
Практически, из-за этого ограничения невозможно создавать удобные и могучие интерфейсы.
Приходится постоянно ограничиваться. О чём только думали разработчики Аксесса, когда
закладывали это ограничение.
Также мне понравилась одна "мистическая" история, продолжения которой я так и не нашел нигде. Вот она:
Попытаюсь быть немного полезен. лет 5 назад начале создания своей большой базы неоднократно нарывался на сообщение типа открытие дополнительных баз данных невозможно, причем это происходило в не зависимости что открывалось, то-ли много таблиц или последовательно много запросов или вперемежку, или одновременно открывалось много форм или отчетов.

Способ был найден в просторах ИНЕТА ВСЕМОГУЩЕГО - в параметрах реестра изменялось 3-4 параметра ограничивающих количество открытых объектов в акцессе (именно объектов не файлов) и после этого исправления открывал одновременно более 50 таблиц и запросов просто немерено, единственная беда в том что забыл адресочек в инете и запись на бумаге утрачена, но это реально работало.
Сейчас нет проблем с данным вопросом потому что нет нет необходимости открытия большого количества объектов. Очень самому бы хотелось найти этот источник информации пока не получается, но может кому-то повезет найти Так не забудьте про братьев с той же проблемой!
Конечно, если бы она оказалась правдой - было бы замечательно решить данную проблему "одним махом" правкой реестра, но... Повторюсь, продолжения ее я так и не нашел.

В принципе, на прочитанных мною форумах я нашел несколько советов по поводу если не преодоления, то хотя бы уменьшения частоты появления данной ошибки, но... Ей богу, я не считаю хорошим советом "Старайтесь делать меньше форм" - звучит глупо как минимум.

Если учесть, что формы я создавал ОЧЕНЬ продуманными с точки зрения логики подачи информации и удобства для пользователя (мы с заказчиком каждую из них "рожали в муках")), то было бы как минимум досадно (и это мягко сказано) переделывать их "в угоду" ограничениям JET...

Почему-то не нашел поиском темы про данную ошибку на этом форуме - скорее всего плохо искал. Буду очень признателен за любые возможные советы и "наводку" на что почитать по данному вопросу, хотя, повторюсь, все уже прочитанное приводит к довольно грустным выводам...
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.04.2015, 13:25
Ответы с готовыми решениями:

Открытие дополнительных баз данных невозможно
Доброго времени суток! У меня тут возникла непонятная проблема. Я создаю запрос и в каждом поле запроса есть формула суммирования по...

"Открытие дополнительных баз невозможно"
Уважаемые форумчане, подскажите как избавиться от сообщения "Открытие дополнительных баз невозможно", которое выходит при запуске...

Открытие других баз данных
Как реализовать с помощью компонента DataGridView открытие нескольких баз данных.Т.е. Программа с помощью процедур подключается к уже...

19
 Аватар для Настаев
65 / 51 / 2
Регистрация: 15.12.2010
Сообщений: 297
05.04.2015, 12:45
Я тоже наталкивался на такую запись в реестре... Пороюсь у себя Мб найду
0
 Аватар для Kkarn
902 / 292 / 50
Регистрация: 02.12.2014
Сообщений: 1,229
05.04.2015, 13:59  [ТС]
Настаев, Я читал про параметр реестра MaxLockPerFile (вроде бы так называется), у меня он по умолчанию стоит 9500, пробовал менять - не помогает.
0
 Аватар для Настаев
65 / 51 / 2
Регистрация: 15.12.2010
Сообщений: 297
05.04.2015, 15:06
Просто догадка: может этот параметр для 64-битного офиса хранится в отдельной ветке?
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ Microsoft\Office\15.0

Добавлено через 8 минут
Я тут выяснил, что этот параметр на самом деле служит для работы с большими файлами (или таблицами)
А на количество открытых рекордсетов никак не влияет (я проверил с помощью отдельной процедуры)
http://support.microsoft.com/en-us/kb/286153/ru
0
0 / 0 / 0
Регистрация: 27.03.2015
Сообщений: 5
05.04.2015, 15:12
Цитата Сообщение от Настаев Посмотреть сообщение
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ Microsoft\Office\15.0
yt nj njxyj
_
0
 Аватар для Kkarn
902 / 292 / 50
Регистрация: 02.12.2014
Сообщений: 1,229
07.04.2015, 10:53  [ТС]
Да, этот параметр - явно не то. Да я особо и не надеюсь на правку реестра, в общем-то...
на других форумах я начитался кучу советов по поводу того, чтобы "не держать открытыми рекордсеты", при запуске базы объявить объектную переменную для CurrentDB и использовать ее везде вместо CurrentDB и так далее.

Вчера попробовал, объявил-позаменял, не помогло.

Также есть совет касательно субформ на вкладках. Мол, если вкладка неактивна, то нужно делать SourceObject="". Вот в этом моменте хотелось бы подробностей...

У меня при старте базы загружаются в скрытом виде пара форм, касающихся заказов, эти формы содержат вкладки (состав заказа, история оплаты и т.д.), и потом во время работы при двойном клике на строке заказа - открывается клон данной формы именно для этого заказа (т.к. реализована многоэкземплярность форм).

Я подозреваю, что основная причина появления этой ошибки у меня в базе - именно в этих двух формах, которые содержат вкладки с субформами, потому хотелось бы подробностей, как правильно управлять SourceObject данных субформ в зависимости от активности содержащей их вкладки?..
0
Эксперт MS Access
26827 / 14507 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
07.04.2015, 12:31
Цитата Сообщение от Kkarn Посмотреть сообщение
Я подозреваю, что основная причина появления этой ошибки у меня в базе - именно в этих двух формах, которые содержат вкладки с субформами
Как предположение это возможно. Но надо проверять. Попробуйте на событии Изменение (Change) набора вкладок менять источник подформ. Типа такого
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub НаборВкладок_Change()
    Select Case Me.НаборВкладок
        Case 0 'Первая вкладка
              Me.Подформа1.SourceObject="ИмяФормы1"
              Me.Подформа2.SourceObject=""
              Me.Подформа3.SourceObject=""
        Case 1 'Вторая вкладка
              Me.Подформа1.SourceObject=""
              Me.Подформа2.SourceObject="ИмяФормы2"
              Me.Подформа3.SourceObject=""
        Case 2 'Третяя вкладка
              Me.Подформа1.SourceObject=""
              Me.Подформа2.SourceObject=""
              Me.Подформа3.SourceObject="ИмяФормы3"
    End Select
End Sub
Ну и конечно, на событии загрузки формы задавать SourceObject только тем подформам, которые видны при открытии. Остальным пустую строку в SourceObject
2
 Аватар для Kkarn
902 / 292 / 50
Регистрация: 02.12.2014
Сообщений: 1,229
07.04.2015, 15:51  [ТС]
mobile, Все гениальное - просто)))... Спасибо большое, вечером буду проверять, но мне кажется, что это - реально то, чего мне не хватало! В очередной раз очень признателен за совет)
0
шапоклякистка 8-го дня
 Аватар для texnik-san
3681 / 2241 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
26.06.2015, 15:43
Столкнулась с этой же ошибкой при вообще загадочных обстоятельствах. База создана в Аксес 2007, открывается в Аксес 2010 32-разрядная. База разделена, ошибка появляется только когда файл с таблицами находится на сервере в расшаренной папке. При работе с тем же файлом, скопированным на локальный компьютер, при всех прочих идентичных обстоятельствах - ошибка не возникает.

Подробней об обстоятельствах.
Ошибка появляется при открытии формы, содержащей две подформы-графика, и две подформы-поясняющие данные к графикам. После нажатия "ОК" на сообщении об ошибке форма продолжает работать как ни в чем ни бывало, отображать графики и цифры, так что единственная проблема - моральная травма пользователя.

В момент открытия формы графиков одновременно может быть открыто от 2 до 5 других форм, некоторые со вложенными, т.е. да, общее число рекордсетов вполне может быть большим. С другой стороны, если вместо формы с графиками открывать другие формы, даже в очень большом количестве, и даже с большим числом вложенных - ошибка НЕ возникает.

Есть какие-то рациональные объяснения или хотя бы идеи?
0
Эксперт MS Access
26827 / 14507 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
26.06.2015, 18:22
Предположительно, создается слишком большое число подключений к БД. Но пока создается сообщение, система успевает отрегулировать ситуацию и, хотя сообщение об ошибке есть, самой ошибки уже нет.
Общего, единого рецепта нет. Но чаще всего помогает:
- закрытие неиспользуемых рекордсетов: переменнаярекордсета=Nothing
- вместо Currentdb создание копии: set db=Currentdb. Особенно, если сделать переменную db публичной и инициировать один раз при открытии БД. А во всех процедурах вместо Currentdb использовать db

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

Добавлено через 59 минут
Ну и в свете предыдущих решений также можно предложить последовательную загрузку форм с графиками.

Лишить подформы источника и погружать SourceObject подформ на событии открытия главной формы, но по таймеру с секундной задержкой. В Open главной пишем Me.TimerInterval=500. В процедуре на событии таймера:
Visual Basic
1
2
3
4
Static n
n=n+1
If (n mod 2)=0 Then Me.ПерваяПодформа.SourceObject="ПерваяПодформа"
If (n mod 4)=0 Then Me.ВтораяПодформа.SourceObject="ВтораяПодформа"
Если загрузка с задержкой пройдет, то потом можно экспериментировать с временем задержки, уменьшая ее до приемлемой.
1
шапоклякистка 8-го дня
 Аватар для texnik-san
3681 / 2241 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
26.06.2015, 19:30
Спасибо, обе идеи ценные, возьму на вооружение.
0
459 / 246 / 15
Регистрация: 29.10.2014
Сообщений: 1,084
27.06.2015, 13:30
Ну если обязательно хотите открывать все формы сразу (что сам Акс не рекомендует),хотя бы в случае чтения данных создавайте формы, не связанные с источниками данных (свободные формы), используя свои модули класса.

Добавлено через 31 минуту
Я думаю суть дела вот в чем. Положим имеем две формы, в качестве источника данных которых одна и та же таблица. В локальном режиме конфликта нет - драйвер Акса знает, какая форма в данный момент активна. Изменения в одной форме отражаются в таблице и в другой форме при ее активизации. Когда пользователей много, с какой формой прикажете серверу связывать таблицу даже у одного пользователя? Ведь сервер не знает, какая из форм активна. А когда пользователей много, форме какой базы клиента отдать управление таблицей? Поэтому жесткий отказ. Нужно проверить-все формы должны иметь в кач источника данных запрос. Он выполняется однажды.
0
шапоклякистка 8-го дня
 Аватар для texnik-san
3681 / 2241 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
04.07.2015, 21:18
Цитата Сообщение от mobile Посмотреть сообщение
если сделать переменную db публичной и инициировать один раз при открытии БД.
Засела пробовать реализовать, и задумалась - "один раз при открытии БД" - это как/когда? обработка какого события?

Autoexec? OnLoad стартовой формы?

Или просто при каждой попытке использовать:

Visual Basic
1
if db is nothing then set db=Currentdb
годится?
0
Эксперт MS Access
26827 / 14507 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
04.07.2015, 21:41
Если ВСЕ процедуры снабжены обработкой ошибок и задействована Form_Error в каждой форме, то достаточно один раз на старте инициализировать переменную. Все, что пробъется через этот забор в любом случае требует нестандартных действий.

Но на этапе разработки часто приходится переводить форму в дизайн, останавливать процесс и публичная переменная переменная может исчезнуть. На этом этапе можно на лоад всех форм инициировать переменную Database.
1
шапоклякистка 8-го дня
 Аватар для texnik-san
3681 / 2241 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
04.07.2015, 22:05
Честно говоря, с Form_Error я знакома очень мало. Использовала пару раз, для обработки конкретной ошибки, о которой наперед знала, но это и все.

Не очень хорошо понимаю, как по этому событию определить, какой элемент и какое событие вызвало ошибку. И ставит в тупик, что параметр, ощначающий номер ошибки, иногда равен другому числу, чем Err.Number в элементе/событии, ошибку вызвавшем.
0
Эксперт MS Access
26827 / 14507 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
04.07.2015, 22:33
Событие Error возникает при ошибках формы. Это могут быть процессы не связанные с событиями, например отсутствие таблицы в источнике формы, хотя и описанной в скл-выражении. Или когда ошибка возникает в контроле, для которого нет процедуры событий. Например, деление на нуль в свободном вычисляемом поле.

Также, и это более сложный случай, в Form_Error может придти ошибка по стеку ошибок. Например, в некоторой процедуре стоит On Error Resume Next и ошибки подавляются. Но то же деление на нуль от этого не исчезнет, а передастся по стеку в вызывающую процедуру. Если такой нет, то следующим элементом стека обработки ошибок станет Form_Error. И не факт, что DataErr - параметр Form_Error - будет показывать именно деление на нуль, ведь при этом генерируются и многие иные события, которые тоже могут реагировать на ошибку и генерировать собственные в ответ.
1
5 / 4 / 1
Регистрация: 22.04.2015
Сообщений: 15
13.06.2019, 15:30
Цитата Сообщение от Kkarn Посмотреть сообщение
mobile, Все гениальное - просто)))... Спасибо большое, вечером буду проверять, но мне кажется, что это - реально то, чего мне не хватало! В очередной раз очень признателен за совет)
Удалось ли в итоге справиться с выскакивающими сообщениями "открытие дополнительных баз данных невозможно"???
Если удалось, то какой из методов помог?
0
Мы один, давай на "ты"
3858 / 1400 / 348
Регистрация: 16.06.2016
Сообщений: 3,298
13.06.2019, 17:41
Лучший ответ Сообщение было отмечено alexpro1979 как решение

Решение

Цитата Сообщение от МарсельМ Посмотреть сообщение
Если удалось, то какой из методов помог?
нужно закрывать все открытые наборы (Recordset)
0
1 / 1 / 0
Регистрация: 22.07.2014
Сообщений: 43
01.12.2019, 16:45
Всем привет.
1. А как можно посмотреть, сколько открыто баз на текущий момент?
2. Me![Form1].Form.RecordSource = ""
Такая конструкция открывает дополнительную базу или нет?
0
Эксперт MS Access
 Аватар для Eugene-LS
13198 / 5892 / 1510
Регистрация: 05.10.2016
Сообщений: 16,530
01.12.2019, 17:43
Цитата Сообщение от yam_job Посмотреть сообщение
. А как можно посмотреть, сколько открыто баз на текущий момент?
Не знаю, но думаю можно.
Сложно.
Простенько:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
    Dim objProcesses As Object
    Dim l&
    Set objProcesses = GetObject("winmgmts://" & Environ$("ComputerName") & _
                                 "/root/cimv2").ExecQuery("select * from Win32_Process where name='MSACCESS.EXE'")
 
    If Not objProcesses Is Nothing Then
        l = objProcesses.Count
    End If
 
    MsgBox "Запущено MS Access: " & l & "  процессов.", vbInformation
 
    Set objProcesses = Nothing
... но! - каждое запущенное приложение может открывать внешние базы данных ... Тут сложность.

2. Me![Form1].Form.RecordSource = "" Такая конструкция открывает дополнительную базу или нет?
Нет - не открывает, и даже наоборот (если форма единственная открытая и БД внешняя).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.12.2019, 17:43
Помогаю со студенческими работами здесь

Отображение Дополнительных Баз В Списке Адресов
Всем доброго времени суток! Столкнулся с тем, что требуется добавить дополнительную базу с данным пользователей и сделать так чтобы она...

Ошибка 40 и перенос баз данных
Здравствуйте, помогите, пожалуйста, с проблемой. Перенёс системные базы данных sql server 2012 на другой логический диск, в итоге теперь...

Ошибка. Импорт Баз Данных
Помогите.. Уже 2 сутку не могу допереть в чём проблем. У меня проблема.. Создал сайт на джумла (надо было для сесии.) Завтро сдать...

Ошибка при импорте баз данных
Здравствуйте. Дело в том что мне при импорте баз данных на сервер выдает ошибку. SQL-запрос: -- -- База данных: `rzq_minecraft` ...

Не выводит картинку из баз данных, в чем ошибка?
использую аналог этого кода https://codewithawa.com/posts/image-upload-using-php-and-mysql-database пытаюсь сделать загрузку и вывод...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru