Edycja rekordów w BDE - bląd ''At beginning of table''

0

Witam,

Celem mojej funkcji jest odczytanie zawartości 108 plików składających się z pól miliona linijek i dodanie ich do tabeli w bazie danych Paradox poprzez BDE. W chwili uruchomienia programu tabela ma jedną kolumnę i pól miliona wierszy, dla każdego pliku program tworzy kolejną kolumnę i uzupełnia jej zawartość. Wszystko działa bez zarzutu jednak program jest potwornie wolny dodaje zaledwie ok 1000 wierszy na sekundę dla pojedyńczego pliku.

Wydaje mi sie ze powodem jest wyświetlanie zawartości bazy danych w oknie programu w komponencie DBGrid, jednak gdy usune polaczenie DataSource albo gdy ustawie właściwość DBGrid.Visible na False funkcja Table.Edit powoduje błąd:
"At beginning of table"
od wczoraj szukam w google rozwiązania niestety bezskutecznie...

Kod funkcji:

procedure TForm1.Button6Click(Sender: TObject);
var
  PlikCel: TextFile;
  oldopen, linia, wyraz, NazwaPliku: String;
  i,z,k,wyr,pos: Integer;
  sttab: Boolean;
  f,g : TField;

begin
  oldopen:=OpenDialogCel.FileName;
  OpenDialogCel.Execute;  pos:=0;
  if OpenDialogCel.FileName<>oldopen then
    for k:=0 to OpenDialogCel.Files.Count-1 do
    begin
      AssignFile(PlikCel, Form1.OpenDialogCel.Files[k]);
      NazwaPliku:=ExtractFileName(OpenDialogCel.Files[k]);

      SQLQuery.SQL.Clear;
      DBCel.Active:=False;
      SQLQuery.SQL.Add('ALTER TABLE Cel ADD MEAN'+IntToStr(DBCel.FieldDefs.Count)+' CHAR(10);');
      SQLQuery.ExecSQL ;
      DBCel.Active:=True;

      DBCel.RecNo:=0;

      sttab:=False; z:=0;
      try
        Reset(PlikCel);
        DBCel.Edit;
        while not EoF(PlikCel) do
          begin
            Readln(PlikCel,linia);
            wyraz:='';

            if Trim(linia)='' then sttab:=False; //konczy odczyt wartosci

            if sttab=True then
              begin
                inc(z);
                wyr:=0;
                for i:=1 to Length(linia) do
                  begin
                    wyraz:=wyraz+Linia[i];
                    if (Linia[i]=#9) or (i=Length(linia)) then
                      begin
                        inc(wyr);

                        case wyr of
                          3: begin  
                                 DBCel.Edit; 
                                 DBCel['MEAN'+IntToStr(DBCel.FieldDefs.Count-1)]:=StringReplace(Trim(wyraz), '.', ',',[]);  
                                 DBCel.Post; 
                                 DBCel.MoveBy(1); 
                              end;
                          {4: Form1.DBUstawien[NazwaPliku+'STDV']:=StringReplace(Trim(wyraz), '.', ',',[]);
                          5: Form1.DBUstawien[NazwaPliku+'PIX']:=StringReplace(Trim(wyraz), '.', ',',[]);}
                        end;
                        wyraz:='';

                      end;
                  end;
              end;

            //od nastepnej linii wartosci beda odczytywane
            if Trim(linia)='CellHeader=X	Y	MEAN	STDV	NPIXELS' then sttab:=True; 

          end;
      finally
        CloseFile(PlikCel);
      end;
      ListaPlikowCel.Items.Add(NazwaPliku);
      ListaPlikowCel.Checked[ListaPlikowCel.Items.Count - 1]:=True;
      Memo1.Lines.Add(IntToStr(z));
    end;
  OpenDialogCel.FileName:=ExtractFileDir(OpenDialogCel.FileName)+'.cel';
end;

Wywołanie funkcji dla pojedynczego pliku bez zapisu do bazy danych (łącznie z tym potworkiem: StringReplace(Trim(wyraz), '.', ',',[]);) jest stosunkowo szybkie - ok 3 sek.
Usuwanie pojedynczej kolumny z kolei także trwa troche zbyt długo (okolo 10sec), nawet gdy jest pusta.

SQLQuery.SQL.Add('ALTER TABLE Cel DROP COLUMN '+DBCel.FieldDefs[1].Name+';');
SQLQuery.ExecSQL;

Jak ominąc błąd "At beginning of table"?
W jaki sposob mozna przyspieszyc dzialanie programu?

Bede bardzo wdzieczny za wszelka pomoc.

0
DBCel.DisableControls;
try
  //wstawianie rekordów do tabeli
finally
  DBCel.EnableControls;
end;

więcej na http://dn.codegear.com/article/20563

0

Wielkie dzięki, teraz działa błyskawicznie
niepotrzebnie skupiałem sie na usuwaniu DBGrid...
Cały artykuł także sie na pewno przyda.

Teraz pozostaje mi jedynie problem z usuwaniem kolumn, obecnie, wykonanie w/w zapytania SQL które je usuwa trwa porównywalnie długo do ich tworzenia.

0

to normalne

0

Normalne dla BDE?
Przejscie na inny system np ADO mogloby cos zmienic?

Tak czy inaczej chyba bede musial poszukac czegos innego bo po wczytaniu 24/108 plikow tabela jest juz pełna.

1 użytkowników online, w tym zalogowanych: 0, gości: 1