Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.09.2010, 10:20   #1
santaIsAbsent
Пользователь
 
Регистрация: 26.05.2010
Сообщений: 21
По умолчанию Результат запроса в txt и dbf.

Доброго времени суток.

Подскажите пожалуйста. Как сохранить результат выполнения запроса в текстовый и dbf файлы.
Аналогичные темы я просматривал, советы из них попробовал, но проблема в том, что необходимо работать с большим объемом данных (результат выполнения запроса достигает порядка 1 ммлн. строк, а бывает и больше) скорость сохранения данных очень маленькая.

Заранее спасибо.
santaIsAbsent вне форума Ответить с цитированием
Старый 02.09.2010, 10:52   #2
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

все относительно
даже ваш вопрос
1 млн. строк с одной колонкой, состоящей из одной буквы в каждой строчке, и 1 млн. строк со 100 колонками с блобами - время выгрузки будет существенно различаться

первое что хочется услышать - субд?
второе - а зачем вы это выгружаете вообще? что будете дальше делать?
и третье - приведите кусок кода, который дает "маленькую скорость сохранения" (может, достаточно будет его затюнить?!).
soleil@mmc вне форума Ответить с цитированием
Старый 02.09.2010, 10:54   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А что за запрос? Откуда данные берутся?
Если источник правильно настроен (БД проиндексирована и т.п.) то можно организовать запрос по частям, скажем по 1000 зписей - так поступают многие утилиты импорта-экспорта
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.09.2010, 11:02   #4
santaIsAbsent
Пользователь
 
Регистрация: 26.05.2010
Сообщений: 21
По умолчанию

1. Данные хранятся в dbf файлах.
2. Колонок в одной таблице около 30.
3. Выгрызка такая необходима для дальнейшей обработки этих данных в др. программе.

Код: (сохранение в txt)
Код:
begin
if not FileExists('DB_Dump.txt') then
begin
Rewrite (f,(ExtractFileDir(Application.ExeName)+'\Ðåçóëüòàò çàïðîñà\txt\DB_Dump.txt'));
CloseFile(f);
end;
f_c:=ADOQuery2.FieldCount;
r_c:=ADOQuery2.RecordCount;
for n:=0 to r_c-1 do begin
for i:=0 to f_c-1 do
begin
dump:='';
a[i]:=DBGrid2.Fields[i].AsString+#9;
AssignFile(f,(ExtractFileDir(Application.ExeName)+'\Ðåçóëüòàò çàïðîñà\txt\DB_Dump.txt'));
Append(f);
Write (f,a[i]);
CloseFile(f);
end;
Append(f);
Writeln (f,'');
CloseFile(f);
ADOQuery2.Next;
end;
end;

Последний раз редактировалось Stilet; 02.09.2010 в 12:06.
santaIsAbsent вне форума Ответить с цитированием
Старый 02.09.2010, 11:13   #5
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

ндаа....
1) квери.RecordCount - на больших объемах очень долгая орперация
лечится так (тебе же незачем знать точное число)
Код:
/* все это тоже выносим из цикла */
dump:='';
a[i]:=DBGrid2.Fields[i].AsString+#9;
AssignFile(f,(ExtractFileDir(Applic ation.ExeName)+'\Ðåçóëüòàò çàïðîñà\txt\DB_Dump.txt'));

Append(f);
while not ADOQuery2.EOF do begin
  /* здесь кодинг сборки строки вставки и сама вставка в файл  */
  ADOQuery2.Next;
end;
CloseFile(f);
2) на каждой колонке для каждой записи делать аппенд и клоз для файла - это тоже долго
в верхнем примере показано что это все нужно вынести за цикл листания записей
soleil@mmc вне форума Ответить с цитированием
Старый 02.09.2010, 11:16   #6
santaIsAbsent
Пользователь
 
Регистрация: 26.05.2010
Сообщений: 21
По умолчанию

Спасибо. А как тогда тоже самое сохранить в dbf ?
santaIsAbsent вне форума Ответить с цитированием
Старый 02.09.2010, 11:18   #7
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

да так же
только вместо записи в текстовый файл будет запись в дбф инсертами через скл
Код:
insert into 
(field1, ...)
values(value1, ...)
и не забудь отключить отображение листания датасета в каком-нить гриде
Код:
датасет.DisableCotrols;
/* обработка выгрузки данных */
датасет.EnableCotrols;
и апдейт к верхнему примеру
Код:
/* все это тоже выносим из цикла */
dump:='';
f_c:=ADOQuery2.FieldCount;
AssignFile(f,(ExtractFileDir(Applic ation.ExeName)+'\Ðåçóëüòàò çàïðîñà\txt\DB_Dump.txt'));

Append(f);
while not ADOQuery2.EOF do begin
  /* здесь кодинг сборки строки вставки и сама вставка в файл  */
  /* цикл по полям остается  */
  for i:=0 to f_c-1 do begin
    a[i]:=DBGrid2.Fields[i].AsString+#9;  // только здесь нужно не к гриду обращаться, а к квери ADOQuery2
    Write (f,a[i]);
  end;
  ADOQuery2.Next;
end;
CloseFile(f);

Последний раз редактировалось soleil@mmc; 02.09.2010 в 11:26.
soleil@mmc вне форума Ответить с цитированием
Старый 02.09.2010, 11:24   #8
santaIsAbsent
Пользователь
 
Регистрация: 26.05.2010
Сообщений: 21
По умолчанию

Большое спасибо. Попробую.

Работает, но не совсем. Файл создается, данные записываются, но в одну строку.

вот код:

Код:
begin
  if not FileExists('DB_Dump.txt') then
    begin
      Rewrite (f,(ExtractFileDir(Application.ExeName)+'\Ðåçóëüòàò çàïðîñà\txt\DB_Dump.txt'));
      CloseFile(f);
    end;
      ADOQuery2.Open;
      dump:='';
      f_c:=ADOQuery2.FieldCount;
      AssignFile(f,(ExtractFileDir(Application.ExeName)+'\Ðåçóëüòàò çàïðîñà\txt\DB_Dump.txt'));
      Append(f);
      While not ADOQuery2.EOF do begin
      for i:=0 to f_c-1 do
        begin
          a[i]:=ADOQuery2.Fields[i].AsString+#9;
          Write (f,a[i]);
        end;
        ADOQuery2.Next;
      end;
    CloseFile(f);
end;

Последний раз редактировалось Stilet; 02.09.2010 в 12:07.
santaIsAbsent вне форума Ответить с цитированием
Старый 02.09.2010, 16:01   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Код:
      While not ADOQuery2.EOF do begin
      for i:=0 to f_c-1 do
        begin
          a[i]:=ADOQuery2.Fields[i].AsString+#9;
          Write (f,a[i]);
        end;
        WriteLn(f);
        ADOQuery2.Next;
      end;
а ещё лучше так
Код:
var s : string;
...
      While not ADOQuery2.EOF do begin
        s := '';
      for i:=0 to f_c-1 do
        begin
          s := s + ADOQuery2.Fields[i].AsString+#9;
        end;
        WriteLn(f.s);
        ADOQuery2.Next;
      end;
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
результат запроса Ko$tello БД в Delphi 7 18.04.2012 12:13
DBF + txt rubik Помощь студентам 1 27.05.2010 20:45
из *.dbf в *.txt Demonmov Microsoft Office Excel 10 25.03.2010 10:58
Результат запроса в ячейку artemavd БД в Delphi 3 23.06.2009 09:55
Из TXT в DBF [Sano]Soprano Помощь студентам 2 28.04.2009 09:21