Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

5 миллионов записей


Страницы:   1 2

Программер ©   (2009-02-19 08:41:00) 

Как экспортировать 5 миллионов записей из запроса к ораклу в accseess?
Пытаюсь через adoquery но он вроде грузит записи в память и она переполняется. Пытался сохранять в эксель через TscExcelExport. но в экселе болше 65 тыс. строк на одном листе не сохраняет. На разных листах боюсь не справится.


Сергей М.   (2009-03-03 12:03:00) [1]


> Программер   (02.03.09 11:18) [31]


Если тебе по барабану в какой контейнер экспортировать (судя по предыдущим твоим постам так оно и есть), экспортируй в обычный текстовый файл.


Виталий Панасенко   (2009-03-02 11:29:00) [2]

Попробуй еще
ExcelApplication.Calculation[0] := xlManual до начала заполнения
и включить автопересчет в конце (xlAutomatic)


Программер   (2009-03-02 11:18:00) [3]

нет не возникает.
мне кажется эксель через ком сервера такие большие обьемы не может правильно обрабатывать, зависоны начинаются на 12-30 тысячах строк.


Сергей М.   (2009-02-27 17:22:00) [4]


> Программер


Ну ты и нахреновертил однако)
Аж в глазах рябит)

Хорошо, а если выкинуть все пляски с бубном и оставить только пустой цикл

procedure TForm3.SpeedButton2Click(Sender: TObject);
begin
 ADOQuery1.First;
 while not ADOQuery1.Eof do
   ADOQuery1.Next;
end;

исключение возникает ?


Программер   (2009-02-27 13:13:00) [5]


> Anatoly Podgoretsky ©   (27.02.09 09:42) [27]
> > Программер  (27.02.2009 7:50:25)  [25]Эксель в Оракле,
>  до чего дошла наука.

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


Программер   (2009-02-27 13:11:00) [6]


> > можно  и в эксель...т.е. если груз предположительно может
> не влезть в грузовик то можно заменить его ведром...

оказывается можно.
запихнул по миллиону записей в каждый лист. Excel 2007.
что интересно размер экселевского файла 350мб, dbf ника с теми же данными 3,6гб, акссес более 2х гигов.
Видимо хорошее сжатие реализовано в эксель. Ну а при открытии память заполняется на 2 гига.


Anatoly Podgoretsky   (2009-02-27 09:42:00) [7]

> Программер  (27.02.2009 7:50:25)  [25]

Эксель в Оракле, до чего дошла наука.


sniknik   (2009-02-27 08:05:00) [8]

> можно  и в эксель...
т.е. если груз предположительно может не влезть в грузовик то можно заменить его ведром...


Программер   (2009-02-27 07:50:00) [9]


> Anatoly Podgoretsky ©   (26.02.09 12:28) [21]
> > Программер  (26.02.2009 6:48:18)  [18]Какой еще сервер.
>

оракл


Программер   (2009-02-27 07:46:00) [10]


> а куда делся "accseess" из вопроса?

можно  и в эксель...


Программер   (2009-02-27 07:45:00) [11]

упс.

procedure TForm3.SpeedButton2Click(Sender: TObject);
var
BeginCol, BeginRow,BeginRow2,beginrow3,j: integer;
RowCount, ColCount,NewListRowsCount,ReportNum: Integer;
tmp:ShortString;
begin
Duration := Now();
SpeedButton3.Enabled:=true;
SpeedButton3.Down:=false;
// запускаем Excel
ExcelApplication1.AutoConnect:=true;
// открываем книгу
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.OpenXML('C:\1.XLS',EmptyPar  am));
// соединяемся с книгой
ExcelWorksheet1.ConnectTo(ExcelWorkbook1.ActiveSheet as ExcelWorksheet);

// Отключаем реакцию Excel на события, чтобы ускорить вывод информации
 ExcelApplication1.Application.EnableEvents := false;

ReportNum:=1;
NewListRowsCount:=OptionForm.ESBIntEdit1.AsInteger;
BeginCol := OptionForm.ESBIntEdit2.AsInteger;
BeginRow := OptionForm.ESBIntEdit3.AsInteger;
BeginRow2:=BeginRow;
ExcelWorksheet1.Name:='Отчет 1';
beginrow3:=1;

