Копирование таблиц

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Копирование таблиц

Сообщение Scuder » 30.05.2005 (Пн) 13:35

MS Access 2000.

Есть 2 абсолютно идентичных таблицы в 2-х разных mdb.
Одна таблица пустая, другая заполненная.

Как средствами ADO одним махом перенести все записи из одной таблицы в другую?

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 30.05.2005 (Пн) 13:53

Есть такой вариант:

Код: Выделить всё
nTempRS.Open "SELECT * FROM Rolls"
tTempRS.Open "SELECT * FROM Rolls"

If nTempRS.RecordCount > 0 Then
    For i = 1 To nTempRS.RecordCount
        tTempRS.AddNew
        For j = 0 To nTempRS.Fields.Count - 1
            tTempRS.Fields(j) = nTempRS.Fields(j)
        Next j
       
        tTempRS.Update
        nTempRS.MoveNext
    Next i
End If

tTempRS.Close
nTempRS.Close

Set nTempRS = Nothing
Set nTempDB = Nothing


Но на больших объёмах это будет жутко тормозить. :-(

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 30.05.2005 (Пн) 15:10

Код: Выделить всё
INSERT INTO Table1 IN "Вторая.mdb" SELECT * FROM Table1
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 30.05.2005 (Пн) 16:40

GSerg писал(а):
Код: Выделить всё
INSERT INTO Table1 IN "Вторая.mdb" SELECT * FROM Table1


GSerg, а не мог бы ты уточнить, что именно должно быть написано вместо "Вторая.mdb"? Plz.

Код: Выделить всё
tTempDB.Execute "INSERT INTO Table1 IN " & "Вторая.mdb" & " SELECT * FROM Table1"


Базы открываются так:

Код: Выделить всё
tTempDB.Open "driver={Microsoft Access Driver (*.mdb)};DBQ=" & App.Path + "\newdata" & cRegion & ".mdb"

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 30.05.2005 (Пн) 22:45

Эээ. Базовая логика подсказывает, что запрос лучше выполнять на принимающей стороне, т.к. в общем случае права на Insert Remote должны быть более труднодобываемые, чем на просто Insert. В таком случае запрос будет выглядеть прим. так (не силен в Аксессе, так что сорри если что):
Код: Выделить всё
insert into Table2
select *
from Table1 IN ("First.mdb")

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 31.05.2005 (Вт) 6:00

Это да - просто, перерыв справку по Access, я нашёл разрешение указывать IN в первом случае, но не нашёл во втором :)

А вместо "Вторая.mdb" должно быть не скажу что...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 31.05.2005 (Вт) 10:36

GSerg писал(а):Это да - просто, перерыв справку по Access, я нашёл разрешение указывать IN в первом случае, но не нашёл во втором :)

А вместо "Вторая.mdb" должно быть не скажу что...


Что значит "не скажу"?? :shock:
Какой тогда смысл в этом ответе? :-(

Логика запроса понятна. В SQL Server'е вопросов не возникло бы. Но тут Access и 2 не связанных между собою mdb. И вопрос тут скорее по ADO+VB, нежели по SQL..

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 31.05.2005 (Вт) 12:55

Смысл в любом ответе тот, чтобы заставить думать.

Для начала, у чего расширение mdb?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

snov
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 176
Зарегистрирован: 28.11.2003 (Пт) 10:12
Откуда: Челябинск

Сообщение snov » 31.05.2005 (Вт) 12:59

Поправлю Ennor.
Код: Выделить всё
Select TABLE1.* INTO TABLE2 IN др_база.mdb FROM TABLE1
Так должно сработать

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 31.05.2005 (Вт) 18:10

GSerg писал(а):Смысл в любом ответе тот, чтобы заставить думать.
Для начала, у чего расширение mdb?


GSerg! :-)

Если бы мы сидели с тобой за чашечкой пива и неторопливо рассуждали о смысле жизни, я бы с удовольствием обсудил происхождение расширений, названий и значений всего этого. Но если я задаю вопрос в форуме, значит, это срочный вопрос, на поиск решения которого в интернете просто нет времени. Пока что я сдал проект с решением, описанным во втором посте.

Однако же мне не даёт покоя мысль, что существует гораздо более рациональное решение этой задачи. :-) Фундаментально "думать", если честно, после рабочего дня хочется о чём-нибудь более светлом и радостном. :-)

Ну если уж ты такой вредный, давай поднимемся на 10-й этаж по лестнице, игнорируя лифт. :-)

