mikrocontroller.net

Forum: PC-Programmierung Delphi AccessDatenbank ADO SQL Query


Autor: Manfred Schön (mandinice)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallöchen

Ich greife von meinem Delphiprogramm mittels ADO und SQL auf eine Access 
Datenbank zu.

Das schreiben eines Datensatzes dauert ca. 0,15sec.
In der Accessdatenbank befinden sich gerade mal 3 Datensätze.
Ein Datensatz besteht aus ca. 50 Feldern.

Warum dauert dies solange ? Ist das normal ?
Wie ginges es schneller.


Ich muss des öfteren mehrere Datensätze lesen, ändern und wieder 
schreiben.
Der Benutzer der Software soll aber nicht zu lange warten müssen.

Vielen Dank für Eure Hilfen.

hmg
Mandi

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich würde ne richtige datenbank nehmen (mysql, postgresql, mssqql) und 
nicht über ADO sonder über ODBC gehen, ist zwar umständlicher aber 
wesentlich schneller.

Ist es bei dir wirklich die einfüge zeit oder auch die Zeit zum öffnen 
der datenbank?

Autor: Edi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die gleiche Konstellation kommt bei mir zwar auch öfters vor, aber ich 
kann nicht behaupten, dass die Kombination Delphi - ADO - Jet Engine so 
langsam wäre. Bei 0,15s kann irgend etwas nicht stimmen. Dauern 2 
aufeinanderfolgende Datensätze dann 0,30s? Wenn ja, muss man vermutlich 
am Code was ändern. Wenn nein, dauert nur das erste Öffnen der 
Connection und das Anmelden so lange.

Autor: Manfred Schön (mandinice)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Edi.

Hier ein Codebeispiele wie ich es mache :

s := 'UPDATE Pumpendaten SET Name1 = Wert1 , Name2 = Wert2 .......
s := s + '" WHERE LaufendeNummer = ' + IntToStr(Index);
ADOQuery1.SQL.Clear;        ADOQuery1.SQL.Add(WideString(s));
ADOQuery1.ExecSQL;


Ich habe keine Ahnung, ich kann mit aber schon vorstellen, dass dabei 
jedesmal eine neue Verbindung zur Datenbank aufgebaut werden muss und 
dass dies natürlich dauert.

Wie kann ich es machen die Verbindung aufzubauen, alle Änderungen 
durchzuführen und dann die Verbindung wieder zu schliessen.

Vielen Dank für Eure Hilfe.

hmg
Mandi

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
eventuell sollte du ein paar Randbedingungen noch erwähnen.

Wieviele Indexe sind auf der Tabelle,
Wieviele Daten sind schon drin,
Wie schnell ist der Rechner (bei einem 386 sind 0,15s schon sehr gut)

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Liegt auf LaufendeNummer ein Index?

Autor: Andreas Gf (andreasgf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Manfred,

mit Delphi über ADO auf Access zugreifen und das noch über SQL ist immer 
mit Problemen behaftet. Access kann kein SQL, sämtliche SQL Befehle 
werden nur simuliert und intern übersetzt und ausgeführt.

Probleme Access - ADO >> Stichwort : Cachingverhalten von Access

Sicherlich hängt die Ausführung vom Rechner, der DB-Struktur (Index, etc 
) und ... noch ab.

Ich nutze Absolute Database und bin zufrieden.

kleiner Tipp :

wenn du die Felder pro Datensatz verringern kannst wird es auch 
schneller, prüf mal ein DB Aufbau.

Gruß
Andreas

Autor: Edi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>mit Delphi über ADO auf Access zugreifen und das noch über SQL ist immer
>mit Problemen behaftet.

Kühne Behauptung. Ich mach das seit Jahren, es gab nie Probleme.

>Access kann kein SQL, sämtliche SQL Befehle
>werden nur simuliert und intern übersetzt und ausgeführt.

Ich glaube, ich muss alles neu lernen :-)

@ Manfred Schön (mandinice):
Sorry dass ich mir mit der Antwort Zeit gelassen habe, ich war 
unterwegs.

Du hast doch sicher irgendwo einen Connection String. Gibst Du den im 
TADOQuery an, oder hast Du eine TADOConnection? Bei mir läuft das immer 
so: Ich lege eine TADOConnection (ADOConnection1) auf die Form. Bei 
allen ADOQuerys, also ggf. auch auf anderen Forms, setze ich die 
Eigenschaft "Connection" auf "ADOConnection1" (bzw - wenn die ADOQuery 
auf einer anderen Form ist, auf "Form1.ADOConnection1"). In den 
ADOQuerys bleibt die Eigenschaft "ConnectionString" leer, nur bei 
ADOConnection1 steht der richtige Connection String in der Eigenschaft 
"ConnectionString". Jetzt setze ich In der ADOConnection1 noch die 
Eigenschaft "LoginPrompt" auf false (weil mich das nervt und weil ich 
das üblicherweise nicht brauche). Alles andere läuft wie gehabt.

Der Vorteil ist, dass nur einmal eine Verbindung aufgebaut wird, sobald 
das erste mal von einer ADOQuery ein SQL-String gesendet wird. 
Anschließend bleibt die Verbindung bestehen, bis das Programm beendet 
wird oder bis Du "ADOConnection1.Connected := false" sagst.

Allen anderen Aussagen zum Trotz: Mit Delphi über ADO per SQL auf eine 
Access-Datenbank geht völlig problemlos. Selbstverständlich gibt es auch 
andere Lösungen, und vielleicht sind sie sogar besser, aber das heißt 
nicht, dass diese Lösung nicht funktioniert.

Autor: Manfred Schön (mandinice)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Edi

Danke.

Ich denke den Tip habe ich gebraucht.

hmg
Mandi

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.