![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 29.09.2007
Сообщений: 95
|
![]()
Вечер добрый!
Есть пара вопросов, не могу разобраться. 1) У меня есть БД - файл .mdb в котором содержатся только таблицы, расположен на сетевом диске общего доступа (пусть будет 1.mdb). Создается другой файл .mdb (который после завершения разработки будет конвертирован в .mde и разослан пользователям для работы, в данный момент 2.mdb). В нем для передачи и получения данных устанавливается связь с БД, в которой таблице, с помощью ADO. Чтобы постоянно не работать с данными через сеть, предполагается сначала вытянуть из исходной БД все нужные таблицы (справочники), а затем, работая уже с ними как с локальными, передавать конечные данные в сетевую базу. Для определенности назовем таблицу-справочник main, а временную таблицу, в которую импортируем данные, - tmp, текущее соединение - cn. Если воспользоваться процедурой: Код:
Следующий код не приводит ни к чему: Код:
2) Если напрямую никак, то приходит на ум мысль перекидывать через RecordSet. Тогда вопрос в следующем: каков порядок действий? Открыть соединение, открыть рекордсет, закрыть соединение, забить "построчно" временную таблицу, используя CurrentDb.Execute? Бонус: есть способ в одно действие перекинуть рекордсет в таблицу или только через цикл по записям? Всем заранее спасибо! |
![]() |
![]() |
![]() |
#2 |
Участник клуба
Регистрация: 10.08.2009
Сообщений: 1,796
|
![]()
Здравствуйте AdrenalinE.
Судя по фразам "..файл .mdb в котором содержатся только таблицы, расположен на сетевом диске.." и "..предполагается.. вытянуть из исходной БД .." - "cn.Execute ...." должно выполняется в клиентском приложении. 1. cn.Execute "SELECT * INTO tmp FROM main" - однозначно выполняется только в одной БД к которой выполнено подключение. Прилинковав к "клиентской" БД (2.mdb), таблицу сетевой БД (1.MDB) эта конструкция будет выполняться на стороне клиента и с применением DAO: CurrentDB.Execute "SELECT * INTO tmp FROM main" соответственно вторая SQL конструкция: "SELECT * INTO tmp IN {полный путь к файлу 2.mdb} FROM main" тоже должна быть работоспособна на стороне клиента если её видоизменить подобным образом: "SELECT * INTO tmp FROM main IN {полный путь к файлу 1.mdb}" Первый вариант подразумевает присутствие в БД прилинкованой таблицы, но если обращение к ней будет не постоянным, нагрузки на сеть не будет, в любом случае выбор варианта за автором. 2. "..порядок действий.." - Открыть соединение, открыть рекордсет, забить "построчно" временную таблицу, закрыть рекордсет, закрыть соединение. "..есть способ в одно действие перекинуть рекордсет в таблицу.." только в таблицу листа Excel применяя ADO, "..или только через цикл по записям.." - печально, но таблицам БД без перебора рекордсета не обойтись. Евгений. |
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 29.09.2007
Сообщений: 95
|
![]()
Евгений, в очередной раз премного благодарен! Необходимо снизить нагрузку на сеть и повысить скорость обработки запросов, поэтому решил покопаться поглубже в Access и запутался. Теперь вроде бы все ясно, буду пробовать.
|
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 29.09.2007
Сообщений: 95
|
![]()
Как все интересно оказалось.
Код:
Код:
|
![]() |
![]() |
![]() |
#5 |
Участник клуба
Регистрация: 10.08.2009
Сообщений: 1,796
|
![]()
Рекомендую почитать о команде RefreshDatabaseWindow, думаю она Вам будет полезна.
Евгений. |
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 29.09.2007
Сообщений: 95
|
![]()
Евгений, я ее пробовал, но все равно была та же ошибка. Я при RefreshDatabaseWindow я следил за списком таблиц, он не изменялся. Я вот поэтому и спросил.
![]() update: хотя вопрос пока что отменяется, у меня там обработчик ошибок, возможно, не в том месте. Так что завтра проверю, может и работает этот метод. ![]() Последний раз редактировалось AdrenalinE; 22.06.2010 в 22:06. |
![]() |
![]() |
![]() |
#7 |
Участник клуба
Регистрация: 10.08.2009
Сообщений: 1,796
|
![]()
Судя по SQL конструкции "... IN {полный путь к файлу 2.mdb} FROM main" она выполняется в "серверном" файле БД (1.mdb), я уже обращал Ваше внимание, что результат будет лучше если "..эта конструкция будет выполняться на стороне клиента..", во всяком случае запускаться в клиентском приложении.
также на стороне клиента может быть выполнена команда - CurrentDb.TableDefs.Refresh и RefreshDatabaseWindow выполняемая в клиентской БД (2.mdb), должна отображать ("перерисовывать") все изменения в объектах БД. надеюсь у Вас всё получится. Евгений. |
![]() |
![]() |
![]() |
#8 |
Пользователь
Регистрация: 29.09.2007
Сообщений: 95
|
![]()
Евгений, спасибо за советы.
До меня только что дошло, в чем коренное отличие конструкции: Код:
Код:
![]() |
![]() |
![]() |
![]() |
#9 |
Пользователь
Регистрация: 29.09.2007
Сообщений: 95
|
![]()
Точно, обработчик ошибки не там стоял, все отлично работает с RefreshDatabaseWindow.
И с прямым вытягиванием данных через Код:
|
![]() |
![]() |
![]() |
#10 |
Участник клуба
Регистрация: 10.08.2009
Сообщений: 1,796
|
![]()
Здравствуйте AdrenalinE.
"..Тогда не понимаю, зачем вообще бывает нужно устанавливать связь.." ![]() и действительно зачем паровоз если и велосипед едет. ![]() они в разных "весовых категориях". Евгений. |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
временные функции | Assemblerru | Общие вопросы C/C++ | 2 | 04.04.2010 12:43 |
не создать набор запесей (ADODB.Recordset) | МаМи | Microsoft Office Access | 1 | 22.02.2010 11:19 |
Работа с объектом ADODB.Stream | voam | Microsoft Office Excel | 4 | 15.12.2009 23:31 |
Adodb+smarty проблема с циклом while | Oleg_453 | PHP | 2 | 02.12.2008 14:41 |
Временные задержки | dgoc | Помощь студентам | 1 | 05.12.2007 05:03 |