//  RowCount := ADOQuery1.RecordCount;
 ColCount := ADOQuery1.FieldDefs.Count;
//RzStatusPane2.Caption:='Строк: '+inttostr(RowCount);
RzStatusPane1.Caption:='Столбцов: '+inttostr(ColCount);

if OptionForm.CheckBox1.Checked=true then begin
                                 ExcelApplication1.Range[xlRCtoA1(BeginRow-1,BeginCol),EmptyParam].Interior.Color:=$00B5E7F4;
                                 ExcelApplication1.Range[xlRCtoA1(BeginRow-1,BeginCol),EmptyParam].Borders.Weight:=xlThin;
                                 end;
For J := 1 To ColCount Do begin
excelWorksheet1.Cells.Item[BeginRow-1,j+BeginCol]:=DBGrid1.Columns[j-1].Title.Caption;
ExcelApplication1.Range[xlRCtoA1(BeginRow-1,j+BeginCol),EmptyParam].Interior.Color:=$00B5E7F4;
ExcelApplication1.Range[xlRCtoA1(BeginRow-1,j+BeginCol),EmptyParam].Borders.Weight:=xlThin;
                        end;

 ADOQuery1.DisableControls;
 ADOQuery1.First;
 try
 while not ADOQuery1.Eof do begin

 //rows

                                 if BeginRow=NewListRowsCount then begin //ограничение здесь
                                    ExcelApplication1.Range['2:'+inttostr(ColCount),EmptyParam].Columns.AutoFit;
                                    ExcelApplication1.Range['1:'+inttostr(ColCount),EmptyParam].Columns.AutoFit;
                                    excelWorksheet1.ConnectTo(ExcelApplication1.ActiveWorkbook.Sheets.Add(EmptyParam  ,ExcelApplication1.ActiveSheet,1,EmptyParam,LOCALE_USER_DEFAULT) as ExcelWorksheet);
                                    inc(ReportNum);
                                    ExcelWorksheet1.Name:='Отчет '+inttostr(ReportNum);
                                    BeginRow2:=BeginRow;
                                    if OptionForm.CheckBox1.Checked=true then begin
                                                                              ExcelApplication1.Range[xlRCtoA1(BeginRow-1,BeginCol),EmptyParam].Interior.Color:=$00B5E7F4;
                                                                              ExcelApplication1.Range[xlRCtoA1(BeginRow-1,BeginCol),EmptyParam].Borders.Weight:=xlThin;
                                                                              end;
                                    For J := 1 To ColCount Do begin
                                    excelWorksheet1.Cells.Item[BeginRow-1,j+BeginCol]:=DBGrid1.Columns[j-1].Title.Caption;
                                    ExcelApplication1.Range[xlRCtoA1(BeginRow-1,j+BeginCol),EmptyParam].Interior.Color:=$00B5E7F4;
                                    ExcelApplication1.Range[xlRCtoA1(BeginRow-1,j+BeginCol),EmptyParam].Borders.Weight:=xlThin;
                                                              end;
                                     NewListRowsCount:=NewListRowsCount+OptionForm.ESBIntEdit1.AsInteger;
                                               end;

                                 For J := 1 To ColCount Do begin  //columns
                                 ExcelWorksheet1.Cells.Item[BeginRow2,j+BeginCol]:=ADOQuery1.FieldbyName(ADOQuery1.FieldDefs.Items[j - 1].DisplayName).value;
                                 Application.ProcessMessages;
                                                           end;
                                 RzStatusPane3.Caption:=inttostr(BeginRow3);

                                 if OptionForm.CheckBox1.Checked=true then ExcelWorksheet1.Cells.Item[BeginRow2,BeginCol]:=inttostr(BeginRow3);
                                 if SpeedButton3.Down=true then exit;
                                 inc(BeginRow2);
                                 inc(beginrow3);
                                 ADOQuery1.Next;
                                 end;
 finally
