![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
5 миллионов записей
Программер © (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]
> только сейчас думаю куда экспортировать, если эксель не
> большой обьем не поддерживает.
хотел сказать не эксель а аксесс