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!