ADOQuery1.EnableControls;
ExcelApplication1.Range['3:'+inttostr(ColCount),EmptyParam].Columns.AutoFit;
ExcelApplication1.Range['1:'+inttostr(ColCount),EmptyParam].Columns.AutoFit;

// делаем видимым Excel
ExcelApplication1.Visible[0]:=true;
SpeedButton3.Enabled:=true;
form3.Caption:='Duration : '+TimeToStr(Now() - Duration);
 end;

end;


Программер   (2009-02-27 07:44:00) [12]


> > пишем по строче в эксель;Вот тут самое интересное)


procedure TForm3.SpeedButton2Click(Sender: TObject);
var
BeginCol, BeginRow,BeginRow2,beginrow3,j: integer;
RowCount, ColCount,NewListRowsCount,ReportNum: Integer;
tmp:ShortString;
begin
Duration := Now();
SpeedButton3.Enabled:=true;
SpeedButton3.Down:=false;
// запускаем Excel
ExcelApplication1.AutoConnect:=true;
// открываем книгу
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.OpenXML('C:\1.XLS',EmptyPar am));
// соединяемся с книгой
ExcelWorksheet1.ConnectTo(ExcelWorkbook1.ActiveSheet as ExcelWorksheet);

// Отключаем реакцию Excel на события, чтобы ускорить вывод информации
  ExcelApplication1.Application.EnableEvents := false;

ReportNum:=1;
NewListRowsCount:=OptionForm.ESBIntEdit1.AsInteger;
BeginCol := OptionForm.ESBIntEdit2.AsInteger;
BeginRow := OptionForm.ESBIntEdit3.AsInteger;
BeginRow2:=BeginRow;
ExcelWorksheet1.Name:='Отчет 1';
beginrow3:=1;

//  RowCount := ADOQuery1.RecordCount;
  ColCount := ADOQuery1.FieldDefs.Count;
//RzStatusPane2.Caption:='Строк: '+inttostr(RowCount);
RzStatusPane1.Caption:='Столбцов: '+inttostr(ColCount);

if OptionForm.CheckBox1.Checked=true then begin
                                  ExcelApplication1.Range[xlRCtoA1(BeginRow-1,BeginCol),EmptyParam].Interior.Color:=$00B5E7F4;
                                  ExcelApplication1.Range[xlRCtoA1(BeginRow-1,BeginCol),EmptyParam].Borders.Weight:=xlThin;
                                  end;
For J := 1 To ColCount Do begin
excelWorksheet1.Cells.Item[BeginRow-1,j+BeginCol]:=DBGrid1.Columns[j-1].Title.Caption;
ExcelApplication1.Range[xlRCtoA1(BeginRow-1,j+BeginCol),EmptyParam].Interior.Color:=$00B5E7F4;
ExcelApplication1.Range[xlRCtoA1(BeginRow-1,j+BeginCol),EmptyParam].Borders.Weight:=xlThin;
                         end;

  ADOQuery1.DisableControls;
  ADOQuery1.First;
  try
  while not ADOQuery1.Eof do begin

  //rows

                                  if BeginRow=NewListRowsCount then begin //ограничение здесь
                                     ExcelApplication1.Range['2:'+inttostr(ColCount),EmptyParam].Columns.AutoFit;
                                     ExcelApplication1.Range['1:'+inttostr(ColCount),EmptyParam].Columns.AutoFit;
                                     excelWorksheet1.ConnectTo(ExcelApplication1.ActiveWorkbook.Sheets.Add(EmptyParam ,ExcelApplication1.ActiveSheet,1,EmptyParam,LOCALE_USER_DEFAULT) as ExcelWorksheet);
                                     inc(ReportNum);
                                     ExcelWorksheet1.Name:='Отчет '+inttostr(ReportNum);
                                     BeginRow2:=BeginRow;
                                     if OptionForm.CheckBox1.Checked=true then begin
                                                                               ExcelApplication1.Range[xlRCtoA1(BeginRow-1,BeginCol),EmptyParam].Interior.Color:=$00B5E7F4;
                                                                               ExcelApplication1.Range[xlRCtoA1(BeginRow-1,BeginCol),EmptyParam].Borders.Weight:=xlThin;
                                                                               end;
                                     For J := 1 To ColCount Do begin
                                     excelWorksheet1.Cells.Item[BeginRow-1,j+BeginCol]:=DBGrid1.Columns[j-1].Title.Caption;
                                     ExcelApplication1.Range[xlRCtoA1(BeginRow-1,j+BeginCol),EmptyParam].Interior.Color:=$00B5E7F4;
                                     ExcelApplication1.Range[xlRCtoA1(BeginRow-1,j+BeginCol),EmptyParam].Borders.Weight:=xlThin;
                                                               end;
                                      NewListRowsCount:=NewListRowsCount+OptionForm.ESBIntEdit1.AsInteger;
                                                end;

                                  For J := 1 To ColCount Do begin  //columns
                                  ExcelWorksheet1.Cells.Item[BeginRow2,j+BeginCol]:=ADOQuery1.FieldbyName(ADOQuery1.FieldDefs.Items[j - 1].DisplayName).value;
                                  Application.ProcessMessages;
                                                            end;
                                  RzStatusPane3.Caption:=inttostr(BeginRow3);

                                  if OptionForm.CheckBox1.Checked=true then ExcelWorksheet1.Cells.Item[BeginRow2,BeginCol]:=inttostr(BeginRow3);
                                  if SpeedButton3.Down=true then exit;
                                  inc(BeginRow2);
                                  inc(beginrow3);
                                  ADOQuery1.Next;
                                  end;
  finally
