Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#9

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

  Alt 23. Feb 2017, 12:37
ADO und aktuallisierbare Querys geht im Prinzip aber:

Je nach Datenbank unterschiedlich und nicht immer zwingend "fehlerfrei".

Was eventuell helfen könnte ist:

Die ADO-Querys haben u. a. die Eigenschaft CursorLocation und die Eigenschaft CursorType .

Denen kann man beiden unterschiedliche Werte in unterschiedlichen Kombinationen zuweisen.

Hier hilft es eventuell mal auszuprobieren, was bei der aktuellen Datenbank die "richtige" Kombination ist. Bei Access ist es (soweit ich mich erinnere)
Delphi-Quellcode:
Query.CursorLocation := clUseServer;
Query.CursorType := ctStatic;
Diese Kombination ist aber (aus meiner Erinnerung) bei FireBird kontraproduktiv.

Wird zusätzlich noch 'ne ADOConnection genutzt, so bei der auch mal mit den Eigenschaften CursorLocation und IsolationLevel rumspielen.

Hier mal ein unrepräääsäääännnntatieeefes, abschrääääckendes Speibiel aus meinem Sourcenfundus, um eben genau das hier aktuell diskutierte Problem (halbwegs) zu umgehen:
Delphi-Quellcode:
  // Hier den Datenbanktypen abfragen und die Werte für Cursor ... setzen.
  // CursorLocation bei SQLite muss wohl clUseClient sein,
  // bei Access aber clUseServer
  // Hier noch testen, was bei SQLite am sinnvollsten ist.
  if fDBIsSQLite then begin
    // ctUnspecified, ctOpenForwardOnly, ctKeyset, ctDynamic, ctStatic
    // Diese Variante spart Arbeitsspeicher und ist schnell.
    // Aber es gibt keine RecNo.
    // Änderungen von Datensätzen nicht möglich.
    // con.CursorLocation := clUseServer; // Dann gibt es keine RecNo :-(
    // qrySQL.CursorType := ctKeyset;
    // qrySQL.CursorType := ctStatic;
    // Benötigt viel Arbeitsspeicher, deutlich mehr, als die Datenbankgröße.
    // Ist sehr langsam.
    qrySQL.CursorLocation := clUseClient;
    qrySQL.CursorType := ctDynamic;
    // qrySQL.CursorType := ctStatic;
    // qrySQL.CursorType := ctKeyset;
    // dbckOK ist 'ne TDBCheckBox
    dbckOK.ValueChecked := 'T';
    dbckOK.ValueUnchecked := 'F';
  end else
  if fDBIsAccess then begin
    qrySQL.CursorLocation := clUseServer;
    qrySQL.CursorType := ctStatic;
    dbckOK.ValueChecked := 'Wahr';
    dbckOK.ValueUnchecked := 'Falsch';
  end else
  if fDBIsPostGres then begin
    // Programmhänger beim Speichern neuer Datensätze.
    qrySQL.CursorLocation := clUseClient;
    qrySQL.CursorType := ctDynamic;
    // Programmhänger beim Speichern neuer Datensätze.
    // qrySQL.CursorLocation := clUseClient;
    // qrySQL.CursorType := ctStatic;
    // Programmhänger beim Speichern neuer Datensätze.
    // qrySQL.CursorLocation := clUseClient;
    // qrySQL.CursorType := ctKeyset;
    // Programmhänger beim Speichern neuer Datensätze.
    // qrySQL.CursorLocation := clUseClient;
    // qrySQL.CursorType := ctUnspecified;
    // beendet den Datenbankprozess von PostGres beim Speichern neuer Datensätze.
    // qrySQL.CursorLocation := clUseServer;
    // qrySQL.CursorType := ctDynamic;
    // beendet den Datenbankprozess von PostGres beim Speichern neuer Datensätze.
    // qrySQL.CursorLocation := clUseServer;
    // qrySQL.CursorType := ctStatic;
    // beendet den Datenbankprozess von PostGres beim Speichern neuer Datensätze.
    // qrySQL.CursorLocation := clUseServer;
    // qrySQL.CursorType := ctKeyset;
    // Läßt bereits das Lesen von Datensätzen nicht zu.
    // qrySQL.CursorLocation := clUseServer;
    // qrySQL.CursorType := ctUnspecified;
    dbckOK.ValueChecked := 't';
    dbckOK.ValueUnchecked := 'f';
  end else
  if fDBIsFirebird then begin
    qryMaxTextverwaltungID.SQL.Text := 'SELECT GEN_ID(gen_TextverwaltungID,1) FROM RDB$DATABASE';
    qrySQL.CursorLocation := clUseClient;
    qrySQL.CursorType := ctDynamic;
    dbckOK.ValueChecked := '1';
    dbckOK.ValueUnchecked := '0';
  end else begin
    // Ansonsten?
    qrySQL.CursorLocation := clUseClient;
    qrySQL.CursorType := ctDynamic;
    dbckOK.ValueChecked := '1';
    dbckOK.ValueUnchecked := '0';
  end;
  qryMaxTextverwaltungID.CursorLocation := qrySQL.CursorLocation;
  qryMaxTextverwaltungID.CursorType := qrySQL.CursorType;
  qryExecSQL.CursorLocation := qrySQL.CursorLocation;
  qryExecSQL.CursorType := qrySQL.CursorType;
  // Diese Kombination scheint bei FireBird und TAdoTable zu funktionieren.
  // Nein, nicht wirklich.
  // Bei einem Refresh gibt es eine Fehlermeldung.
  if fDBIsFirebird then begin
    if not tbTextVergleich.Active then begin
      tbTextVergleich.CursorLocation := clUseClient;
      tbTextVergleich.CursorType := ctUnspecified;
    end;
    if not tbTextVerwaltung.Active then begin
      tbTextVerwaltung.CursorLocation := clUseClient;
      tbTextVerwaltung.CursorType := ctUnspecified;
    end;
  end else begin
    if not tbTextVergleich.Active then begin
      tbTextVergleich.CursorLocation := qrySQL.CursorLocation;
      tbTextVergleich.CursorType := qrySQL.CursorType;
    end;
    if not tbTextVerwaltung.Active then begin
      tbTextVerwaltung.CursorLocation := qrySQL.CursorLocation;
      tbTextVerwaltung.CursorType := qrySQL.CursorType;
    end;
  end;
  Mit Zitat antworten Zitat