Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Задачка о быстром копировании данных / 7 сообщений из 7, страница 1 из 1
30.05.2003, 18:08
    #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
30.05.2003, 18:18
    #32173181
KirillovA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка о быстром копировании данных
а на сервере не выполнить?
зачем прогресс бар то юзеру рисовать?
он вот у тебя и стреляет короткими инсертами миллион раз ... объедини инсерты штук по 100 хотябы - в сто раз быстрее будет ...
...
Рейтинг: 0 / 0
30.05.2003, 19:36
    #32173229
filll
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка о быстром копировании данных
А таблички локальные или на SQL сервере?
Для SQL я обычно выполняю такой SQL запрос:
insert into mytable_2(select pole1, pole2, ... ,poleN frrom mytable_1)
...
Рейтинг: 0 / 0
02.06.2003, 09:00
    #32173671
nomorenames
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка о быстром копировании данных
Наверное я не все вводные дал.
Один рекордсет из базы данных dbf, другой с SQL Server'а.
Для юзеров необходимо сделать систематическое обновление таблиц, которые поставляются только в dbf.
Коннекчусь к dbf через TDBF, к SQL Через ADO. Попробовал сделать все через дельфи, результат тот же, только код короче.
...
Рейтинг: 0 / 0
02.06.2003, 09:46
    #32173693
pkarklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка о быстром копировании данных
Коннекчусь к dbf через TDBF, к SQL Через ADO. Попробовал сделать все через дельфи, результат тот же, только код короче.

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

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

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

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

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

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

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


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


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