Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Сравнение полей в таблицах БД Access и добав. нов.


Автор: ADAM83 15.6.2009, 15:03
Здравствуйте! У меня такой вопрос: есть 2 БД в Access, кот. содержит по одному таблицу (поля таблицы 1 БД: id, Name1) (поля таблицы 2 БД: id, Name2), здесь БД не пустые! 
Теперь, как можно программным путем сравнить эти 2 БД, точнее структуру этих баз, и к первой БД добавить новые поля с данными из второй БД (примерно так: id, Name1, Name2), так чтоб данные первой БД не стерлись после модификации?

Спасибо заранее!

Автор: Keeper89 15.6.2009, 15:19
Прежде всего надо определиться с источником и преемником в базах данных. Далее можно проверять содержимое полей, например, в цикле, сравнивая содержимое источника с преемником.
А источник не сотрется никак, если вы трогать его не будете smile

Автор: ADAM83 15.6.2009, 15:24
Keeper89
Цитата

А источник не сотрется никак, если вы трогать его не будете smile 

хорошо, я понял что данные сами по себе не сотрутся!  smile  


Цитата

Далее можно проверять содержимое полей, например, в цикле, сравнивая содержимое источника с преемником.

как теперь организовать сравнение полей между БД? 

Автор: Romikgy 15.6.2009, 16:19
Цитата(ADAM83 @  15.6.2009,  14:24 Найти цитируемый пост)
как теперь организовать сравнение полей между БД? 

запросом видать можно сравнить (точнее найти отличия и показать одинаковый) только индексы заюзать для быстроты работы
+добавление полей юзать alter 
))

Автор: flomaster 16.6.2009, 00:58
Если требуется получить две одинаковые таблицы, то зачем сравнивать?
Удалить неполную таблицу, и вставить целиком полную.
Это же не Оракл и млрд записей.

Если уперлось искать отсутствующие поля:
Отправляем одинаковый запрос к обеим базам
DataSet1.CommandText:="Select * From Table"; //К первой БД
DataSet2.CommandText:="Select * From Table"; //Ко второй БД
...Open;
Дальше просматриваем список полей, сравниваем названия. И находим отсутствующие.

Если шла речь о сравнении в цикле  значений полей - это глупость.

Автор: Keeper89 16.6.2009, 01:14
Цитата(flomaster @  16.6.2009,  01:58 Найти цитируемый пост)
Удалить неполную таблицу, и вставить целиком полную.

Найти недостающие поля во второй гораздо вычитанием (1 запросом) , как сказал Romikgy, и добавлением к преемнику недостающих данных, а не удалением ВСЕЙ таблицы и вставки новой. И не в миллиарде записей дело.

Автор: ADAM83 16.6.2009, 13:31
 smile короче, коллеги, решил проблему следующим образом (конечно можно было придумать что-то оригинальное, но ...):
в переменную (массив) структурного типа сливаю всю инфу с первой таблицы, далее заменяю первую таблицу со второй, и в новую таблицу обратно заливаю инфу с массива. 
При этом у меня вторая таблица уже пустая.
Цитата

здесь БД не пустые! 
 извиняюсь за неверную инфу! smile 

Наверно мой вопрос некорректно звучал, мне нужно было изменить структуру первой БД на основании структурой второй БД (как бы слить в одну).

Код

type
  TB1 = record
    f1: Integer;
    f2: String;
  end;
......
var a: array of TB1;
.....
ADOTable1.First;
  i := 0; //элементы в массиве нач-ся с нуля
  while not ADOTable1.Eof do
  begin
    a[i].f1 := ADOTable1.FieldValues['f1'];
    a[i].f2 := ADOTable1.FieldValues['f2'];
    i := i + 1;
    ADOTable1.Next;
  end;
......
  ADOConnection1.Connected := false;
  ADOConnection2.Connected := false;
  ADOTable1.Close;
  ADOTable2.Close;
  if RenameFile(dir2+'tbTMP.mdb',dir2+'tb.mdb') then
    CopyFile(PChar(dir2+'tb.mdb'),PChar(dir1+'tb.mdb'),false);
  RenameFile(dir2+'tb.mdb',dir2+'tbTMP.mdb');
  ADOConnection1.Connected;
  ADOConnection2.Connected;
  ADOTable1.Open;
  ADOTable2.Open;
  for i := 0 to rCnt-1 do
  begin
    ADOTable1.Append;
      ADOTable1.FieldValues['f1'] := a[i].f1;
      ADOTable1.FieldValues['f2'] := a[i].f2;
    ADOTable1.Post;
  end;

С этим моя проблема решена. Спасибо всем кто откликнулся!

Автор: Данкинг 16.6.2009, 15:48
ADAM83, зачем там какие-то временные файлы? smile Перебираешь поля первой таблицы (первый цикл) и пытаешься найти их во второй (второй цикл). Если поле не найдено, то добавляешь через обычный alter table...

Автор: flomaster 16.6.2009, 22:43
Цитата(Keeper89 @  16.6.2009,  01:14 Найти цитируемый пост)
Найти недостающие поля во второй гораздо вычитанием (1 запросом)
Будьте так добры, покажите этот запрос.

Данкинг, перебор полей и присвоение значений в цикле - ошибка.
Используйте запрос на добавление или обновление. TADOCommand.
TADOTable - зло. Используйте TADODataSet.

Автор: Данкинг 16.6.2009, 22:54
Цитата(flomaster @  16.6.2009,  23:43 Найти цитируемый пост)
перебор полей и присвоение значений в цикле - ошибка.

В чём ошибка, не понял? При чём тут присвоение значений? Я про то, что надо перебрать имеющиеся поля одной таблицы на предмет наличия/отсутствия в другой таблице.

Цитата(flomaster @  16.6.2009,  23:43 Найти цитируемый пост)
Используйте запрос на добавление или обновление.

Совершенно солидарен: без запроса на добавление добавить новое поле никак не получится. smile 

Цитата(flomaster @  16.6.2009,  23:43 Найти цитируемый пост)
TADOTable - зло. 

Не знаю, не замечал. Хотя чаще юзаю AdoQuery.

Автор: flomaster 16.6.2009, 23:15
Данкинг, промашка с адресом "вышла".
да... вкурил, что там в цикле, озадачился еще больше.
Отказался от использования и Table, и Query в пользу Dataset (заменяет их обоих).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)