Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datenbank wird nicht aktualisiert (https://www.delphipraxis.net/135703-datenbank-wird-nicht-aktualisiert.html)

Tyrael Y. 18. Jun 2009 09:46

Re: Datenbank wird nicht aktualisiert
 
Zitat:

Zitat von hoika

Zitat:

Connection.CommitTrans darf man nur nach einem
Query.ExecSQL; machen
Unsinn, zumindestens bei der 2. Bemerkung ... ;)

Und was willst du in der Datenbank aktualisieren mit einem SELECT?
SELECT macht in zusammen mit CommitTrans keinen Sinn.



Zitat:

Zitat von Moony
@Tyreal: Ich befürchte, dass hier das zusätzliche Problem liegt. Ich besitze kein Query sondern ein Dataset.

Wenn ich mich nicht irre gibt es bei Dataset paar Methoden, die
auch SELECT, INSERT usw. behandeln

ich glaube
Open()
Edit()
Insert()
Append()

musst mal gucken, ob es alle waren und wann welcher benutzt werden soll.

Moony 18. Jun 2009 09:56

Re: Datenbank wird nicht aktualisiert
 
Ich will die aktuelle Datenmenge aus der Datenbank in mein Dataset holen. Wenn nämlich in der zwischenzeit von Außen jemand Änderungen in der Datenbank gemacht hat, will ich die aktuellen Daten bekommen. Das passiert aber nicht wenn ich eine Aktualisierung auf meine Datenmenge durchführe. Mit Append, Edit, etc. beginne ich selbst Änderungen an der Datenbank, in diesem Fall will ich das aber nicht. Lediglich die aktuellen Daten aus der Datenbank in mein Dataset laden und per DBGrid anzeigen.

hoika 18. Jun 2009 10:39

Re: Datenbank wird nicht aktualisiert
 
Hallo,

Tyreal
Zitat:

Und was willst du in der Datenbank aktualisieren mit einem SELECT?
SELECT macht in zusammen mit CommitTrans keinen Sinn.
Doch, macht es, wenn z.B. mehrere Selects ausgeführt werden.
Jede Aktion läuft ja in einer Transaktion, ob man es will oder nicht
(egal ob select/insert/update).
Ja nach benutztem DB-Framework gibt es noch automatische Transaktionen.
Um zu verhindern, dass pro Select eine Transaktion gestartet wird,
schreibt man das StartTransaction selber.

Firebird ist ein schönes Bsp.
Benutze ich autocommit (Bde,FIBPlus, Zeos ?),
werden ein Haufen Transaktionen erzeugt,
auch wenn ich nur Selects mache, das Programm wird langsamer.


Zum Thread-Ersteller:
Der MySQL-Engine-Typ fehlt noch.


Zitat:

Wenn nämlich in der zwischenzeit von Außen jemand Änderungen in der Datenbank gemacht hat
Wer macht denn die Änderungen, dein eigenes Programm (auf einem anderen Recher?).

Zu der Fehlermeldung gibt es per Google doch eindeutige Aussagen.
Dein Programm erzeugt DB-Anweisungen, die nicht mit MySQL kompatibel sind.
Du musst erst mal rausbekommen, welche Query das direkt ist,
z.B. indem du mal alle Schreibzugriffe rasukommentierst
und dann schrittweise wieder reinnimmst.

Zitat:

"Ich kann das Programm nicht ändern"
Dann kannst du MySQL als DB nicht verwenden ...

Zum Engine-Typ:
Ist das InnoDB, werden Transaktionen unterstützt.
Um Änderungen zu sehen, die ein anderes Programm (oder dein eigenes mit anderer Connection)
gemacht hat, musst du mit Transaktionen arbeiten.


Heiko

Moony 18. Jun 2009 11:05

Re: Datenbank wird nicht aktualisiert
 
