Сравнение таблиц Access из разных БД

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
SergT
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 237
Зарегистрирован: 22.06.2005 (Ср) 21:50
Откуда: Москва

Сравнение таблиц Access из разных БД

Сообщение SergT » 02.11.2006 (Чт) 10:10

Доброе время суток всем Форумчанам!
Необходимо найти самый быстрый способ сравнения 2-х (одинаковых по структуре) таблиц Access на предмет точного совпадения данных, желательно прогой, написанной на VB. Записей около 100 000, полей - 30. Простым перебором - занимает уйму времени.
Чего хочется? А хочется, хотя бы, убедиться, что обе таблицы идентичны друг другу. Может что-то типа чекСуммы? Может их экспортировать в текст и потом сравнить? Что-то мне подсказывает, что решение должно быть простым, но... Главное -СКОРОСТЬ
Л. Толстой, «зачем обдумывать обдуманное, бери готовое и иди дальше, в этом сила человечества»
"Всё в наших руках, поэтому их нельзя опускать" (Коко Шанель)

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

Сообщение alibek » 02.11.2006 (Чт) 10:12

Какие поля сравниваются? Есть ли среди них ключевые поля? Поля, которые надо игнорировать?
Lasciate ogni speranza, voi ch'entrate.

SergT
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 237
Зарегистрирован: 22.06.2005 (Ср) 21:50
Откуда: Москва

Сообщение SergT » 02.11.2006 (Чт) 10:16

Изменения могли пройти в любом из полей. Поля разного типа, и ключевые и... Нужно отловить несоответсвие в любом из 30 полей всей таблицы
Л. Толстой, «зачем обдумывать обдуманное, бери готовое и иди дальше, в этом сила человечества»
"Всё в наших руках, поэтому их нельзя опускать" (Коко Шанель)

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

Сообщение alibek » 02.11.2006 (Чт) 10:32

Тогда делай .Save для каждого рекордсета, вычисляй MD5 и сравнивай.
Lasciate ogni speranza, voi ch'entrate.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 02.11.2006 (Чт) 10:40

Ё-маё. Мне ж тоже самое нужно было сделать, а до такого простого фокуса не догадался...
Лучший способ понять что-то самому — объяснить это другому.

SergT
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 237
Зарегистрирован: 22.06.2005 (Ср) 21:50
Откуда: Москва

Сообщение SergT » 02.11.2006 (Чт) 10:41

alibek писал(а):Тогда делай .Save для каждого рекордсета, вычисляй MD5 и сравнивай.

:shock:
TO alibek : Мона чу-у-уть подробнее?

---- добавлено позднее ---
Собственно, во что сохранять и вот по поводу MD5 не лестно отзывались:
http://bbs.vbstreets.ru/viewtopic.php?t ... hlight=md5
Л. Толстой, «зачем обдумывать обдуманное, бери готовое и иди дальше, в этом сила человечества»
"Всё в наших руках, поэтому их нельзя опускать" (Коко Шанель)

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

Сообщение alibek » 02.11.2006 (Чт) 10:56

Recordset1.Save "C:\dump1", adPersistADTG
Recordset2.Save "C:\dump2", adPersistADTG

А далее сравниваешь файлы dump1 и dump2.
Lasciate ogni speranza, voi ch'entrate.

SergT
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 237
Зарегистрирован: 22.06.2005 (Ср) 21:50
Откуда: Москва

Сообщение SergT » 02.11.2006 (Чт) 11:05

Посетила еще одна идея. Создать рекордсет, с условием совпадения полей, типа "Select.. join.. Where t1.F1=t2.F1 and... t1.F30=t2.F30"
Если кол-во записей в обоих таблицах совпадает с записями рекордсета - все Ок. Но грамотно ли так делать? И.. СКОРОСТЬ?

Спасибо за подсказки - пойду пробовать :D
Л. Толстой, «зачем обдумывать обдуманное, бери готовое и иди дальше, в этом сила человечества»
"Всё в наших руках, поэтому их нельзя опускать" (Коко Шанель)

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 02.11.2006 (Чт) 11:15

alibek писал(а):Recordset1.Save "C:\dump1", adPersistADTG
Recordset2.Save "C:\dump2", adPersistADTG

А далее сравниваешь файлы dump1 и dump2.
А можно
Set st1 = New ADODB.Stream
Set st2 = New ADODB.Stream
Recordset1.Save st1, adPersistADTG
Recordset1.Save st2, adPersistADTG
И сравниваешь два байтовых массива.
Лучший способ понять что-то самому — объяснить это другому.

BasiС
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 16.02.2006 (Чт) 23:34
Откуда: Koenigsberg

Сообщение BasiС » 02.11.2006 (Чт) 14:14

Запрос для выявления отличий DB2 относительно DB1
(выводит все поля DB1, которых нет в DB2)

SELECT Tb1.Fld1
FROM
(SELECT * FROM DB1) AS Tb1
RIGHT JOIN
(SELECT * FROM DB2) AS Tb2
ON
Tb1.Fld1=Tb2.Fld1 AND Tb1.Fld2=Tb2.Fld2 AND ...... Tb1.Fld30=Tb2.Fld30
WHERE
ISNULL(Tb1.Fld1)

И второй запрос - тот-же запрос (вместо RIGHT - LEFT вместо ISNULL(Tb1.Fld1) - ISNULL(Tb1.Fld2)) .
Насчёт скорости - надо проверять.

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

Сообщение alibek » 02.11.2006 (Чт) 14:16

Antonariy писал(а):А можно

Кстати, да, как-то сразу не подумал. Так гораздо лучше.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение alibek » 02.11.2006 (Чт) 14:17

BasiС, ну-ну, дерзай. Поля могут быть memo или binary, ты знаешь?
Lasciate ogni speranza, voi ch'entrate.

SergT
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 237
Зарегистрирован: 22.06.2005 (Ср) 21:50
Откуда: Москва

Сообщение SergT » 03.11.2006 (Пт) 9:21

alibek писал(а):А далее сравниваешь файлы dump1 и dump2.

Antonariy писал(а):
И сравниваешь два байтовых массива.

:cry: Не пойму, как сравнивать :oops:
Л. Толстой, «зачем обдумывать обдуманное, бери готовое и иди дальше, в этом сила человечества»
"Всё в наших руках, поэтому их нельзя опускать" (Коко Шанель)

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

Сообщение alibek » 03.11.2006 (Пт) 9:24

Как хочешь, так и сравниваешь.
Можно посчитать MD5 и сравнить.
Можно не считать MD5 (все-равно при этом весь файл будет считываться), а читать оба файла одинаковыми блоками и сравнивать блоки.
Lasciate ogni speranza, voi ch'entrate.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 03.11.2006 (Пт) 10:33

А можно и так:
Код: Выделить всё
Function RssEqual(Recordset1, Recordset2) As Boolean
    Set xml1 = New MSXML2.DOMDocument
    Set xml2 = New MSXML2.DOMDocument
    Recordset1.Save xml1, adPersistXML
    Recordset2.Save xml2, adPersistXML
    RssEqual = xml1.xml = xml2.xml
End Function
Лучший способ понять что-то самому — объяснить это другому.


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: Google-бот и гости: 92

    TopList