Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Umstellung auf ADO -Probleme und Fragen (https://www.delphipraxis.net/154262-umstellung-auf-ado-probleme-und-fragen.html)

dj-pitti 3. Sep 2010 11:38

Datenbank: Access • Version: MDAC 2.8 • Zugriff über: ADO

Umstellung auf ADO -Probleme und Fragen
 
Hallo miteinander,

nach langjähriger Nutzung der freien Datenbankkomponente EDB und einem Umstieg auf Delphi 2010 bin ich nun gezwungen meine Datenanbindung auf ADO umzustellen.

Soweit habe ich die Anbindung im Griff, nur bei der Umsetzung einiger Dinge benötige ich noch Hilfe:

Ich möchte einen neuen Datensatz einfügen (ohne DB-Navigator und Datenfelder). Ich nehme angenommen zwei Edits und füge den Inhalt mittels des Codes ein:

Delphi-Quellcode:
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('INSERT INTO test (ED_Nr,ED_DATUM) VALUES ("AB31","12.03.2019")');
ADOQuery1.ExecSQL;
Der neue Datensatz ist nun drin, alles wunderbar.

Jetzt meine Frage 1:

- Ein auf der Form befindliches DBGRid registriert die Änderung nicht. Auch ein Refresh auf dem Navigator bringt nichts. Nur ein Neustart zeigt die neu angelegten Datensätze!?

Wie kann ich den aktuellen Datensatz im Grid sofort anzeigen lassen!?

Frage 2:

Welche Komponenten sind grundsätzlich wichtig - wäre es auch möglich die SQL-Befehle per ADOCommand zu machen!?

Wozu ist die ADODataSet gut!?

So, ich hoffe die Fragen waren jetzt nicht so :stupid:

Viele Grüße, Silvio

p80286 3. Sep 2010 12:12

AW: Umstellung auf ADO -Probleme und Fragen
 
Hallo Silvio,

zu Deiner ersten Frage,
hol Dir die Daten, die Du brachst und wann Du sie brauchtst immer per Query!

Ich mißtraue diesen Komponenten auf das heftigste.

Gruß
K-H

dj-pitti 3. Sep 2010 12:25

AW: Umstellung auf ADO -Probleme und Fragen
 
Hallo K-H

auch wenn das garantiert nicht für die erste Frage ist nehme ich mir dies an ...

Also immer TADOQuery nehmen?

Wie ist denn bei ADO überhaupt die Behandlung von Recordssets geregelt? Sprich ich lasse mir per WHERE bestimmte Datensätze auslesen, wie komm ich dann an diese ran!?

Bernhard Geyer 3. Sep 2010 12:46

AW: Umstellung auf ADO -Probleme und Fragen
 
Zitat:

Zitat von dj-pitti (Beitrag 1047227)
- Ein auf der Form befindliches DBGRid registriert die Änderung nicht. Auch ein Refresh auf dem Navigator bringt nichts. Nur ein Neustart zeigt die neu angelegten Datensätze!?

Wie kann ich den aktuellen Datensatz im Grid sofort anzeigen lassen!?

Hier dürfte das bescheuerte Caching-Verhalten der JET-Engine mitspielen. Wurde schon mal öfters gefragt und dürfte hier über die Suche zu finden sein.

p80286 3. Sep 2010 14:01

AW: Umstellung auf ADO -Probleme und Fragen
 
Zitat:

Zitat von dj-pitti (Beitrag 1047242)

Also immer TADOQuery nehmen?

Ich meine Ja
Zitat:

Zitat von dj-pitti (Beitrag 1047242)
Wie ist denn bei ADO überhaupt die Behandlung von Recordssets geregelt? Sprich ich lasse mir per WHERE bestimmte Datensätze auslesen, wie komm ich dann an diese ran!?

Da kann ich nur sagen wie ich es mache:
Delphi-Quellcode:
for i:=0 to .query.fields.count-1 do
          ..:=query.fields[i].value
oder
Delphi-Quellcode:
wert1:=query.fieldbyname('Feld1').asstring;
asstring wird natürlich durch asfloat etc. ersetzt falls notwendig/sinnvoll.

Die Abfrage sieht dann im Prinzip so aus:
(ich mag repeat lieber als while!)
Delphi-Quellcode:
Query.sql.text:='blabla';
Query.parameters...     // falls notwendig
Query.open;
repeat
  wert1:=query.fieldbyname('Feld1').asstring;
  .....
  query.next;
until query.eof;
query.close;
Die genaue Syntax ist allerdings von der verwendeten Komponente abhängig!
(und Fehlerbehandlung hab ich mir auch geschenkt!)

Gruß
K-H

shmia 3. Sep 2010 15:09

AW: Umstellung auf ADO -Probleme und Fragen
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1047244)
Hier dürfte das bescheuerte Caching-Verhalten der JET-Engine mitspielen.

