Женя |
Отправлено: 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
|
Похоже на то... Жаль только, что без аксеса не обойтись. |
|