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


Автор: addet 7.2.2008, 11:14
Доброе утро,господа программисты.Возникла небольшая проблемка.Необходимо слить базы mdb в одну (добавить записи, а не заменить).Все таблицы и поля в базах идентичны, за исключением внесенных данных.Подскажите пожалуйста как правильно написать запрос(с sql не очень дружу).Делаю в delphi на отдельной форме Выбор даты и кнопку Объединить все базы.Ислользую ADO smile 

Автор: Rodman 7.2.2008, 12:34
http://forum.vingrad.ru/index.php?show_type=forum&showtopic=174138&kw=%D0%BF%D1%80%D0%BE%D1%81%D1%82%D0%B5%D0%B9%D1%88%D0%B8%D0%B5-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B1%D0%B0%D0%B7%D0%BE%D0%B9
в твоем случае у тебя будет 2 конекшина... с одно данные будешь брать, а при помощи второго добавлять...

Автор: ASGDeveloper 9.2.2008, 17:19
ИМХО проще сделать так:
1) выбираем из первой таблицы все данные запросом вроде select * from имя_таблицы
2) запускаем цикл перебирающий все выбранные элементы и формируем скрипт вроде INSERT ... (тут перечисляем имена полей и значения)
3) выполняем сформированный в пункте 2 скрипт
4) берем следующую таблицу и дальше продолжаем с пункта 1

Автор: addet 16.4.2008, 10:54
Ребята не обижайтесь, на мою туповатость.А можно конкретный примерчик,
ASGDeveloper, ?

Автор: Rodman 16.4.2008, 11:00
Код

Query1.Close;// подключен к одной базе, из которой тянуть будем
Query2.Close;// подключен к другой базе, в которую писать будем
Query1.SQL.Clear;
Query1.SQL.Add('select Field1, Field2, Field3, Field4 from имя_таблицы');
Query1.Open;
Query2.SQL.Clear;
Query2.SQL.Add('INSERT INTO новая_таблица (Field1, Field2, Field3, Field4) VALUES (:prm1, :Prm2, :Prm3, :Prm4);');
while not Query1.eof do
begin
    Query2.Parameters.ParamByName('Prm1').Value:=Query1. Fields.Fields[0].AsString; 
    Query2.Parameters.ParamByName('Prm2').Value:=Query1. Fields.Fields[1].AsString; 
    Query2.Parameters.ParamByName('Prm3').Value:=Query1. Fields.Fields[2].AsString; 
    Query2.Parameters.ParamByName('Prm4').Value:=Query1. Fields.Fields[3].AsString; 
    Query2.ExecSQL;
    Query1.Next;
end;
так понятнее??

Автор: Frees 16.4.2008, 11:49
вот есть такая функция которая переберет все таблицы и запишет значение из одной базы в другую

но тут надо осторожно с уникальнастями и первичными ключами
Код

procedure TfmMain.AddDestFromSouurce();
var
  I: Integer;
  TableList: TStringList;
  FieldList: TStringList;
  Table, Field, IsertString: String;
  j: Integer;
begin
  ADOConnectionSource.Connected := true;
  ADOConnectionDest.Connected := true;
  TableList := TStringList.Create;
  FieldList := TStringList.Create;
  ADOConnectionSource.GetTableNames(TableList, false);
  for I := 0 to TableList.Count - 1 do begin //Цикл по всем таблицам
    Table :=  TableList.Strings[I];
    ADOQuerySource.Close;
    ADOQuerySource.SQL.Clear;
    ADOQuerySource.SQL.Add('SELECT * FROM ' + Table);
    ADOQuerySource.Open;
    ADOQuerySource.First;
    ADOConnectionSource.GetFieldNames(Table, FieldList);
    //Готовим запрос для вставки
    IsertString := 'INSERT INTO ' + Table + '( ';
    //Заполняем поля
    for j := 1 to FieldList.Count - 1 do begin //первое поле не беру там инкремент
      Field := FieldList.Strings[j];
      if j =  FieldList.Count - 1 then
        IsertString := IsertString + Field + ') VALUES ('
      else
        IsertString := IsertString + Field + ','
    end;
    //Заполняем параметры
    for j := 1 to FieldList.Count - 1 do begin //первое поле не беру там инкремент
      Field := FieldList.Strings[j];
      if j =  FieldList.Count - 1 then
        IsertString := IsertString + ':' + Field + ');'
      else
        IsertString := IsertString + ':' + Field + ','
    end;
    ADOQueryDest.Close;
    ADOQueryDest.SQL.Clear;
    ADOQueryDest.SQL.Add(IsertString);

    while not ADOQuerySource.eof do begin //перебераем исходные записи
      //Заполняем параметры знамчениями
      ADOQueryDest.Close;
      for j := 1 to FieldList.Count - 1 do begin //первое поле не беру там инкремент
        Field := FieldList.Strings[j];
        ADOQueryDest.Parameters.ParamByName(Field).Value :=
            ADOQuerySource.FieldByName(Field).Value;
      end;
      try
        ADOQueryDest.ExecSQL;
      except
      end;
      ADOQuerySource.next;
    end;
  end;
  TableList.Free;
  FieldList.Free;
  ADOConnectionSource.Connected := false;
  ADOConnectionDest.Connected := false;
end;


особо не проверял но вроде работала

Автор: Savek 16.4.2008, 11:51
Если структуры одинаковы, то можно перегнать одним запросом:
Код

insert into InnerTable select * from OuterTable in "Путь к внешней базе"

заодно и скорость имеем на несколько порядков выше   smile 

Автор: addet 16.4.2008, 12:53
Frees, огромное спасибо за помощь. Пытаюсь сейчас немного переделать, чтоб не прописывать коннетк каждый раз, т..к. баз много.Что получится, отпишусь. smile 

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