Ganau das ist die Ursache.
Wenn man sich an folgende Regeln hält, dann funktioniert es auch mit MS Access.
1.) es gibt genau eine einzige ADOConnection pro Datenbank
Also niemals ohne ADOConnection arbeiten (obwohl das möglich wäre)

2.) Alle anderen ADO Komponenten (TADOQuery, TADODataset, TADOCommand, TADOTable) werden mit dieser ADO Connection verknüpft

3.) Property CursorLocation auf clUseServer setzen.
Das gilt nur für MS Access (Jet Engine).
Bei allen anderen Datenbanken (MS SQL Server) ist clUseClient die bessere Einstellung.

sirius 3. Sep 2010 15:31

AW: Umstellung auf ADO -Probleme und Fragen
 
Zitat:

Zitat von p80286 (Beitrag 1047268)
(ich mag repeat lieber als while!)

Und wenn kein Datensatz zurückgeleifert wird (also keiner existiert) ?

Bummi 3. Sep 2010 16:04

AW: Umstellung auf ADO -Probleme und Fragen
 
Wir Arbeiet seit Jahren nur nocht mit Adodataset, TAdoQuery hat bei Bestimmten Anforderungen Probleme gemacht (ich weiß leider nicht mehr welche).
Bei den AdoDatasets ist Requery das Kommando für die Aktualisierung, besser Du kapselst es mit eine Requery4Bookmark.
"Befehle" setzt Du am einfachsten per Connection.Execute ab.

Sehr schö lassen sich hier auch Master/Detail Beziehungen abarbeiten.

z.B.
Master:
ADSMaster.Commandtext := 'Select * from Adressen where was auch immer order by ...


Detail:
ADSDetail.CommandText := 'Select * from Rechnungen where Adressen_ID=:ID oder by Datum'


Datail.Datasource := Master_SRC
Datail.Masterfields := ID

p80286 3. Sep 2010 16:05

AW: Umstellung auf ADO -Probleme und Fragen
 
Zitat:

Zitat von sirius (Beitrag 1047299)
Zitat:

Zitat von p80286 (Beitrag 1047268)
(ich mag repeat lieber als while!)

Und wenn kein Datensatz zurückgeleifert wird (also keiner existiert) ?

Das gehört für mich zur Fehlerbehandlung
Delphi-Quellcode:
if not query.eof then begin
  // Aufnahme der Daten vorbereiten
  repeat
    //Daten holen
  until Query.eof; // ggf. eine andere Abbruchbedingung z.B. 5 Datensätze gelesen (solls geben!)
Gruß
K-H

p80286 3. Sep 2010 16:11

AW: Umstellung auf ADO -Probleme und Fragen
 
Zitat:

Zitat von shmia (Beitrag 1047283)
Zitat:

Zitat von Bernhard Geyer (Beitrag 1047244)
Hier dürfte das bescheuerte Caching-Verhalten der JET-Engine mitspielen.

Ganau das ist die Ursache.
Wenn man sich an folgende Regeln hält, dann funktioniert es auch mit MS Access.
1.) es gibt genau eine einzige ADOConnection pro Datenbank
Also niemals ohne ADOConnection arbeiten (obwohl das möglich wäre)

Es ist möglich!
Wo liegt das Problem? werden die Daten jeweils parallel durch die Connection geschoben wobei die eine nichts von der anderen weiß? (commit)

