AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken refresh der Daten aus einer Datenbank --- aber wo ?
Thema durchsuchen
Ansicht
Themen-Optionen

refresh der Daten aus einer Datenbank --- aber wo ?

Ein Thema von bernhard_LA · begonnen am 22. Feb 2017 · letzter Beitrag vom 23. Feb 2017
Antwort Antwort
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#1

refresh der Daten aus einer Datenbank --- aber wo ?

  Alt 22. Feb 2017, 21:00
Datenbank: MSSQL • Version: 16 • Zugriff über: ADO
unsere Anwendung verwendet eine Main Connection (TADOConnection) . Diese Connection wird dann von einer Vielzahl von Unterprogrammen verwendet um Daten zu manipulieren. Die einzelnen Routinen änderen Datansätze ab , fügen hinzu ..... das Übliche halt.
Wir verwenden auch ein DB Grid + Datasource um Daten aus einer Query anzuzeigen.

Wenn ich Datensätze in der Tabelle jetzt hinzufügen kommt das DBGrid damit nicht klar, Fehlermeldung " Key geändert". Der DBNavigator Refresh geht nicht mehr.

ich könnte jetzt folgende machen
Delphi-Quellcode:
  MainStatusBar.SimpleText := 'refresh database ......';

  ADOConnection.Connected := False;

  ADOConnection.Connected := true;

  ///
  /// load again
  ///
  loadListsFromDB();
Gibt es eine bessere Idee allen an der Connection hängenden Datenverbindungen mitzuteilen "Achtung neue Daten" , bitte alles neu laden!!!!, oder so ähnlich

Geändert von TBx (23. Feb 2017 um 07:45 Uhr) Grund: Titel angepasst
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

AW: refresh der Datenaus einer Datenbank --- aber wo ?

  Alt 22. Feb 2017, 21:14
query.close + query.open sollte reichen, die Verbindung muss dazu nicht geschlossen werden.

Eventuell reicht auch schon ein query.Refresh.

Dem DBNavigator ein OnClick-Ereignis verpassen und dann
Delphi-Quellcode:
procedure TForm1.DBNavigator1Click(Sender: TObject; Button: TNavigateBtn);
begin
  if Button = nbRefresh then Query.Refresh;
end;
könnte aber auch ausreichen.
Wenn nicht dann dort etwas uneleganter
Delphi-Quellcode:
procedure TForm1.DBNavigator1Click(Sender: TObject; Button: TNavigateBtn);
begin
  if Button = nbRefresh then begin
    // Irgendwie den aktuellen Datensatz merken
    // und dann
    Query.Close;
    Query.Open;
    // und dann wieder zu dem oben gemerkten Datensatz wechseln.
  end;
end;
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: refresh der Datenaus einer Datenbank --- aber wo ?

  Alt 22. Feb 2017, 23:18
query.refresh führt zu dieser AV Fehlermeldung ....
Angehängte Grafiken
Dateityp: jpg query_refresh_failure.JPG (26,3 KB, 51x aufgerufen)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: refresh der Datenaus einer Datenbank --- aber wo ?

  Alt 23. Feb 2017, 06:23
Hallo,
fehlt da vielleicht der Primary Key?
Close/Open sollte aber gehen.
Heiko
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#5

AW: refresh der Datenaus einer Datenbank --- aber wo ?

  Alt 23. Feb 2017, 06:42
Naja, die Meldung scheint ja eine der weniger schlimmen zu sein. Könnte man gezielt abfangen, wohlgemerkt gezielt!
Falls der Datensatz jedoch vermisst wird, muss man das wohl klären.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.429 Beiträge
 
Delphi 12 Athens
 
#6

AW: refresh der Datenaus einer Datenbank --- aber wo ?

  Alt 23. Feb 2017, 07:15
Moin...
Meine Lieblingsfehlermeldung mit ADO und MSSQL...

Der Fehler hat sowohl nichts mit dem DBNavigator oder dem Eintragen im Grid zu tun. Er triff einfach beim Post auf. Ob die Tabellen einen PK haben (hatten alle einen) ist unerheblich. Die einzige Variante zur Lösung ist die von nahpets.
Delphi-Quellcode:
procedure TForm1.DBNavigator1Click(Sender: TObject; Button: TNavigateBtn);
begin
  if Button = nbRefresh then begin
    // Irgendwie den aktuellen Datensatz merken
    // und dann
    Query.Close;
    Query.Open;
    // und dann wieder zu dem oben gemerkten Datensatz wechseln.
  end;
end;
...das hällt bis zum nächsten Mal mit einer anderen Query. Manchmal half nur das neu Erzeugen der Query. Ich hab nie raus bekommen warum das so ist. ADO hat seinen Beitrag dabei.

Tipps:

1. Der MSSQL Server reagiert immer wieder mal alergisch auf permant offene Querys. Ein modernes DBMS sollte nie mit DB sensitiven Controls (da gehört auch das DBGrid dazu) manipuliert werden, sondern nur mit klassischen Querys mit Transaktionssteuerung. Erst Recht bei MultiUser Umgebungen.
2. Die Querys nur so lange offen lassen wie sie gebraucht werden... Create und try finally Free
3. Wenn es das Projekt zuläßt, sollte ein Umbau auf eine Objektstruktur zur Datenmanipulation helfen. Quasi Intern mit Objekten arbeiten und nur die Datenmanipulation z.B. in einem Interface ablaufen lassen. Der einzige wer die Datenbank kennt ist das Interface.
Sorry: Ich bin Fan von dieser Struktur ohne DB sensitive Controls: GUI <-> Logik <-> DB ...ich konnte es mir leider nicht verkneifen.
https://de.wikipedia.org/wiki/Schichtenarchitektur (siehe Klassische Schichten innerhalb einer mehrschichtigen Architektur)


Geändert von haentschman (23. Feb 2017 um 14:06 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:01 Uhr.
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