![]() |
tabelle wird riesengroß ...
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:
ganz gleich, ob ich die einträge über die connection oder einen recordset durchführe - das ergebnis bleibt immer das selbe.
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; vielleicht fällt jemandem etwas dazu ein, das mir weiterhilft. mfg, stefan ps: schöne ostern! :) |
Re: tabelle wird riesengross...
12 mio. Einträge in MS Jet? :shock:
Suche dir lieber eine Datenbank. Mit MS Jet wirst du schon weit vor dem 12 mio.-sten Einträg eine korrupte Datei vorfinden. |
Re: tabelle wird riesengross...
hallo robert!
es geht ja auch gar nicht um die 12 mio (das ist auch nur eine vorsichte schätzung ;) ) ich frag mich, wieso die nativen ADO-komponenten derart grosszügig mit dem speicherplatz umgehen... wegen einer DB frag ich dich nicht, sonst verkaufst mir gleich ORACLE :mrgreen: mfg, stefan |
Re: tabelle wird riesengroß ...
Ich glaube das hat nix mit den Komponenten zu tun.
Du greifst über die per MS Jet 4.0 auf das prökelige .mdb-Dateichen zu. Access ist doch nur Oberfläche für MS Jet (sozusagen MS Jet fD, du willst nicht wissen, was fD heißt :mrgreen: ). Wenn du dort auf komprimieren klickst, dann schmeißt er allen unnötigen Müll raus. Hättest du dort die 10k Einträge eingefügt, wäre das Ergebnis IMHO gleich. Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz