Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Access DB beim Rechnerstart laden (https://www.delphipraxis.net/72834-access-db-beim-rechnerstart-laden.html)

jensenwb 7. Jul 2006 16:29


Access DB beim Rechnerstart laden
 
Hallo,

ich möchte eine 45 MB große Access-Datenbank beim Rechnerstart laden damit wenn ich mein Programm starte das nicht immer ca 1 Minute dauert eh alles geladen ist.

Ich lade die Datenbank mit ADO.

Ich hatte mir auch überlegt ein kleines Programm zu schreiben welches ich beim Rechnerstart lade und die Datenbank öffne und dann wenn ich mein Programm starte auf die Komponenten des anderen Programm zu zugreifen. Aber da weiß ich nicht wie das geht.

Bernhard Geyer 7. Jul 2006 20:18

Re: Access DB beim Rechnerstart laden
 
Zitat:

Zitat von jensenwb
ich möchte eine 45 MB große Access-Datenbank beim Rechnerstart laden damit wenn ich mein Programm starte das nicht immer ca 1 Minute dauert eh alles geladen ist.
Ich lade die Datenbank mit ADO.

1 Minute um zugriff zu einer Access-Datenbank zu haben. Ich denke mal das der Fehler in deinem Programmcode liegt. Hast Du evtl. eine große Tabelle die du mittels CurserLocation (Property von TADOTable/TADOQuery) clUseClient lädst? Stell mal auf clUserServer um.

bttb930 7. Jul 2006 20:22

Re: Access DB beim Rechnerstart laden
 
was meinst du überhaupt mit "die datenbank laden"??

normalerweise "lädt" man die nicht, sondern greift nur darauf zu und holt sich immer das was man gerade braucht, aber nie die ganze db.

du kannst übrigens in Access auch sagen "datenbank reparieren und komprimieren" - danach kann es sein, dass sie soundso wesentlich kleiner als vorher ist.

Bernhard Geyer 7. Jul 2006 20:24

Re: Access DB beim Rechnerstart laden
 
Zitat:

Zitat von bttb930
was meinst du überhaupt mit "die datenbank laden"??

Das ist ja gerade die Frage an den Fragesteller. Wenn er eine Tabelle mit 1 Mio. Datensätzen mit einer TADOQuery-Komponente und CurserLocation clUseClient hat welche bei Programmstart gleich auf Active steht kann das mit der 1. Minute schon hinkommen da erst diese 1 Mio. Datensätze im speicher in einen Clientcurser kopier werden müssen.

jensenwb 9. Jul 2006 08:56

Re: Access DB beim Rechnerstart laden
 
Ich habe jetzt bei meinen beiden ADOTable die CursorLocation auf clUseClient geändert und jetzt bringt er bei ADOTable2 wo ich eine Masterfield-Verknüpfung zu ADOTable1 habe die Fehlermeldung "Die Datenmenge ünterstützt keine Positionsmarken, die von Multi-Datensatz-Elementenbenötigt wird."

Was muß ich den jetzt machen damit meine Haupt- und Detailanzeige funktioniert.

Bernhard Geyer 9. Jul 2006 09:04

Re: Access DB beim Rechnerstart laden
 
Hab ich was davon erzählt auf clUseClient umzustellen? clUseClient war mein Vorschlag wieso es so lange dauert.

Ich tipp einfach mal darauf das bei der Master-Detail-Beziehung zu viele Datensätze in den Speicher geschaufelt werden müssen. Was passiert wenn die Master-Detail-Beziehung erst auf Knopfdruck aktiviert wird. Wie sind dann die Ladezeiten?

jensenwb 9. Jul 2006 09:25

Re: Access DB beim Rechnerstart laden
 
Sorry ich meinte doch clUseServer.

Wenn ich das über einen Button zuweisen tue dann bekomme ich folgende Fehlermeldung: "Ein Objekt, das dem angeforderten Namen oder dem Originalverweis entspricht, kann nicht gefunden werden."

Folgenden Code benutze ich im Button

Delphi-Quellcode:
  ADOTable2.MasterSource := DataSource1;
  ADOTable2.MasterFields := 'Job';
  ADOTable2.IndexFieldNames := 'Auftrag';

Jelly 9. Jul 2006 10:24

Re: Access DB beim Rechnerstart laden
 
@Bernhardt: Ich tippe mal, dass Access keine unterschiedlichen Curortypen kennt. Stattdessen wird bei einer Desktodatenbank (und nichts anderes ist Access im Endeffkt), der gesamt Recordset zum Client geschaufelt.

jensenwb, wieviel Records hat Du denn in deinem Resultset. Prinzipiell macht es überhaupt keinen Sinn, ein "Select * from..." durchzuführen (oder ein TTable zu nutzen, selbst wenn Du ein Filter setzt), auch nicht bei einer "richtigen" Datenbank. Kein Mensch wird sich ein paar hundert Tausend Records manuell ankucken, sondern braucht immer eine Suchfunktion. Vielleicht solltest Du mal in die Richtung hin arbeiten.

jensenwb 9. Jul 2006 10:47

Re: Access DB beim Rechnerstart laden
 
Ich habe in der einen Datenbank ca 70.000 Datensätze und in der dazugehörenden anderen Datenbank ca 117.000 Datensätze. Wenn ich in der kleinen Datenbank einen Datensatz anzeige dann brauche ich in der Dazugehörenden großen Datenbank die entsprechenden Datenätze um die entsprechenden Touren zu ermitteln.

mkinzler 9. Jul 2006 10:49

Re: Access DB beim Rechnerstart laden
 
Bei solch großen Datenmengen würde ich mir wirklich die Migration auf eine richtinge C/S Datenbank überlegen.

jensenwb 9. Jul 2006 10:54

Re: Access DB beim Rechnerstart laden
 
Ich habe das Problem das es eine MSAccess Anwendung schon existiert und ich eine Anwendung in Delphi schreiben soll die noch einige Funtkionen mehr hat als die jetzige Version. Und ich muß ja dann die Datenbank 1 zu 1 übernehmen um keine Ausfallzeit dann zu haben.

mkinzler 9. Jul 2006 11:01

Re: Access DB beim Rechnerstart laden
 
Soll dann Access und Delphi-Version parallel laufen?

jensenwb 9. Jul 2006 11:03

Re: Access DB beim Rechnerstart laden
 
Nein, es soll dann nur noch die Delphi-Version laufen. Beziehungsweise wenn noch irgendwelche Fehler festgestellt worden (was ich nicht hoffen will) dann soll die Access-Anwendung noch mal benutzt werden

Jelly 9. Jul 2006 11:07

Re: Access DB beim Rechnerstart laden
 
Zitat:

Zitat von jensenwb
Ich habe in der einen Datenbank ca 70.000 Datensätze und in der dazugehörenden anderen Datenbank ca 117.000 Datensätze. Wenn ich in der kleinen Datenbank einen Datensatz anzeige dann brauche ich in der Dazugehörenden großen Datenbank die entsprechenden Datenätze um die entsprechenden Touren zu ermitteln.

1. Wie holst Du dir den einen Datensatz aus der ersten Tabelle ?

2. Und wie aus der 2-ten. Du wirst nie und nimmer die 117000 Datensätze anzeigen müssen, und auch nicht zu deinem Programm zu transferieren... Durch Setzen deinen MasterDatasource ist es einzig und allein Delphi, der sich ums Filtern kümmert, und nicht Access. Es werden also alle 117000 transferiert, und Delphi zeigt nur die Datensätze an, die matchen...

Deshalb besser:
1. Select * from Tabelle1 where Name='Dagobert Duck' ;

Das liefert dir genau einen Record, deinen Masterrecord. Mit einem entsrpechendem Index auf der Spalte Name, dauert das selbst bei Access keine 1/10 Sekunde.

Dann im OnAfterScroll Event würd ich die 2. Query aufbauen, die so aussehen kann:
Select * from Tabelle2 where AdrId = :Id

Delphi-Quellcode:
begin
   with Tabelle2 do begin
      close ;
      Parambyname ('id').AsInteger := Tabelle1.FieldByName('deinePrimaryKeySpalte').AsInteger ;
      open ;
   end ;
end ;
Das hat den ganz entscheidenden Vorteil, dass Access nur die Datensätze liefert, die auch wirklich relevant sind.

mkinzler 9. Jul 2006 11:09

Re: Access DB beim Rechnerstart laden
 
Ich bin der Meinung, daß bei einer Neuentwicklung auf erkannte Schwachstellen reagiert werden sollte, ich würde ein Wechsel der Datenbank-Plattform ernsthaft in Betracht ziehen.
BTW man kann auch die Access-datenbank auf externe Datenbanken umlenken, so daß auch die Access-Anwendung später auf die neue datenhaltung zugreifen könnte.

jensenwb 9. Jul 2006 11:14

Re: Access DB beim Rechnerstart laden
 
Welche Datenbank wird den entfohlen wenn man so eine große Datenmenge hat.

mkinzler 9. Jul 2006 11:16

Re: Access DB beim Rechnerstart laden
 
Zitat:

Zitat von jensenwb
Welche Datenbank wird den entfohlen wenn man so eine große Datenmenge hat.

Da gibt es viele Alternativen MSSql, FireBird, Oracle, DB2, ...
Wenn du weiter mit ADO arbeiten möchtest ist MSSql vielleicht die beste Alternative, wenn eifaches Deployment und wenig Administrationsaufwand im Vordergrund steht FireBird. Diese Entscheidung ist aber recht subjektiv zu treffen.

Jelly 9. Jul 2006 11:26

Re: Access DB beim Rechnerstart laden
 
Zitat:

Zitat von mkinzler
Wenn du weiter mit ADO arbeiten möchtest ist MSSql vielleicht die beste Alternative, wenn eifaches Deployment und wenig Administrationsaufwand im Vordergrund steht FireBird. Diese Entscheidung ist aber recht subjektiv zu treffen.

Wichtig: Bei MSSQL fallen SEHR teure Lizenzgebühren an, ausser man bleibt bei der SQL Express Variante, die aber für erste sicherlich ausreichen wird.

Wieviel Tabellen und Views sind denn in der Accessdatenbank enthalten?

Beim Umschwung von Access auf einen SQL Server ist dennoch zu bearbeiten, dass man sich nun in einem richtigen Client Server System bewegt, mit all seinen Vor- und Nachteilen. Vorteile liegen auf der Hand. Nachteile: Multiuserumgebung, bei der man als Entwickler achten muss. Da fallen so Sachen wie Transactionmanagent an. Mein Tipp: Wenn es eine Singleuserumgebung bleibt, so wird auch Access weiterhin ausreichend sein, keine Frage. Denn auch beim SQL Server dauert das Transferiern von grossen Datenmengen zum Client so seine Zeit.

mkinzler 9. Jul 2006 11:31

Re: Access DB beim Rechnerstart laden
 
Zitat:

Wenn es eine Singleuserumgebung bleibt, so wird auch Access weiterhin ausreichend sein, keine Frage.
Dann wäre aber wirklich zu überlegen ob eine Speicherung der Datenbank im Netzt dann sinnvoll ist.
Zitat:

Denn auch beim SQL Server dauert das Transferiern von grossen Datenmengen zum Client so seine Zeit.
Ein einfaches Umstellen von Filebasierter auf C/S-Datenbank allein reicht natürlich nicht. Es muß u:u. auch einige Abfragen angepasst und optimiert werden.

jensenwb 9. Jul 2006 11:46

Re: Access DB beim Rechnerstart laden
 
In der Access Datenbank sind 14 Tabellen enthalten, es ist eine Singeluser-Anwendung.

Also die Anwendung wir auf einen Computer verwendet und es greifen auch keine anderen User drauf zu.

mkinzler 9. Jul 2006 11:48

Re: Access DB beim Rechnerstart laden
 
Immer vom gleichen PC oder von verschiedenen?

jensenwb 9. Jul 2006 11:51

Re: Access DB beim Rechnerstart laden
 
Immer vom gleichen PC aus

mkinzler 9. Jul 2006 11:54

Re: Access DB beim Rechnerstart laden
 
Dann könnte es ja helfen, die Datenbank lokal zu halten und nur Sicherheitszwecken Kopien auf dem server zu halten.

jensenwb 9. Jul 2006 11:55

Re: Access DB beim Rechnerstart laden
 
Die Datenbank liegt ja auf dem gleichen Computer wie die Anwendung, es geht mir doch um die Ladezeiten der Datenbank

mkinzler 9. Jul 2006 11:59

Re: Access DB beim Rechnerstart laden
 
Zitat:

Zitat von jensenwb
Die Datenbank liegt ja auf dem gleichen Computer wie die Anwendung, es geht mir doch um die Ladezeiten der Datenbank

Dann bin ich und ich vermute mal andere Poster hier auch von falschen Umständen ausgegangen.
Dann solltest du aber auf jedenfall mal deine Abfragen überprüfen.

Jelly 9. Jul 2006 12:42

Re: Access DB beim Rechnerstart laden
 
Zitat:

Zitat von mkinzler
Dann bin ich und ich vermute mal andere Poster hier auch von falschen Umständen ausgegangen.

Nö, es ging doch ganz klar hervor, dass es sich um die Ladezeiten handelt.

@jensenwb: Hast Du meine Tipps schon umgesetzt... Das sollte definitiv helfen.

Bernhard Geyer 9. Jul 2006 21:08

Re: Access DB beim Rechnerstart laden
 
Zitat:

Zitat von Jelly
@Bernhardt: Ich tippe mal, dass Access keine unterschiedlichen Curortypen kennt. Stattdessen wird bei einer Desktodatenbank (und nichts anderes ist Access im Endeffkt), der gesamt Recordset zum Client geschaufelt.

Teilweise richtig. Access hat, wie auch der MS SQL-Server, keinen Clientseitig eigen Implementierten Curser. Hier wird immer die "Standard-"Implementierung von ADO genommen. Aber im gegensatz zu einem MS SQL-Server bringt es nichts mit einem Clientseitigen Curser zu arbeiten da ja auch der Serverseitige Curser im Adressbereich der Anwendung geladen ist und keine "Serverlast" erzeugt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz