| Женя | 
   Отправлено: 02.08.2004, 09:15 | 
 
 
 | 
  
Не зарегистрирован
 
 
 
 
 
  
  
 | 
 Наверное просто лето и мозги плавятся, но что то ни как не могу сообразить. Задачка такая: Есть два Аксессовых файла, в каждом свои таблицы (форматы, само собой разные) Задача — перекачать содержимое таблицы одного фала — в таблицу в другом файле. Проблема вся в том, что файлики эти весят по полгига и если просто в тупую переборкой (while (!t1->eof) t1->next()  то просто переборка без записи длится минут 20. А мне надо быстрее бы   Потому что таких долбичек штук 10-15. Я подумал сделать через SQL запрос — но так и не разобрался с синтаксисом обращения к таблицам, на которые НЕ ссылается ConnectionString. 
Plese, Help!!! 
 | 
  | 
| Gedeon | 
| Отправлено: 02.08.2004, 16:02 | 
 
 
 | 
 
  
Ветеран 
 
Группа: Модератор 
Сообщений: 1742 
  
  
 | 
 Если надо быстродействие, то только через SQL запрос. 
Коннэкт через ADOConnection, Запросы через ADOQuery, ADOCommand. Более подробно не знаю что ответить, дальше только Вам понятно че за таблицы и т.д.   
Запрос д. выглядеть примерно так HELP 
| SQL  |  INSERT INTO назначение [(поле_1[, поле_2[, ...]])] 
[IN внешняяБазаДанных] 
SELECT [источник.]поле_1[, поле_2[, ...] 
FROM выражение  |  
 
  
Отредактировано Gedeon — 02/08/2004, 17:09
 | 
  | 
| Женя | 
| Отправлено: 02.08.2004, 16:18 | 
 
 
 | 
  
Ученик-кочегар 
 
Группа: Участник 
Сообщений: 7 
  
  
 | 
 Так вот в этом то и проблема. То что запрос — это понятно. Я не знаю как правильно обратиться к той таблице, на которую не ссылается Connection, в которой находятся данные, т.е есть источник 
C:\price.mdb В этой базе есть таблица tab1. 
Есть приемник D:\dest.mdb, там таблица dst1 
Если Connection ссылается на C:\price.mdb , то я не знаю как обратиться к dst1. ВотЪ 
Пробовал D:\dest.mdb{.| / | \ |}dst1. 
Кабы знать бы где синтаксис подсмотреть...  
  
Отредактировано Женя — 02/08/2004, 17:36  | 
  | 
| AVC | 
| Отправлено: 02.08.2004, 16:33 | 
 
 
 | 
  
Ветеран 
 
Группа: Модератор 
Сообщений: 1583 
  
  
 | 
 | QUOTE  |  | Есть приемник D:\dest.mdb, там таблица dst1 |  
  
Примерно так 
Соединение настраиваем на D:\dest.mdb типа Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\dest.mdb;Persist Security Info=False
  
В тексте запроса пишем Select * From dst1
  
| QUOTE  |  | Кабы знать бы где синтаксис подсмотреть...  |  
  
Синтаксис просто смотреть прямо у Acess'а. Рисуйте запросы и просматривайте их текст в режиме SQL.  | 
  | 
| Женя | 
| Отправлено: 02.08.2004, 16:37 | 
 
 
 | 
  
Ученик-кочегар 
 
Группа: Участник 
Сообщений: 7 
  
  
 | 
 Это понятно, но Connection в это время должен смотреть на ДРУГУЮ базу (price.mdb) В том то и хрень   
Я не знаю как в одном запросе на два mdb-шника сесть.
  
Отредактировано Женя — 02/08/2004, 17:40  | 
  | 
| AVC | 
| Отправлено: 02.08.2004, 16:49 | 
 
 
 | 
  
Ветеран 
 
Группа: Модератор 
Сообщений: 1583 
  
  
 | 
 | QUOTE  |  | как в одном запросе на два mdb-шника сесть |  
  
В одном ни как, так как это свойство DataSet'а. Поэтому в одной базе читаем, а в другой пишем.
  
P.S. 
1. у Access'а возможность встраивать одну базу в другую. Может проще написать код на VBA? 
2. Вы изобретаете Datapump. 
 | 
  | 
| Женя | 
| Отправлено: 02.08.2004, 17:00 | 
 
 
 | 
  
Ученик-кочегар 
 
Группа: Участник 
Сообщений: 7 
  
  
 | 
 Вот и именно. Изобретаю   
Но если в одну базу читать, а потом в другу писать, то долго получается   
Я все таки думал, что в самом SQL-запросе можно как то обратиться к другой базейке, ан нет получается?   
А в VBA я ни разу не грамотный   
ПридеЦЦа разбираться что ли... 
Я так понимаю, надо будет состряпать какой нита модуль на аксесе а помтом к нему обратиться, или сразу непосреццна соединиться с ним как с OLE-сервером и пропинать командами...? 
Може есть где линка, чтобы коротенько, минут за 40 въехать, как такие "избы делают" ?  
  
Отредактировано Женя — 02/08/2004, 18:07  | 
  | 
| AVC | 
| Отправлено: 02.08.2004, 17:08 | 
 
 
 | 
  
Ветеран 
 
Группа: Модератор 
Сообщений: 1583 
  
  
 | 
 | QUOTE  |  |  Но если в одну базу читать, а потом в другу писать, то долго олучается  |  
  
Можно поиграться с буферами, но все равно я думаю будет долго.
  
| QUOTE  |  | надо будет состряпать какой нита модуль на аксесе а помтом к нему обратиться |  
  
Вариантов море. Можно сделать запрос, можно макрос, можно функцию можно ... А можно просто заюзать Access и сделать все в нем.
  
Лично я бы шел по пути из одной читать, в другую писать (но это мое личное мнение).  | 
  | 
| Женя | 
| Отправлено: 02.08.2004, 17:30 | 
 
 
 | 
  
Ученик-кочегар 
 
Группа: Участник 
Сообщений: 7 
  
  
 | 
 Из одной читать. Очень долго, а табличек много, если загрузка всей инфы будет идти часа три-четре, а так по прикидкам получается, меня ж порвут как грелку   Если оно только перебирается 20 минут, то скока же оно пысаться то будет, а ADO cacheupdated наверное то и нету    | 
  | 
| AVC | 
| Отправлено: 03.08.2004, 09:40 | 
 
 
 | 
  
Ветеран 
 
Группа: Модератор 
Сообщений: 1583 
  
  
 | 
 Может проще копировать файлы?  | 
  | 
| Женя | 
| Отправлено: 03.08.2004, 11:43 | 
 
 
 | 
  
Ученик-кочегар 
 
Группа: Участник 
Сообщений: 7 
  
  
 | 
 Файлы копировать низя. У них структура разная, а кроме того — некоторые поля в приемнике должны быть результатами вычислений полей источника   
Тут или какой то хитрый синаксис запроса, который позволяет обратиться к произвольной БД мимо Connection — или либо в ЗАГС либо к Прокурору    | 
  | 
| AVC | 
| Отправлено: 03.08.2004, 13:00 | 
 
 
 | 
  
Ветеран 
 
Группа: Модератор 
Сообщений: 1583 
  
  
 | 
 | QUOTE  |  | какой то хитрый синаксис запроса, который позволяет обратиться к произвольной БД мимо Connection |  
  
Такого не бывает за исключением старых БД, разбитых на файлы (DBF, Paradox...). 
Самый быстрый вариант — управлять на уровне файлов. но я не знаю как это сделать и не советую этим заниматься.
  
Вариант через Access (пример) 
В одной базе есть таблица TEST. 
В другой базе 
1. создаем связь на базу_1.таблицу_TEST с именем TEST 
2. создаем таблицу приемник допустим Ttt 
3. Запрос (результат построителя запросов Access) 
| SQL  |  INSERT INTO Ttt SELECT TEST.* 
FROM TEST LEFT JOIN Ttt ON TEST.KOD = Ttt.KOD 
WHERE (((Ttt.KOD) Is Null)); 
 |  
  
Переносит из db1.TEST в db2.Ttt записи для которых поле KOD не найдено в db2.Ttt
  
Замерьте скорость и ориентируйтесь на неё. Вряд ли что то другое будет значительно быстрее. 
 | 
  | 
| Женя | 
| Отправлено: 03.08.2004, 13:27 | 
 
 
 | 
  
Ученик-кочегар 
 
Группа: Участник 
Сообщений: 7 
  
  
 | 
 Похоже на то... Жаль только, что без аксеса не обойтись.  | 
  |