Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi dbexpress Uni-Direktionale Datenbank zurück schreiben (https://www.delphipraxis.net/45662-dbexpress-uni-direktionale-datenbank-zurueck-schreiben.html)

Sven Janssen 10. Mai 2005 11:04

Datenbank: Informix • Version: 6SE • Zugriff über: Luxena

dbexpress Uni-Direktionale Datenbank zurück schreiben
 
Hallo,

ich bin dabei ein Delphi Programm zu schreiben welches über dbexpress Komponenten aus einer Informix Datei liest. Nun sollen Änderungen gemacht werden und diese wieder zurück geschrieben werden. Damit ich mir viel Schreibarbeit spare würde ich das gern wie bei einem TTable handhaben. Sprich die Tabelle mit .edit in den Editmodus setzen, Felder vom Typ TDBEdit ändern und mit .post das ganze zurück schreiben.

Dafür bin ich folgeneds Tutorial durchgegangen:
http://gethelp.devx.com/techtips/del...0min0701-1.asp

Was funktioniert:
Ich habe also eine TSQLConnection, ein TSQLDataSet um die Daten auszulesen. Ich habe ein TDataSetProvider welches mit dem TSQLDataSet verbunden ist.
Dazu kommt ein TClientDataSet welches mit dem TDataSetProvider verbunden ist.
Die DBEdit Felder sind mit einer TDataSource verbunden welches als DataSet das TClientDataSet verbunden hat.
Nun setze ich das TClientDataSet in den edit Modus und ich kann in den DBEdit Feldern den Inhalt verändern.

Was NICHT funktioniert:
Sobald ich aber post Aufrufe erhalte ich die Meldung
"<TClientDataSet> : Diese Operation ist bei einer unidirektionalen Datenmenge nicht gestattet"
Da die Meldung in Deutsch ist und nicht in Englisch, denke ich das die Meldung direkt von der Komponente kommt. Die Meldung vom Luxena Treiber und von Informix sind alle in Englisch.

Hoffe jemand hat ne Lösung und ich habe einfach nur etwas übersehen.
Ich weiß zwar das dies auch über TSQLConnection.execute() geht, aber genau dieser Weg ist mir für die Zukunft zu Aufwendig.

Gruß Sven

Bernhard Geyer 10. Mai 2005 11:18

Re: dbexpress Uni-Direktionale Datenbank zurück schreiben
 
AFAIK ist dein Problem genau der Schwachpunkt der dbExpress-Architektur. Du must über andere SQL-Komponenten die Daten wieder zurückschreiben und kannst nicht die schon vorhandenen Reader dafür nehmen.

Aber wieso nimmst du nicht einfache TDataset-Nachfolger wie SQLDirect und arbeitest so wie mit TTable/TQuery gewohnt?

Sven Janssen 10. Mai 2005 13:06

Re: dbexpress Uni-Direktionale Datenbank zurück schreiben
 
Ich schreibe ja gar nicht über die dbexpress Komponenten zurück, sondern über TDataSet. Dieses soll das ganze ja auch unterstützen. In der Delphi6 Hilfe wird dieser Lösungsweg auch angesprochen.
SQLDirect sagt mir nun erstmal nichts.

Ne also nochmal Geld in die Handnehmen habe ich ehrlich gesagt keine Lust. Delphi+Luxena+Informix und dann auch noch SQL Direkt.

Sven *seufz*

Marcel Gascoyne 10. Mai 2005 13:46

Re: dbexpress Uni-Direktionale Datenbank zurück schreiben
 
DBExpress unterstützt nur unidirektionale Datenmengen, sprich man kann nur vorwärts navigieren. Du brauchst also eine Komponente zum Zwischenspeichern der Ergebnismenge. Hierfür gibt es das ClientDataSet. Schau Dir mal die Dokumentation zu DBExpress an oder such mal nach einem Tutorial.

Wie mein Vorredner schon gesagt hat ist SQLDirect eine gute alternative, allerdings nicht kostenfrei. Die paar Euros ist die Komponente aber allemal wert, ich setzte diese schon seit Jahren ein und bin damit mehr als zufrieden.

Gruß,
Marcel

Sven Janssen 10. Mai 2005 14:17

Re: dbexpress Uni-Direktionale Datenbank zurück schreiben
 
@marcel
Du hast meinen Beitrag gelesen oder? Dort habe ich doch beschrieben wie ich die aten zurück schreiben möchte. Dazu habe ich sogar ein Tutorial gelinkt nachdem ich es implementiert habe und es funktioniert nicht.
Ich weiß das ich über dbexpress nicht schreiben kann und gehe daher über ein TClientDataSet.

TClientDataSet.edit funktioniert, ich kann in den DBEdit Feldern dann editieren. aber sobald ich TClientDataSet.post aufrufe erhalte ich einen Fehler.

Gruß Sven

DeepCopy 16. Okt 2008 19:48

Re: dbexpress Uni-Direktionale Datenbank zurück schreiben
 
Die Lösung in diesem Fall lautet
Delphi-Quellcode:
ClientDataSet1.ApplyUpdates(-1);
das setzen des Edit Zustands und anschliessender Post Aufruf
im TClientDataSet ist nicht notwendig/möglich, da es sich um einen Daten-Snapshot
handelt. :warn:

Grundsätzlich ist das TClientDataSet datenbankunabhänig und
schreibt d.h. auch nicht automatsch geänderte Daten via Edit/Post direkt zurück zur Datenquelle.
Das gilt für alle DB-Aktionen wie das Einfügen/Ändern und Löschen.

Wenn mann vermeiden möchte das die Daten im DB-Control geändert werden kann man
einfach die AutoEdit Eigenschaft der TDataSource Komponente auf
False setzen.

Bernhard Geyer 16. Okt 2008 21:58

Re: dbexpress Uni-Direktionale Datenbank zurück schreiben
 
Wieso wird ein fast 3 1/2 Jahre alter Thread wieder ausgepackt :gruebel:

tomes-one 14. Jun 2010 12:50

AW: dbexpress Uni-Direktionale Datenbank zurück schreiben
 
ist doch super, dass der thread am ende noch eine super lösung bekommen hat.

thanks an DeepCopy


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