Announcement

Collapse
No announcement yet.

TTable.Post bringt bei MySQL einen Fehler

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

  • TTable.Post bringt bei MySQL einen Fehler

    Hallo !<br>
    <br>
    Ich greife mit <b>Delphi 5</b> auf eine MySQL-Datenbank über ODBC zu und bekomme folgende Fehler-Meldung:<br>
    ..Exception er der Klasse EDBEngineError aufgetreten. Meldung 'Datensatz kann nicht gesperrt werden, da der Datensatz von einem anderen Benutzer geändert wurde.'....<br>
    <br>
    <b>Code:</b><br>
    Table := TTable.Create(self);<br>
    Table.DatabaseName := 'DBName';<br>
    Table.TableName := 'TabellenName';<br>
    Table.ReadOnly := false;<br>
    Table.Open;<br>
    Table.Locate('Nummer','47',SearchOptions);<br>
    Table.Edit;<br>
    .... <br>
    Table.FieldByName('Name').AsString := "TEXT";<br>
    ....<br>
    Table.Post;<br>
    <br>
    bei Post bekommen ich diese Exception ! Was mach ich falsch ? Bei <b>Table.Insert</b> funktioniert es !<br>
    <br>
    Andreas

  • #2
    Hallo,

    hat die Tabelle einen Primärschüssel und wenn ja, welcher Datentyp wird dort verwendet?

    Die BDE kann den Datensatz nur dann über SQL aktualisieren, wenn in der UPDATE-Anweisung eine WHERE-Einschränkung verwendet wird und dort alle vorher eingelesenen alten Datensatzwerte aufgeführt werden. Nur dann, wenn diese WHERE-Einschränkung zu einem Datensatz passt, kann dieser aktualisiert werden. Bei bestimmten Datentypen gibt es jedoch zwangsläufig Probleme (Rundungsfehler, BLObs), so dass die Eigenschaft <b>UpdateMode</b> ggf. nur auf den Primärschlüssel (<b>upWhereKeyOnly</b>) gesetzt werden muss

    Comment


    • #3
      Ich benutzte einen Primärschüssel !( Integer)<br>
      <br>
      Ich denke, da ich mit locate den Datensatz suche und dann in den Edit-Mode gehe merkt er sich den Key !<br>
      <br>
      ich versuche es mal ....

      Comment


      • #4
        Hallo,

        das schon, aber in der Voreinstellung werden beim Update <b>alle</b> Spalten dieser Tabelle von der VCL als WHERE-Eingrenzung verwendet. Daher reicht es aus, wenn nur eine einzige Spalte einen "problematischen" Datentyp verwendet. Wenn ein INTEGER als Primärschlüssel zur Verfügung steht, sollte sich das Problem mit <b>upWhereKeyOnly</b> jedoch in jedem Fall lösen lassen

        Comment


        • #5
          ich habe vor <i>Table.Open;</i> ein <i>Table.UpdateMode := upWhereKeyOnly;</i> eingebaut, aber es kommt noch die gleiche Exception !<br&gt

          Comment


          • #6
            Hallo,

            gibt es bei MySQL ein Gegenstück zum <B>SQL-Monitor</b> (InterBase) oder <b>Profiler</b> (MS SQL Server), mit dessen Hilfe man sich die exakte SQL-Anweisung anschauen kann, die von der VCL generiert und zum SQL-Server geschickt wird? Wenn ja, wie sieht diese Anweisung aus, wenn Delphi diese Exception auslöst

            Comment


            • #7
              Das Tool für MySQL kenne ich gar nicht !<br>
              Ich habe mir das ganze mal mit dem SQL-Monitor angeschaut. Und habe folgendes entdeckt:<br>
              <i>SQL Execute: MySQL - UPDATE Verein SET Telefon=?,FAX=?,Name=? WHERE EDV_Nummer=?</i><br>

              Das verstehe ich nun auch wieder nicht

              Comment


              • #8
                Hallo,

                das sieht ganz gesund aus. Zuerst wird eine SQL-Anweisung ohne Parameterwerte zum Server geschickt, wobei das Fragezeichen als Platzhalter dient. Legt der SQL-Server für diese Kommando kein Veto ein, so überträgt der Client in einem zweiten Aufruf die Parameterwerte. Im SQL-Monitor bzw. im Profiler wird dies sichtbar.

                Was passiert, wenn diese UPDATE-Anweisung über TQuery abgeschickt wird, kann dann der Datensatz aktualisiert werden? Wenn ja, sieht das so aus, als ob das Problem erst dann auftaucht, wenn die VCL die Daten zur Kontrolle neu einlesen will

                Comment

                Working...
                X