German Frage zu SQL

Discussion in 'German Forum' started by Joe73, Mar 28, 2018.

  1. Joe73

    Joe73 Member Licensed User

    Hallo,
    seit einiger Zeit versuche ich folgendes Problem zu lösen:

    Ich habe eine Datenbank1 mit Tabelle Werte_A und eine Datenbank2 mit Tabelle Werte_B

    Nun möchte ich Daten aus Datenbank2 Werte_B in die Datenbank1 Werte_A einfügen.

    Ich hatte mir das wie folgt vorgestellt:

    Dim SQL1, SQL2 As SQL

    SQL1.Initialize (Pfad,"Datenbank1",true)
    SQL2.Initialize (Pfad,"Datenbank2",true)


    SQL1.ExecNonQuery ("INSERT INTO Werte_A (Spalte_1) SELECT Spalte_3 FROM Werte_B")

    habe es getestet mit der Fehlermeldung "no such table: Werte_B..."


    Hat da vielleicht jemand einen Tip oder muss ich das mittels Cursor und einer Schleife machen?
    Wollte es eigentlich in "einem Zuge" übertragen

    mfg Jürgen
     
  2. MaFu

    MaFu Well-Known Member Licensed User

    Das geht so nicht, der SQL Befehl ist ja immer auf eine Datenbank bezogen. Da Du zwei Datenbanken hast musst Du über Cursor und Schleife gehen.
     
    Joe73 likes this.
  3. Joe73

    Joe73 Member Licensed User

    Hallo MaFu,

    das hatte ich schon fast befürchtet.
    Vielen Dank für die sehr schnelle Antwort auf meine Frage...

    Werde ich wohl mit Cursor und Schleife arbeiten müssen....

    mfg Jürgen
     
  4. JOTHA

    JOTHA Well-Known Member Licensed User

    Hallo Joe73,
    das müsste so funktionieren:
    Code:
    Cursor = SQL1.ExecQuery ("SELECT Spalte_1 FROM Werte_A")
            
    For i = 0 To Cursor.RowCount - 1
                
    Cursor.Position = i

                SQL2.ExecNonQuery (
    "INSERT INTO Werte_B VALUES('Spalte_3')")
          
            
    Next
            
    Cursor.Close
     
    Joe73 likes this.
  5. rboeck

    rboeck Well-Known Member Licensed User

    Musst Du nicht!

    Du öffnest die zweite Datenbank mit:
    SQL1.ExecNonQuery("ATTACH DATABASE '" & File.Combine(DatenDir,"Database2.db'") & " as db2")

    und sie verhält sich, als wären die Tabellen Teil der ersten Datenbank. Ich habe selbst einen Insert Befehl von Db2 nach Db1 am Laufen.

    Ich beziehe mich auf B4J, hoffe aber, dass es bei B4A gleich abläuft.

    Reinhard
     
    klaus, DonManfred, MaFu and 2 others like this.
  6. Joe73

    Joe73 Member Licensed User

    Hallo,

    prima Reinhard, vom Prinzip her funktioniert es...
    Ihr seid Spitze....!
    Ich muss nun allerdings noch einige Anpassungen vornehmen, auf jeden Fall wurden Daten aus der anderen
    Datenbank übernommen. Das habe ich gerade getestet.

    Leider findet man wenig über "ATTACH DATABASE".

    Nun kann ich mir überlegen welchen Weg ich gehe, diesen oder den mit Cursor und Schleife...

    mfg Jürgen
     
  7. pucki

    pucki Active Member Licensed User

    Bei so Sachen solltest du auch gleich dich mit den "Transaktionen" beschäftigen. Das beschleunigt die Sache um mindestens Faktor 50 und mehr. Besonders wenn du Sql-Befehle per Schleife (for/next etc.) machst.

    Du kannst deine Operation testen, in den du die 2 Befehle (beginn und end) einfach auskommentierst. Wichtig ist nur eins. Du darfst NIEMALS den End-Befehl vergessen. Wenn du ihn vergisst, wird die Datenbank NICHT geändert und alles in der Schleife ist vergessen.

    Eins meiner VB-Prg. auf den PC legt so ca. 50.000 Datensätze neu in einer SQL-Datenbank in unter 3 Sekunden an. Die Schiebe ich dann auf mein Tablett wo sie mit B4A weiter verarbeitet wird.


    Gruß

    Pucki
     
    Last edited: Mar 29, 2018
  8. Alexander Stolte

    Alexander Stolte Well-Known Member Licensed User

    Hier nachzulesen, ist zwar auf Englisch, aber es gibt ja Möglichkeiten.

    Ich habe eine bessere Leistung meiner App festgestellt, nachdem ich auf Transaktionen umgestellt habe, weil die Inserts schneller durchlaufen.
     
  9. pucki

    pucki Active Member Licensed User

    Genau deshalb hab ich ihn ja darauf aufmerksam gemacht.

    Gruß

    Pucki
     
  10. Joe73

    Joe73 Member Licensed User

    Hallo,
    Vielen Dank für die weiteren Ratschläge bzw. Tipps.
    Ich werde mir das auf jeden Fall mal ansehen.
    Für Übersetzungen nehme ich seit kurzem den DeepL Translator.
    Er liefert sehr gute Ergebnisse, oftmals besser als der von Google u.a.

    Nun liegt es nur noch an der Umwandlung des Datum/Zeit Format zu welcher Variante
    ich mich entschließe.
    Vielleicht hat hierfür auch jemand einen Tipp ob man bei der Variante mit:
    INSERT INTO ..... SELECT ....
    auch das Datum/Zeit Format mit ändern kann.
    Eine Möglichkeit wäre vielleicht auch zuerst das Format der gesamten 'Quell'-Tabelle zu ändern.
    Ich habe diese ja zuvor kopiert und nach der Übertragung kann sie eigentlich gelöscht werden.

    mfg Jürgen
     
  11. Joe73

    Joe73 Member Licensed User

    ich glaube ich habs, mit
    SELECT (strftime ("%s",date)* 1000) FROM ...
    komme ich auf die Ticks bzw. andere Formate...

    wieder was gelernt

    mfg Jürgen
     
  12. pucki

    pucki Active Member Licensed User

    Naja, ich bin ein Fan des Datums falschrum als Text. Heute ist der 2018-03-30. Das hat 2 Vorteile. Ich kann perfekt sortierten und ich habe keine Diskussionen mit Datumsformat-Regeln.

    Gruß

    Pucki
     
  13. MaFu

    MaFu Well-Known Member Licensed User

    Naja, normalerweise speichert man das Datum in einer Datenbank als Zahl. Dann gibt es auch keine Probleme mit dem sortieren und Du kannst ohne Verrenkungen bei der Ausgabe das Datum formatieren wie Du lustig bist.
     
  14. Joe73

    Joe73 Member Licensed User

    Hallo,
    Vielen Dank auch an Euch für Eure Hinweise.
    Ich speichere das Datum/Zeit als Zahl, deshalb meine Umrechnung in Millisekunden und zusätzlich als String.
    So kann ich bei Bedarf auf beides zugreifen.

    Übrigens. falls jemand die Methode mittels ATTACH DATABASE nutzen möchte,
    nicht vergessen die hinzugefügte Datenbank mittels DETACH DATABASE wieder zu lösen.
    Vor allem wenn man den Befehl in einer SUB verwendet welche später nochmals aufgerufen wird.

    Frohe Ostern und Grüße von Jürgen
     
Loading...