Announcement

Collapse
No announcement yet.

Probleme mit Borland BDE Datenbank Komponenten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Probleme mit Borland BDE Datenbank Komponenten

    Hallo,
    ich habe ein Problem mit BDE Komponenten. z.B. DBGrid oder DBEdit

    Ich habe eine TDatasource-, TTable und TDBGrid-Komponente auf der Form plaziert. Alle Eigenschaften sind so gesetzt, dass beim Starten des Programms in dem DBGrid eine Tabelle aus einer Datenbank (MySQL auf RedHat Linux) angezeigt wird. Die Eigenschaft 'ChashedUpdate' der Tabellenkomponente habe ich auf false gelassen.
    Soweit kein Problem. Nehmen wir an im 1. Tabellenfeld steht 'TestWert123' und ich ändere ihn nun in 'TestWert234' und wechsele dann zum nächsten Datensatz in der Tabelle dann funktioniert alles. Doch jetzt der Fehler: wenn ich den Text der schon im Feld steht (hier also 'TestWert123') nochmal eingebe und zum nächsten Datansatz wechsele dann kommt folgende Exception:

    'Datensatz kann nicht gesperrt werden, da der Datensatz von einem anderen Benutzer geändert wurde'

    Dies passiert wie gesagt nur dann, wenn man denselben Wert nochmal eingibt, gibt man was anderes ein, funktioniert es ohne Probleme.
    Dies passiert auch, wenn man das Ganze in einem TDBEdit Feld macht.

    Hat jemand eine Lösung dafür?

    Für jede Hilfe bin ich dankbar!

  • #2
    Hallo Timon,

    Es klingt so, als ob Dein Feld 'TestWert123' der Primärschlüssel ist. Nun hast Du also im ersten DS den Primärschlüssel geändert, es wird automatisch bei DS-Wechsel ein Post durchgeführt, aber kein Refresh auf die Datenmenge. Somit ist die "alte" DS-Version (mit dem Primärschlüssel 'TestWert123') des ersten Datensatzes aus Datenbanksicht noch in Bearbeitung - also gesperrt.

    Gruß, Heik

    Comment


    • #3
      Hallo Heike,

      Danke für die Antwort, aber das Feld wo ich TestWert123 eingegeben habe ist NICHT der Primärschlüssel und auch nicht Teil davon.
      Dies passiert auch nur, wenn ich die Zwischenspeicherung deaktiviert habe (CashedUpdate auf false belassen)
      Außerdem wenn es der Primärschlüssel wäre heißt das dann dass ich das Feld nie wieder ändern kann? Oder wie kann ich dann ein Feld das Teil des Primärschlüssels ist entsperren, damit ich es mal ändern kann?

      Hast Du noch ne Idee?

      Vielen Dank

      Comment


      • #4
        Hallo Timon,

        ich habe zwar keine Ahnung von MySQL aber ich denke mal, dass es sicherlich damit zu tun hat, dass der DS, der ursprünglich das 'TestWert123' enthalten hat, aus Sicht der DB noch gesperrt ist. Was passiert denn, wenn Du bei der TTable-Komponente im Ereignis AfterPost ein TTable.Refresh durchführst? Dabei wird ja der aktuelle Stand der Tabelle neu aus der DB geladen. Da dürfte nach meinem Verständnis Dein Fehler nicht mehr auftauchen.

        Die Tabelle ist ja während der gesamten Bearbeitung in Deinem Grid geöffnet. Deshalb sind sicherlich auch die Datensätze, die geändert wurden (und anscheinend deren Inhalt) so lange gesperrt, bis die Änderungen über das Schließen der Tabelle (durch Close oder Refresh) von Deiner DB akzeptiert werden...

        Hoffe, dies hilft weiter.

        Gruß, Heik

        Comment


        • #5
          Hallo Heike,

          nett daß Du dich so bemühst. Also, wenn die Zwischenspeicherung deaktiviert ist (CashedUpdate von TTable auf false (Standard-Einstellung)), dann funktioneren die Events OnBefore... bzw. OnAfter... nicht!

          Der Fehler tritt ja schon vor oder während dem 'Post' auf.
          Wenn es irgendwas damit zu tun hätte was Du sagst (Sperrung des DS), dann müßte das Problem ja auch auftauchen, wenn ich einen anderen Wert als 'TestWert123' eingebe. Aber der Fehler tritt ja nur auf, wenn man DENSELBEN Wert nochmal eingibt!
          D.H. das DBGrid arbeitet nur korrekt, wenn man nicht wieder den gleichen Wert eingibt.

          Das Problem tritt auch auf, wenn ich denselben Wert per Programmierung einegebe:

          TTable1->Edit();<br>
          TTable1->FieldValues["Feld1"] = "TestWert123";<br>
          TTable1->Post();<br>

          So funktionierts:

          TTable1->Edit();<br>
          TTable1->FieldValues["Feld1"] = "TestWert234"; // <-- Hier Wert geändert<br>
          TTable1->Post();<br>
          <br>
          Also es ist immer das Gleiche, nur wenn ich den Wert ändere funktioniert es, irgendwie komisch, oder?
          &#10

          Comment


          • #6
            Hallo Timon,

            habe gerade mal versucht, Dein Beispiel nachzuspielen - also TDatasource, TTable, TDBGrid, BDE-Zugriff - allerdings habe ich auf eine Interbase-Tabelle (aus Delphi heraus) zugegriffen und habe diesen Fehler nicht bekommen. Weder beim Primary Key noch bei einem normalen Feld.<br>
            Das einzige, was mir noch dazu einfällt: Ist Dein "feld1" auch nicht Bestandteil einer referentiellen Integrität?

            Fall das auch nicht hilft, muss hier wohl jemand ran, der sich mit MySQL etc. auskennt...

            Viel Erfolg, <br>
            Gruß, Heik

            Comment


            • #7
              Hallo,

              was passiert, wenn die Eigenschaft <b>UpdateMode</b> auf den Wert <b>upWhereKeyOnly</b> gesetzt wird? Wenn dann immer noch das Problem relevant ist, wie sieht die Struktur der betroffenen Tabelle aus

              Comment

              Working...
              X