Announcement

Collapse
No announcement yet.

Prog x erkennt Insert/Delete nicht von Prog y

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

  • Prog x erkennt Insert/Delete nicht von Prog y

    Ich habe ein (hoffe wohl) kleines Problem mit Delphi6 und Interbase.

    Ich habe 2 Programme die auf die selbe TIBDataSet zugreifen.
    Ändere ich in Programm A etwas, merk Programm B dies auch und zeigt die Änderung an.
    Nun zu meinem Problem:
    Füge ich einen neuen Datensatz ein, oder lösche ich einen Datensatz in Programm A, dann merkt Programm B dies nicht. Der eingefügte Datensatz wird nicht angezeigt, dafür allerdings immer noch der gelöschte!

    Ich könnte nun hingehen und die komplette Tabelle neu vom IBServer laden.
    Allerdings dauert dieses Update über unser 100MBit Netz bei ca 10.000 Datensätze (Die auch nacher dort enthalten sind bzw weit mehr) über 15 Sekunden. Kann ich wohl keinem antun.
    Die IBTransaction steht auf "Commited lesen".

    Ich hoffe das mir einer weiterhelfen kann, da ich momentan vor einer Wand stehe und irgendwie nicht drumherum komme.
    Wir sind dabei unsere Programm was auf Paradoxtabellen zugreift komplett umzuschreiben, hängen aber an genau diesem Problem.

    MFG Sven Janssen

  • #2
    Bins nochmal!
    <p>
    Mir ist nun etwas aufgefallen.
    Wenn ich einen neuen Datensatz im Programm A einfüge, und diesen danach in Programm B einfügen das mein Programm merkt das der Datensatz schon vorhanden ist.
    Code:
    <PRE>

    function checknummer(feld,nummer,datei:string;ibsql:TIBSQL) :BOOLEAN;overload;
    begin
    with ibsql do
    begin
    close;
    sql.clear;
    sql.add('select '+feld+' from '+datei+' where '+feld+' = :filnr;');
    params[0].AsString := Nummer;
    ExecQuery;
    end;
    if ibsql.RecordCount = 0 then result := false
    else result := true;
    ibsql.Close;
    end;
    </PRE>
    bekomme ich so etwas nicht auch für das navigieren geschrieben?!
    Also Quasi mir eine Indexliste (nur Schlüssel) aufbau vom Server, darin meine Position bestimme und somit den nächsten oder vorherigen Datensatz ermitteln kann.
    Fragt sich wie die Performance übers Netz ist?!
    Momentan navigiere ich mit den Befehlen
    TIBDataset.first,next etc.
    Wollte mir beim Umschreiben möglichst wenig Arbeit machen, da unsere Software nicht gerade klein ist.
    <p>
    Sorry, aber ich sehe den Wald vor lauter Bäumen nicht :-/
    <p>
    Gruß Sve

    Comment


    • #3
      Hallo,

      &gt;Der eingefügte Datensatz wird nicht angezeigt, dafür allerdings immer noch der gelöschte!

      das muss auch so sein! Der SQL-Standard schreibt vor, dass sich eine SQL-Datenbank in ihrer aktuellen Transaktion so verhalten muss, als ob der Anwender der einzige Benutzer dieser Datenbank ist. Eine SQL-Datenbank arbeitet mengenorientiert, wobei der Client (das eigene Programm) nur eine <b>Kopie</b> der Daten in Form der Ergebnismenge seiner SELECT-Abfrage erhält. Die Frage, welche Daten in dieser Kopie zu sehen sind, wird von der eigenen Transaktion beantwortet.

      &gt;Ich könnte nun hingehen und die komplette Tabelle neu vom IBServer laden.

      Der SQL-Standard sieht vor, dass der Client nur dann neue Daten von der SQL-Datenbank erhält, wenn er im Kontext einer neuen Transaktion (ich unterstelle dabei einfach Snapshot alias REPEATABLE READ als Transaction Isolation Level) seine SELECT-Abfrage neu ausführt.

      &gt;Die IBTransaction steht auf "Commited lesen".

      In diesem Fall muss nicht zwingend eine neue Transaktion gestartet werden (obwohl es sinnvoll wäre), aber um das erneute Ausführen der SELECT-Abfrage kommt man nicht herum.

      &gt;Allerdings dauert dieses Update .. 10.000 Datensätze ... über 15 Sekunden.

      Eine Client/Server-Anwendung sollte nur die Datensätze auf einmal vom SQL Server abholen (geeignete WHERE-Einschränkung der SELECT-Abfrage), die momentan für die Bearbeitung notwendig sind. Der Idealfall geht von <b>einem einzigen Datensatz</b> aus. Es kann mir niemand plausibel begründen, welcher Anwender in der Benutzeroberfläche gleichzeitig mit 10 000 Datensätzen umgehen kann! Das von Excel, dBASE, Clipper oder Paradox gewohnte "Browsen" durch die Datensätze über ein TDBGrid ist bei einer SQL-Datenbank die schlechteste aller Alternativen.

      &gt;..bekomme ich so etwas nicht auch für das navigieren geschrieben?!

      In diesem Fall wird die SELECT-Abfrage <b>nach</b> dem Hinzufügen des Datensatzes <b>neu</b> ausgeführt, so dass das eigene Programm dank "Commited lesen" die neuen Datensätze sehen kann.

      &gt;Sorry, aber ich sehe den Wald vor lauter Bäumen nicht :-/

      Das ist völlig normal - denn das Konzept einer alten Paradox-Anwendung muß völlig umgeschrieben werden. Paradox ist eine datensatzorientierte Datenbank, während der InterBase als SQL-Datenbank mengenorientiert arbeitet und danach ganz andere Spielregeln voraussetzt.

      Das folgende Buch geht auf diese prinzipiellen Unterschiede im Detail ein: <i>http://www.entwickler.com/itr/buecher/show.php3?id=14&nodeid=92&ps_lo=30</i&gt

      Comment


      • #4
        Hallo

        Versuche in Deinem Programm A beim Einfügen oder Löschen eines Satzes eine API-Message auslösen, die eindeutige Information über den betreffenden Satz enthält. Diese Message fängst Du im Programm B ab und löschst oder fügst den Satz manuel ein

        Comment

        Working...
        X