Announcement

Collapse
No announcement yet.

SQL-Statement über zwei Datenbanken

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

  • SQL-Statement über zwei Datenbanken

    Hallo Leute,
    weiß jemand, wie ich ein insert-statement über 2 Tabellen aus 2 verschiedenen
    GDB-Files hinbekommt? Sehr wichtig!

    Danke, Romy

  • #2
    Hallo,

    das gleichzeitige Zugreifen auf mehrere Datenbanken in einer SQL-Anweisung (SELECT, INSERT) wird nur von <b>LOCAL SQL</b> der BDE unterstützt. Beim Kopieren von Datensätzen aus einer InterBase-Datenbank in eine andere helfen die neuen IBX-Klassen weiter. Das folgende Beispiel demonstriert einen Einsatzfall:
    <pre>
    procedure TForm1.Button1Click(Sender: TObject);
    var
    Filename : String;
    RawOutput : TIBOutputRawFile;
    RawInput : TIBInputRawFile;
    begin
    IBSQL1.Sql.Text := 'Select firstname, lastname from people';
    IBSQL2.Sql.Text := 'Insert into people (firstname, lastname) values (:first, :last)';
    Filename := 'DataFile.RAW';
    RawOutput:= TIBOutputRawFile.Create;
    try
    RawOutput.FileName := FileName;
    IBSQL1.BatchOutput(RawOutput);
    finally
    RawOutput.Free;
    end;
    RawInput := TIBInputRawFile.Create;
    try
    RawInput.FileName := FileName;
    IBSQL2.BatchInput(RawInput);
    finally
    RawInput.Free;
    end;
    IBSQL2.Transaction.Commit;
    end;
    </pre>
    Jede TIBSQL-Instanz wird mit der entsprechenden InterBase-Datenbank verbunden.

    Wenn es nur darum geht, wie beim INSERT Daten in 2 Datenbanken eingetragen werden, bleibt wohl nichts anderes übrig, als 2 getrennte INSERT-Anweisungen abzusetzen.
    &#10

    Comment


    • #3
      Hallo Andreas,

      vielen Dank für Deine Hilfe... Soweit hat erst mal alles geklappt. Nur 2 kleine Fehler sind noch zu beheben.
      1. Beide Datenbanken sind mit dem selben Script erstellt. Alle Tabellen haben demzufolge die selbe Struktur.
      Beim Einfügen mit der oberen Methode werden jedoch bei manchen VARCHAR-Feldern 2 Buchstaben weggeschnitten. Woran kann das liegen?
      2. Ich möchte dieses Tool zum Abgleich der beiden Datenbanken nutzen. Die eine Datenbank enthält nur einen Auszug aus der Original-Datenbank. In Deinem Buch Client/Server Entwicklung (S. 485) beschreibst Du eine Stored Proc, mit der man entweder Einfügen oder Updaten kann... Kann ich das auch irgendwie bei der Methode oben einsetzen ohne Stored Proc?
      Für Vorschläge wäre ich sehr dankbar!
      Rom

      Comment


      • #4
        Hallo,

        das mit dem "Wegschneiden" von 2 Zeichen habe ich vor einigen Wochen hier im Forum schon einmal gehört (und wollte es damals nicht glauben). Lässt sich dieser Effekt sicher reproduzieren? Wenn ja, wie sieht so ein minimales Bespiel aus? Ich unterstelle einmal, das es sich hier um eine der zahlreichen Macken in IBX handelt (der InterBase speichert bei einem VARCHAR in den ersten beiden Stellen die Länge der Zeichenkette, die allerdings vor dem Zurückliefern an den Client "abgeschnitten" werden. Anscheinend geht IBX in diesen Fällen davon aus, das nochmals machen zu müssen).

        Eine Datenreplikation (die automatisch zwischen INSERT/UPDATE/DELETE wechselt) wird nur mit zusätzlichen Erweiterungen funktionieren. Jede Datensatzänderung muss im Log mit dem Status (INSERT oder UPDATE oder DELETE) gekennzeichnet werden. Wenn dann im ersten Schritt nur die Datensätze mit dem Status INSERT kopiert werden, können im 2. Lauf nur die Datensätze mit dem Status UPDATE bearbeitet werden (wenn vorher alle INSERTS abgearbeitet werden, ist ein UPDATE in jedem Fall erfolgreich, da der betreffende Datensatz in jedem Fall vorhanden ist). Somit ist für jeden Schritt eine eigene Implementierung notwendig

        Comment


        • #5
          Hallo Andreas,

          das mit dem Abschneiden tritt jedes Mal auf! Nun fehlen immer die letzten 2 Zeichen! Das ist vielleicht ein Mist!

          Das mit dem Log-File schreiben, ist ziemlich aufwendig, da muß ich mir wohl noch was anderes ausdenken. Gibt es eigentlich ein Beispiel-Projekt zum Abgleichen zweier Datenbanken?

          Rom

          Comment


          • #6
            Hallo Andreas,

            ich habe meine geänderten Datensätze gekennzeichnet und nun das gleiche wie bei Insert nur halt mit update versucht. Folgendes Problem tritt jedoch dabei auf:
            quelle : "select name,vorname,manr from mitarb"
            ziel: "update mitarb set name=:name,vorname=:vorname,manr=:manr where manr=:manr"
            Es passiert aber überhaupt nichts! Wenn ich anstelle "where manr=:manr" " where manr=1111" einsetze, funktioniert das ganze!
            Wieso wertet er die Nummer nicht von alleine aus??? Irgend welche Vorschläge?

            Rom

            Comment


            • #7
              Hallo,

              das habe ich zwar noch nicht probiert, aber das hört sich so an, als ob IBX an dieser Stelle ein Problem mit dem "doppelten" Parameter <i>:manr</i> hat (dieser Parameter wird sowohl als UPDATE-Wert als auch als WHERE-Wert verwendet, wobei SELECT aber nur eine Spalte mit diesem Namen zurückliefert). Um diese Vermutung nachzuprüfen, würde ich folgendes versuchen:

              <b>SELECT</b> (manr über Spaltenalias doppelt auflisten lassen):
              <pre>
              select name,vorname,manr, manr as manr_where from mitarb
              </pre>
              <b>Update</b>:
              <pre>
              update mitarb
              set name=:name,vorname=:vorname,manr=:manr
              where manr=:manr_where
              </pre>
              P.S: Wenn dieser Umweg funktioniert, bestätige dies bitte - damit ich mein Archiv "auffrischen" kann ;-

              Comment


              • #8
                Beispiele

                www.interbase.dthomas.co.uk

                fertige Replikations Software

                www.sdctec.ne

                Comment

                Working...
                X