Einzelnen Beitrag anzeigen

grayfox

Registriert seit: 22. Jan 2003
Ort: Litschau
173 Beiträge
 
Delphi 4 Standard
 
#1

tabelle wird riesengroß ...

  Alt 10. Apr 2004, 22:27
hi folks!

ich muss mich leider mit D4 standard mit access-tabellen befassen. dazu verwende ich die nativen ado-komponenten 2.1
so weit bin ich mit ihnen zufrieden, nur die tabellen werden beim einfügen von datensätzen unnatürlich gross.
10000 datensätze mit einem longinteger und einem varchar(15) verursachen eine tabellengrösse von rund 1,6 MB - nach der kompression durch ms-access beträgt die grösse wieder annehmbare 400 kb.
die 1,6 MB sind nicht das problem, das verkraftet meine HD schon noch, aber ich möchte (muss) rund 12 mio datensätze eintragen.
übersehe ich ich irgendetwas?

meine prozeduren sehen zur zeit so aus:

Delphi-Quellcode:
ConString:= 'Provider=Microsoft.Jet.OLEDB.4.0;'
  + 'Data Source=%s;Jet OLEDB:Engine Type=4';

procedure TMainDlg.Tab_anlegenClick(Sender: TObject);
var
  aCon: _Connection;
  vRows: OleVariant;
  i, MaxRec: LongInt;
  c1, c2: String;
begin
  c1:= 'CREATE TABLE TestTbl2 (ID INT NOT NULL PRIMARY KEY, '
    + 'Wert VARCHAR(15))';
  c2:= 'INSERT INTO TestTbl2 (ID, Wert) VALUES (%d, "%s")';
  aCon:= CoConnection.Create;
  aCon.CursorLocation:= adUseClient;
  aCon.Open(aConString,'','',adConnectUnspecified);
  MaxRec:= 10000;
  try
    aCon.Execute(c1,vRows,adExecuteNoRecords);
    for i:= 1 to MaxRec do begin
      aCon.Execute(Format(c2,[i, 'Nr: ' + IntToStr(i)]),
        vRows,adExecuteNoRecords);
      if (i mod 100 = 0) then begin
        StaticText1.Caption:= Format('Satz %d von %d',[i,MaxRec]);
        StaticText1.Update
      end
    end;
  finally
    StaticText1.Caption:= Format('Satz %d von %d',[i,MaxRec]);
    StaticText1.Update;
    aCon.Close;
    aCon:= nil
  end;
end;

procedure TMainDlg.eintragen1Click(Sender: TObject);
var
  aCon: _Connection;
  aRecordSet1: _RecordSet;
  i, MaxRec: LongInt;
  vRS, vRows: OleVariant;
  c1: String;
begin
  c1:= 'CREATE TABLE TestTbl2 (ID INT NOT NULL PRIMARY KEY, '
    + 'Wert VARCHAR(15) NOT NULL)';
  MaxRec:= 10000;
  aCon:= CoConnection.Create;
  aCon.Open(aConString,'','',adConnectUnspecified);
  aCon.Execute(c1,vRows,adExecuteNoRecords);
  aRecordSet1:= CoRecordSet.Create;

  try
    aRecordSet1.Open('SELECT * FROM TestTbl2',aCon,adOpenStatic,
      adLockOptimistic,adCmdText);

    vRs:= OleVariant(aRecordSet1);
    for i:= 1 to MaxRec do begin
      if (i mod 100 = 0) then begin
        StaticText1.Caption:= Format('Satz Nr: %d von %d',[i,MaxRec]);
        StaticText1.Update
      end;
      vRs.AddNew;
      vRs.Fields[0].Value:= i;
      vRs.Fields[1].Value:= Format('Eintrag: %d',[i]);
      vRs.Update;
    end;

  finally
    StaticText1.Caption:= Format('Satz Nr: %d von %d',[i,MaxRec]);
    StaticText1.Update;
    aRecordSet1.Close;
    aCon.Close
  end;
end;
ganz gleich, ob ich die einträge über die connection oder einen recordset durchführe - das ergebnis bleibt immer das selbe.

vielleicht fällt jemandem etwas dazu ein, das mir weiterhilft.

mfg, stefan
ps: schöne ostern!
  Mit Zitat antworten Zitat