powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Задачка о быстром копировании данных
7 сообщений из 7, страница 1 из 1
Задачка о быстром копировании данных
    #32173176
nomorenames
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть два рекордсета, представляющих одинаковые по структуре таблицы.
Как быстро скопировать данные из одной таблицы в другую?
Делал , построением запросов, 130000 записей, где-то 20 мин.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
procedure TForm1.DBUpdate(table: string);
var
  ADOQuery: TADOQuery;
  I, N: integer;
  StrFields: TStrings;
  StrSQL1, StrSQL2: string;
begin
  StrFields:= TStringList.Create;
  ADOQuery:= TADOQuery.Create(nil);
  ADOQuery.Connection := ADOConnection1;
  ADOQuery.SQL.Text := 'BEGIN TRANSACTION';
  ADOQuery.ExecSQL;
  ADOQuery.SQL.Text:= 'DELETE FROM ' + table;
  ADOQuery.ExecSQL;
  dbf1.TableName:= table;
  dbf1.Active := True;
  ListBox2.Items.Clear;
  For I:=  0  to DataSource1.DataSet.Fields.Count - 1  do begin
    ListBox2.Items.Add(DataSource1.DataSet.Fields[I].FullName);
    StrFields.Add(DataSource1.DataSet.Fields[I].DisplayName);
  end;
  StrSQL1 := 'INSERT INTO ' + table + ' (' ;
  For I:=  0  to StrFields.Count - 1  do
    StrSQL1:= StrSQL1 + '[' + StrFields.Strings[I] + '],';
  StrSQL1:= LeftStr(StrSQL1, Length(StrSQL1) - 1 ) + ') VALUES (';

  DataSource1.DataSet.First;
  ProgressBar1.Max := DataSource1.DataSet.RecordCount;
  For I:=  0  to DataSource1.DataSet.RecordCount - 1  do begin
    Application.ProcessMessages;
    Label1.Caption := IntToStr(I);
    StrSQL2:= StrSQL1;
    For N:=  0  to StrFields.Count - 1  do begin
      StrSQL2 := StrSQL2 + QuotedStr(DataSource1.DataSet.Fields[N].AsString) + ',';
    end;
    StrSQL2:= LeftStr(StrSQL2, Length(StrSQL2) - 1 ) + ')';
    ADOQuery.SQL.Text := StrSQL2;
    ADOQuery.ExecSQL;
    ProgressBar1.Position := I;
    DataSource1.DataSet.Next;
  end;
  ProgressBar1.Position :=  0 ;
  ADOQuery.SQL.Text := 'COMMIT TRANSACTION';
  ADOQuery.ExecSQL;

  StrFields.Free;
  ADOQuery.Free;
  dbf1.Active := False;
end;
...
Рейтинг: 0 / 0
Задачка о быстром копировании данных
    #32173181
Фотография KirillovA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а на сервере не выполнить?
зачем прогресс бар то юзеру рисовать?
он вот у тебя и стреляет короткими инсертами миллион раз ... объедини инсерты штук по 100 хотябы - в сто раз быстрее будет ...
...
Рейтинг: 0 / 0
Задачка о быстром копировании данных
    #32173229
filll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А таблички локальные или на SQL сервере?
Для SQL я обычно выполняю такой SQL запрос:
insert into mytable_2(select pole1, pole2, ... ,poleN frrom mytable_1)
...
Рейтинг: 0 / 0
Задачка о быстром копировании данных
    #32173671
nomorenames
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное я не все вводные дал.
Один рекордсет из базы данных dbf, другой с SQL Server'а.
Для юзеров необходимо сделать систематическое обновление таблиц, которые поставляются только в dbf.
Коннекчусь к dbf через TDBF, к SQL Через ADO. Попробовал сделать все через дельфи, результат тот же, только код короче.
...
Рейтинг: 0 / 0
Задачка о быстром копировании данных
    #32173693
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коннекчусь к dbf через TDBF, к SQL Через ADO. Попробовал сделать все через дельфи, результат тот же, только код короче.

Я уже вроде тебе говорил. Зачем через прогу то закачивать. Используй Linked Server (всмысле прилинкуй dbf прямо к сиквелу, ну и запросом на вставку).
...
Рейтинг: 0 / 0
Задачка о быстром копировании данных
    #32173725
nomorenames
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 pkarklin
А можно чуть-чуть подробней по линковке, как провайдера прописать для DBF.
Думается, что это будет не проще, хотя однозначно быстрее, т.к. неизвестно, будет ли установлен OLEDB провайдер для DBF, смогут ли они сами законнектиться и т.п.
Дело в том, что прога будет в регионах, и меня там не будет. Сам знаешь, как удаленно консультировать.
Я полностью согласен с тем, что это все надо делать на сервере, да еще и ручками через QA , но юзерам нужна одна БОЛЬШАЯ кнопка.
...
Рейтинг: 0 / 0
Задачка о быстром копировании данных
    #32173763
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно чуть-чуть подробней по линковке, как провайдера прописать для DBF.

Это лучше тебе на главном форуме поискать, там топиков было море. Кстати и по вопросам преобразования из 866 кодировки. Сам я линковкой дбф не занимался, так что знания чисто теоретические.

Думается, что это будет не проще, хотя однозначно быстрее, т.к. неизвестно, будет ли установлен OLEDB провайдер для DBF, смогут ли они сами законнектиться и т.п.

Коннектиться то будет сервер, а там то провайдер уж точно будет.

но юзерам нужна одна БОЛЬШАЯ кнопка.

Ну так и будет у тебя большая кнопка, в ответ на нажате которой ты будешь посылать на сервер запрос типа

Код: plaintext
1.
INSERT SomeTable
SELECT * FROM MyLinkeddbf...SomedbfTable


или вызывать хп, где делать еще дополнительные действия.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Задачка о быстром копировании данных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]