Расширение mdb, как правило, используется СУБД Microsoft Access. Имеют его файлы баз данных.

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 02.06.2005 (Чт) 19:44

Scuder, особо и не надо рассуждать о смысле жизни. В своем первом посте ты спросил:
Есть 2 абсолютно идентичных таблицы в 2-х разных mdb.
Одна таблица пустая, другая заполненная


Если запрос выполняется в первой базе с пустой таблицей, как ты думаешь заполненная таблица находится в какой?

Подсказка: Случайно не IN 'Вторая.mdb' ??? :wink:

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 03.06.2005 (Пт) 12:40

Если запрос выполняется в первой базе с пустой таблицей, как ты думаешь заполненная таблица находится в какой?

Подсказка: Случайно не IN 'Вторая.mdb' ??? :wink:


Очень смешно. :evil:
Ежу понятно, что там должна быть указана вторая mdb.

Вопрос был в другом, но теперь уже не важно - разобрался.

2 GSerg: Такой момент. Обновляются 10 таблиц. Соответственно, вторая база открывается 10 раз, а это не быстро. Время работы построчного копирования быстрее в несколько раз. Вот и думаю, что лучше - скорость с использованием рекордсетов или "правильность" с Execute. Последний вариант, кстати, глючит периодически - на какие-то блокировки ругается..

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 03.06.2005 (Пт) 15:03

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 03.06.2005 (Пт) 15:11

Ну и после линковки
Код: Выделить всё
INSERT INTO Table1 SELECT * FROM LinkedTable1
Lasciate ogni speranza, voi ch'entrate.

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 02.07.2008 (Ср) 12:49

Код: Выделить всё
CN.Execute "INSERT INTO Кабель IN " & Text4 & " SELECT Код, Наим1,Наим2,Наим3,Наим4,Продавец,Цена FROM Товары"


И в результате как было пусто так пусто и осталось

Сам задачу поставил сам и решил :)))

Код: Выделить всё
CN.Execute "INSERT INTO Кабель (Код,Наим1,Наим2,Наим3,Наим4,Продавец,Цена) IN " & Text4 & " SELECT Код, iif(isnull(Наим1),'',Наим1) ,iif(isnull(Наим2),'',Наим2),iif(isnull(Наим3),'',Наим3),iif(isnull(Наим4),'',Наим4),Продавец,Цена FROM Товары"


теперь вопрос ... я копировал каждое значение
как предложенный выше способ ... для каждой строки ... каждое поле ....
86 тыс записей легли в 69 МБ ... из первоначальных 93
а при таком копировании 8 метров база оказалась записей стокаже,

КАК?
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 02.07.2008 (Ср) 14:09

Scuder писал(а):
2 GSerg: Такой момент. Обновляются 10 таблиц. Соответственно, вторая база открывается 10 раз, а это не быстро. Время работы построчного копирования быстрее в несколько раз. Вот и думаю, что лучше - скорость с использованием рекордсетов или "правильность" с Execute. Последний вариант, кстати, глючит периодически - на какие-то блокировки ругается..


эээ ... у меня построчно копировалось ~ 1000 записей за 1.3 сек
Core Duo 1.83 ГГц, 1ГБ оперативки ... т.е. 2-3 минуты одна таблица...

и 3 сек отработал один INSERT включающий в себя функции проверки ....
10 таких таблиц мне влом проверять первым способом .... но эффективность второго способа мягко говоря "выше" ... а вот если ты 10 записей копируешь, то тогда конечно можно поспорить :)
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 02.07.2008 (Ср) 19:10

SSecurity писал(а):86 тыс записей легли в 69 МБ ... из первоначальных 93
а при таком копировании 8 метров база оказалась записей стокаже,

КАК?

Ну во-первых, это таки некропостинг...
А во-вторых, попробуй с первой БД(которая 93 метра) - "Сервис - Сжать и восстановить".
И посмотри, сколько она станет весить.. ,-)
label:
cli
jmp label

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 02.07.2008 (Ср) 19:46

iGrok писал(а):
SSecurity писал(а):86 тыс записей легли в 69 МБ ... из первоначальных 93
а при таком копировании 8 метров база оказалась записей стокаже,

КАК?

Ну во-первых, это таки некропостинг...
А во-вторых, попробуй с первой БД(которая 93 метра) - "Сервис - Сжать и восстановить".
И посмотри, сколько она станет весить.. ,-)


Это уже сжатая:)
Заказчик .. упорно сопротивляется MSSQL / MySQL ... поэтому такие вот базы приходится таскать :)
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

    TopList