ADOQuery1.EnableControls;
ExcelApplication1.Range['3:'+inttostr(ColCount),EmptyParam].Columns.AutoFit;
ExcelApplication1.Range['1:'+inttostr(ColCount),EmptyParam].Columns.AutoFit;

// делаем видимым Excel
ExcelApplication1.Visible[0]:=true;
SpeedButton3.Enabled:=true;
form3.Caption:='Duration : '+TimeToStr(Now() - Duration);
  end;

end;


форматировать не стал, скинул как есть.


Anatoly Podgoretsky   (2009-02-26 12:28:00) [13]

> Программер  (26.02.2009 6:48:18)  [18]

Какой еще сервер.


sniknik   (2009-02-26 10:23:00) [14]

а куда делся "accseess" из вопроса?


Сергей М.   (2009-02-26 08:40:00) [15]


> пишем по строче в эксель;


Вот тут самое интересное)


Программер   (2009-02-26 06:48:00) [16]

Ситуация такая, из adoquery формирую запрос с cursorlocation на сервере, при попытки записать эти записи в эксель, выходит ошибка, "недостаточно памяти для обработки команды clsid{цифры}".
как обойти эту загвоздку? видимо он опять пытается грузить все записи в память?
я делаю такую логику
while adoquery not EOF do begin
пишем по строче в эксель;
next;
end;


Anatoly Podgoretsky   (2009-02-20 13:06:00) [17]


> csv и есть реальные данные, их можно посмотреть без sql
> и zip пр. умных слов :)

Ничего подобного, csv кроме данных содержит и паразитную информацию, например кавычки и запятые.


Sergey13   (2009-02-20 09:31:00) [18]

> [15] Виталий Панасенко   (20.02.09 08:56)
> DB2 и Oracle, кажись, не имеют ограничения на объем данных(я о бесплатных версиях Express)..
Оракл имеет. 4 гига.


Виталий Панасенко   (2009-02-20 08:56:00) [19]

если данных более 2 гиг... тут,кажись, даже MS SQL Express не поможет.у него, вроде, то ли 2, то ли 4 гига ограничение.. потому либо платные(либо....), либо FireBird/DB2/Oracle/Postgress/MySQL.. а там, может, еще какие варианты. DB2 и Oracle, кажись, не имеют ограничения на объем данных(я о бесплатных версиях Express).. на объем ОЗУ имеют. ЖарПтица бесплатна по определению, без каких-либо ограничений.


Программер   (2009-02-20 08:35:00) [20]


> только сейчас думаю куда экспортировать, если эксель не
> большой обьем не поддерживает.

хотел сказать не эксель а аксесс


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо