Announcement

Collapse
No announcement yet.

Zeile löschen ??? - "Es sind keine Originaldaten vorhanden,..."

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

  • Zeile löschen ??? - "Es sind keine Originaldaten vorhanden,..."

    Hallo an alle!
    <br>Ich arbeite an einem Programm (C#), mit dem von einem Messgerät ausgelesene Messwerte in einer Interbase-Datenbank gespeichert werden. Gleichzeitig soll jeweils der letzte Wert in dieser Datenbank vom Anwender gelöscht werden können.
    <br>Das Aufnehmen der Messwerte funktioniert problemlos, doch (Achtung - es klingt jetzt wohl etwas kompliziert...) beim Löschen gibt es Probleme:<br>
    1. Fall: man klickt auf Löschen, der letzte Wert wird korrekt gelöscht. Man will den nächsten Wert löschen - und es wird folgende Exception abgefangen: "Es sind keine Originaldaten vorhanden, auf die zugegriffen werden kann."
    <br>2. Fall: man liest neue Messwerte aus (die auch korrekt in der Datenbank gespeichert werden!) und möchte dann den letzten Wert löschen - selber Fehler wie in Fall 1.
    <br>Die Messwerte werden allerdings in beiden Fällen im DataGrid entfernt, nur das Update in die Datenbank funktioniert nicht.
    <bn>Hier ein kurzer Quellcode-Ausschnitt:<br><br>
    BdpCommandBuilder cb = new BdpCommandBuilder(bdpDataAdapter1);<br>
    Table1.Rows[Table1.Rows.Count-1].Delete();<br>
    try<br>
    {<br>
    bdpDataAdapter1.Update(Table1);<br>
    }<br>
    catch (Exception ex)<br>
    {<br>
    MessageBox.Show(ex.Message, "Interbase-Fehler", MessageBoxButtons.OK ,MessageBoxIcon.Error);<br>
    }<br><br>
    Danke für die Hilfe,
    Thorsten Brink

  • #2
    Hallo,

    &gt;...BdpCommandBuilder....

    so etwas ist generell in die Kategorie "Teufelszeug" einzuordnen. Es ist zwar auf den ersten Blick für uns als Entwickler sehr bequem, die ganzen SQL-Anweisungen erst zur Laufzeit von dieser Klasse automatisch generieren zu lassen, aber dafür verliert man jede Kontrolle und was im Fall von BDP.NET noch viel wichtiger ist, jede Einflussmöglichkeit für eigene Korrekturen.

    BDP.NET hat zwei Seiten. Zwar stimmt generell die Aussage, dass eine Zugriffsklasse für alle unterstützten Datenbanken passt, aber dafür muss BDP.NET hinter den Kulissen Abstriche in Kauf nehmen, weil es bei bestimmten Datentypen zu Problemen kommt (sowohl beim InterBase 7.x als auch beim MS SQL Server, um nur zwei Beispiele zu nennen).

    &gt;..Es sind keine Originaldaten vorhanden, auf die zugegriffen werden kann..

    Diese Fehlermeldung bedeutet nur, dass die von BDP.NET intern vorgenommene Datentypumwandlung in diesem konkreten Fall zu einer Art "Rundungsfehler" geführt hat, so dass die automatisch generierten WHERE-Einschränkung in der Originaldatenbank keinen Treffer findet. Um das Problem zu lösen, müssen aus der DELETE-Anweisung alle diese problematischen Spalten aus der WHERE-Einschränkung entfernt werden (die Parameters-Kollektion von BdpCommand dabei nicht vergessen). Wenn man ganz auf Nummer Sicher gehen will, greift man bei der WHERE-Einschränkung für die DELETE-Anweisung nur auf den Primärschlüsselwert (der dann hoffentlich ein INTEGER ist) zurück.

    &gt;..Die Messwerte werden allerdings in beiden Fällen im DataGrid entfernt..

    Das ist auch kein Wunder, denn ADO.NET arbeitet ja nur mit den lokalen Daten im Arbeitsspeicher des Client-Rechners. Erst dann, wenn diese Änderung durch die SQL-Anweisung in der originalen Datenbank nachvollzogen werden soll, wird das Problem der "Rundungsfehler" relevant

    Comment


    • #3
      Hallo!

      Erstmal danke für den Rat. Leider bleibt der erhoffte Erfolg aus...

      Im DELETE bzw. UPDATE-SQL-Befehl wird nur der primäre Schlüssel ("ID", Typ Integer) verwendet. Dennoch wird beim Update der Datenbank nur einmal ein Wert gelöscht und danach kein Weiterer. Lösche ich jedoch mehrere Werte in einem Aufwasch, sprich, ich markiere mehrere Werte als "Delete", löscht er mehrere. Beim zweiten Löschvorgang (kling kompliziert, ich weiß..) wird dann in der Datenbank nichts mehr gelöscht.

      Die Fehlermeldung "Es sind keine Originaldaten..." bleibt nach Änderung der SQL-Befehle (siehe Rundungsfehler usw.) aus.

      Hat noch jemand Ideen? Sonst werde ich einfach den Weg ohne den BdpCommandBuilder testen und auf dem "althergebrachten Weg" die Verbindung selbst öffnen und alle Befehler selbst setzen.

      Danke und Gruß,

      Thorsten Brin

      Comment


      • #4
        Hallo,

        beim MS SQL Server hätte ich an dieser Stelle den <i>Profiler</i> angeworfen, um mir exakt alle SQL-Anweisungen und alle Parameter-Werte auflisten zu lassen, die bei der Datenbank ankommen.

        Bei BDP.NET fehlt zur Zeit eine derartige Option, so dass wir "blind" auf die Fehlersuche gehen müssen und direkt beim DataAdapter nachfragen. Konkret bedeutet dies, dass wird selbst die Ereignisse des Adapters auswerten müssen: <br>
        a) Das Ereignis <b>RowUpdating</b> wird unmittelbar vor dem Aufruf von Update ausgelöst und stellt Informationen über die auszuführende Aktion zur Verfügung<br>
        b) Immer dann, wenn die DataAdapter-Methode Update abgearbeitet wird, löst der DataAdapter für jeden zu bearbeitenden Datensatz des DataSets das Event <b>RowUpdated</b> au

        Comment

        Working...
        X