Gruß
K-H

dj-pitti 4. Sep 2010 07:18

AW: Umstellung auf ADO -Probleme und Fragen
 
Erstmal Danke für die vielen Antworten ...

Ich werde mir in Ruhe mal den Weg durchs ADO-Labyrint bahnen.

Nach einem kurzen Test ist mir aufgefallen das die Cursorstellung wichtiger ist wie der Cache :? Soweit funktioniert jetzt auch die Anzeige zur Laufzeit. Er wird jetzt zumindest nach dem Refresh im DBNavigator angezeigt...

Wie kann ich aber jetzt den Datensatz einfügen und dann auch gleich im Grid anzeigen lassen? ich habe schon vom Refresh über Resync alles probiert - es erscheint nur folgende Meldung

Code:
ADOQuery1: Operation bei geschlossener Datenmenge nicht ausführbar

Sir Rufo 4. Sep 2010 10:01

AW: Umstellung auf ADO -Probleme und Fragen
 
Wenn du dein SQL-Statement mit ADOQuery1 machst, dann bewirkt ein ADOQuery1.Refresh tatsächlich diesen Fehler.
Denn da ist ja nur ein Befehl zum Einfügen von Daten. wieso willst du den refreshen?

Die Daten holst du doch mit einer anderen Verbindung (andere Query?)
Diese musst du refreshen (bzw. Versuch es mal mit Requery)

dj-pitti 4. Sep 2010 12:43

AW: Umstellung auf ADO -Probleme und Fragen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1047437)

Die Daten holst du doch mit einer anderen Verbindung (andere Query?)
Diese musst du refreshen (bzw. Versuch es mal mit Requery)

Also müsste ich für das Grid eine eigene Query nehmen und diese nach dem Insert wieder Requery´n!?

dj-pitti 5. Sep 2010 07:24

AW: Umstellung auf ADO -Probleme und Fragen
 
Also irgendwie versteh ich die Umständlichkeit von ADO gerate nicht ...

Wie weis ich denn dem Grid eine eigene Query zu!? Muss ich dies jetzt mit einem zusätzlichen Dataset machen!?

Also eine Connection, zwei DS, zusätzlich noch Tables :?:? Ich verstehs grad nicht ...

Falls jemand ein Erbarmen mit mir hat, ein kurzer Aufbauanleitungskurs wäre wahrscheinlich das Beste. :thumb:

Sir Rufo 5. Sep 2010 09:05

AW: Umstellung auf ADO -Probleme und Fragen
 
So sollten die Verbindungen der Objekte bei dir aussehen
Code:
ADOConnection1 -+-> ADOQuery1 ---> DataSource ---> DBGrid
                +-> ADOQuery2
In ADOQuery1 schreibst du den SELECT für die Daten, die du im Grid angezeigt haben möchtest.
Mit dem ADOQuery2 führst du die SQL-Befehle aus.

Und jetzt kannst du mit ADOQurey1.Requery die Daten wieder aktualisiert im Grid anzeigen lassen.

BTW: Um einen SQL-Befehl auszuführen könntest du aber auch
Delphi-Quellcode:
ADOConnection1.Execute( <Parameter> )
nehmen

dj-pitti 5. Sep 2010 09:31

AW: Umstellung auf ADO -Probleme und Fragen
 
Aahh jetzt Ja ... Jetzt funktionierts - und ist mir (fast) verständlich.

Jetzt werd ich die Geschichte mal durchtesten und mich bei weiteren Fragen rückmelden.

Nochmals Danke und einen schönen sonnigen Sonntag!!

Sir Rufo 5. Sep 2010 09:32

AW: Umstellung auf ADO -Probleme und Fragen
 
Zitat:

Zitat von dj-pitti (Beitrag 1047589)
Aahh jetzt Ja ... Jetzt funktionierts - und ist mir (fast) verständlich.

Jetzt werd ich die Geschichte mal durchtesten und mich bei weiteren Fragen rückmelden.

Nochmals Danke und einen schönen sonnigen Sonntag!!

Look @ my Signature :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:55 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