1. Ich verwende keine MySQL Datenbank sondern eine Filemaker Datenbank, die über die ODBC Schnittstelle angebunden wird.
2. Während mit der Datenbank in meiner Applikation gearbeitet wird, kann es sein dass von übergeordneter Stelle aus Flags in der Datenbank gesetzt werden, so dass ein Benutzer gewisse Datensätze nicht angezeigt bekommt.

Bsp.: Der Benutzer bekommt in der Maske nur Datensätze angezeigt, die er drucken darf (PrintFlag in der DB). Wenn jetzt der Admin währenddessen entscheidet, dass ein Datensatz doch nicht gedruckt werden darf, dann wird das PrintFlag weggesetzt. Somit gibt es eine Änderung an der Datenbank von aussen. Und genau diese Änderung will ich durch die Aktualisierung meiner Datenmenge aufrufen. Was normalerweise lediglich durch ein Requery getan sein sollte, ist aber hier nicht der fall. Warum auch immer.

hoika 18. Jun 2009 11:11

Re: Datenbank wird nicht aktualisiert
 
Hallo,

kein mysql, dann war das der andere Thread ...

Nun, warum der Code so gemacht werden soll, hättest du ja mal früher sagen können :)

Zitat:

Zur Info noch, ich habe das mit einer Access Datenbank probiert und dort werden die Werte richtig aus der Datenbank geholt.
Genau der gleiche Code ?, oder doch noch was "rumgebastelt" ...

Warum dann die Sache mit dem break (1. Post)
Du hast doch da schon das Admin-Tool, also benutze das direkt zum Setzen.

Hast du in deinem Programm überhauopt schon mal Tranktionen benutzt ?
Teste doch mal mit 2 laufenden Instanzen deines Programmes,
ob Prog1 die Änderungen von Prog 2 sieht (bei offen halten).


Heiko

Moony 18. Jun 2009 11:20

Re: Datenbank wird nicht aktualisiert
 
Genau der gleiche Codeschnipsel funktioniert bei einer Access und bei der Filemaker nicht. D.h. die geänderte Datenmenge wir bei Access richtig in mein Grid geladen und bei Filemaker nicht.

Welches Admin Tool? ich habe keins. Ich besitze nur meine Applikation und muss zwischenzeitig bei gewissen Aktionen des Benutzers die Datenmenge aktualisieren, was ich mit dem Requery druchführe.

Zitat:

Hast du in deinem Programm überhauopt schon mal Tranktionen benutzt ?
Nein, mit Transaktionen habe ich noch nie gearbeitet, war bis jetzt auch nicht notwendig.

hoika 18. Jun 2009 11:30

Re: Datenbank wird nicht aktualisiert
 
Hallo,

Zitat:

Wenn jetzt der Admin währenddessen entscheidet, dass ein Datensatz doch nicht gedruckt werden darf, dann wird das PrintFlag weggesetzt.
Also ist dein Programm gleichzeitig das Admin-Tool.

Zu Access/FileMaker.
Es wird wohl so sein, dass Access die Transaktionen anders verwendet wir FileMaker.
Jede Aktion unter Access wird sofort in die DB geschrieben,
wenn man keine Transaktionen benutzt (AutoCommit).

Starte doch mal dein Programm 2mal,
gehe in ein Form, wo Daten geändert werden können,
Prog1 ändert, Prog2 ist offen und schaut danach nach,
ob die Änderungen wirklich drinsind.
Sind sie es nicht, beende Prog2, wieder starten, schauen.

Sind sie immer noch nicht drin, Prog1 und Prog2 schliessen,
Prog2 aufmachen, nachschauen.
Wenn sie jetzt drinstehen, startet Ado beim Filemaker zu Beginn
des Programms eine Transaktion und commited die entweder erst beim Programmende
oder nach einem bestimmten Timeout.


Dann musst du dich wohl oder übel mal mit
Transaktionen / Isolation Levels beschäftigen.

Eine Notlösung wäre, als Isolation Level read uncommited zu benutzen.


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:20 Uhr.
Seite 3 von 3     123   

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 by Thomas Breitkreuz