C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
BatchMove для ADO
Женя
  Отправлено: 02.08.2004, 09:15


Не зарегистрирован







Наверное просто лето и мозги плавятся, но что то ни как не могу сообразить. Задачка такая: Есть два Аксессовых файла, в каждом свои таблицы (форматы, само собой разные) Задача — перекачать содержимое таблицы одного фала — в таблицу в другом файле. Проблема вся в том, что файлики эти весят по полгига и если просто в тупую переборкой (while (!t1->eof) t1->next()wink.gif то просто переборка без записи длится минут 20. А мне надо быстрее бы sad.gif Потому что таких долбичек штук 10-15. Я подумал сделать через SQL запрос — но так и не разобрался с синтаксисом обращения к таблицам, на которые НЕ ссылается ConnectionString.
Plese, Help!!!
Gedeon
Отправлено: 02.08.2004, 16:02


Ветеран

Группа: Модератор
Сообщений: 1742



Если надо быстродействие, то только через SQL запрос.
Коннэкт через ADOConnection, Запросы через ADOQuery, ADOCommand. Более подробно не знаю что ответить, дальше только Вам понятно че за таблицы и т.д. cool.gif
Запрос д. выглядеть примерно так 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.
Кабы знать бы где синтаксис подсмотреть... sad.gif

Отредактировано Женя — 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) В том то и хрень sad.gif
Я не знаю как в одном запросе на два 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



Вот и именно. Изобретаю sad.gif
Но если в одну базу читать, а потом в другу писать, то долго получается sad.gif
Я все таки думал, что в самом SQL-запросе можно как то обратиться к другой базейке, ан нет получается? sad.gif
А в VBA я ни разу не грамотный sad.gif
ПридеЦЦа разбираться что ли...
Я так понимаю, надо будет состряпать какой нита модуль на аксесе а помтом к нему обратиться, или сразу непосреццна соединиться с ним как с OLE-сервером и пропинать командами...?
Може есть где линка, чтобы коротенько, минут за 40 въехать, как такие "избы делают" ? smile.gif

Отредактировано Женя — 02/08/2004, 18:07
AVC
Отправлено: 02.08.2004, 17:08


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE
Но если в одну базу читать, а потом в другу писать, то долго олучается

Можно поиграться с буферами, но все равно я думаю будет долго.

QUOTE
надо будет состряпать какой нита модуль на аксесе а помтом к нему обратиться

Вариантов море. Можно сделать запрос, можно макрос, можно функцию можно ... А можно просто заюзать Access и сделать все в нем.

Лично я бы шел по пути из одной читать, в другую писать (но это мое личное мнение).
Женя
Отправлено: 02.08.2004, 17:30


Ученик-кочегар

Группа: Участник
Сообщений: 7



Из одной читать. Очень долго, а табличек много, если загрузка всей инфы будет идти часа три-четре, а так по прикидкам получается, меня ж порвут как грелку smile.gif Если оно только перебирается 20 минут, то скока же оно пысаться то будет, а ADO cacheupdated наверное то и нету sad.gif
AVC
Отправлено: 03.08.2004, 09:40


Ветеран

Группа: Модератор
Сообщений: 1583



Может проще копировать файлы?
Женя
Отправлено: 03.08.2004, 11:43


Ученик-кочегар

Группа: Участник
Сообщений: 7



Файлы копировать низя. У них структура разная, а кроме того — некоторые поля в приемнике должны быть результатами вычислений полей источника sad.gif
Тут или какой то хитрый синаксис запроса, который позволяет обратиться к произвольной БД мимо Connection — или либо в ЗАГС либо к Прокурору smile.gif
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



Похоже на то... Жаль только, что без аксеса не обойтись.

Вернуться в Работа с базами данных в C++Builder