|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
21.06.2010, 23:38 | #1 |
Пользователь
Регистрация: 29.09.2007
Сообщений: 95
|
ADODB Connection, RecordSet и временные таблицы
Вечер добрый!
Есть пара вопросов, не могу разобраться. 1) У меня есть БД - файл .mdb в котором содержатся только таблицы, расположен на сетевом диске общего доступа (пусть будет 1.mdb). Создается другой файл .mdb (который после завершения разработки будет конвертирован в .mde и разослан пользователям для работы, в данный момент 2.mdb). В нем для передачи и получения данных устанавливается связь с БД, в которой таблице, с помощью ADO. Чтобы постоянно не работать с данными через сеть, предполагается сначала вытянуть из исходной БД все нужные таблицы (справочники), а затем, работая уже с ними как с локальными, передавать конечные данные в сетевую базу. Для определенности назовем таблицу-справочник main, а временную таблицу, в которую импортируем данные, - tmp, текущее соединение - cn. Если воспользоваться процедурой: Код:
Следующий код не приводит ни к чему: Код:
2) Если напрямую никак, то приходит на ум мысль перекидывать через RecordSet. Тогда вопрос в следующем: каков порядок действий? Открыть соединение, открыть рекордсет, закрыть соединение, забить "построчно" временную таблицу, используя CurrentDb.Execute? Бонус: есть способ в одно действие перекинуть рекордсет в таблицу или только через цикл по записям? Всем заранее спасибо! |
22.06.2010, 01:11 | #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, "..или только через цикл по записям.." - печально, но таблицам БД без перебора рекордсета не обойтись. Евгений. |
22.06.2010, 08:14 | #3 |
Пользователь
Регистрация: 29.09.2007
Сообщений: 95
|
Евгений, в очередной раз премного благодарен! Необходимо снизить нагрузку на сеть и повысить скорость обработки запросов, поэтому решил покопаться поглубже в Access и запутался. Теперь вроде бы все ясно, буду пробовать.
|
22.06.2010, 19:44 | #4 |
Пользователь
Регистрация: 29.09.2007
Сообщений: 95
|
Как все интересно оказалось.
Код:
Код:
|
22.06.2010, 19:57 | #5 |
Участник клуба
Регистрация: 10.08.2009
Сообщений: 1,796
|
Рекомендую почитать о команде RefreshDatabaseWindow, думаю она Вам будет полезна.
Евгений. |
22.06.2010, 20:03 | #6 |
Пользователь
Регистрация: 29.09.2007
Сообщений: 95
|
Евгений, я ее пробовал, но все равно была та же ошибка. Я при RefreshDatabaseWindow я следил за списком таблиц, он не изменялся. Я вот поэтому и спросил.
update: хотя вопрос пока что отменяется, у меня там обработчик ошибок, возможно, не в том месте. Так что завтра проверю, может и работает этот метод. Последний раз редактировалось AdrenalinE; 22.06.2010 в 22:06. |
22.06.2010, 22:07 | #7 |
Участник клуба
Регистрация: 10.08.2009
Сообщений: 1,796
|
Судя по SQL конструкции "... IN {полный путь к файлу 2.mdb} FROM main" она выполняется в "серверном" файле БД (1.mdb), я уже обращал Ваше внимание, что результат будет лучше если "..эта конструкция будет выполняться на стороне клиента..", во всяком случае запускаться в клиентском приложении.
также на стороне клиента может быть выполнена команда - CurrentDb.TableDefs.Refresh и RefreshDatabaseWindow выполняемая в клиентской БД (2.mdb), должна отображать ("перерисовывать") все изменения в объектах БД. надеюсь у Вас всё получится. Евгений. |
22.06.2010, 22:44 | #8 |
Пользователь
Регистрация: 29.09.2007
Сообщений: 95
|
Евгений, спасибо за советы.
До меня только что дошло, в чем коренное отличие конструкции: Код:
Код:
|
23.06.2010, 20:22 | #9 |
Пользователь
Регистрация: 29.09.2007
Сообщений: 95
|
Точно, обработчик ошибки не там стоял, все отлично работает с RefreshDatabaseWindow.
И с прямым вытягиванием данных через Код:
|
23.06.2010, 20:39 | #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 |