German Frage zu SQL

Joe73

Active 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
 

Joe73

Active 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
 

JOTHA

Well-Known Member
Licensed User
Longtime User
Hallo Joe73,
das müsste so funktionieren:
B4X:
        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
 

rboeck

Well-Known Member
Licensed User
Longtime 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
 

Joe73

Active 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
 

pucki

Active Member
Licensed User
Longtime 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:

Alexander Stolte

Expert
Licensed User
Longtime User
mit den "Transaktionen" beschäftigen
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.
 

pucki

Active Member
Licensed User
Longtime 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.

Genau deshalb hab ich ihn ja darauf aufmerksam gemacht.

Gruß

Pucki
 

Joe73

Active 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
 

Joe73

Active 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
 

pucki

Active Member
Licensed User
Longtime 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
 

MaFu

Well-Known Member
Licensed User
Longtime 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
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.
 

Joe73

Active 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
 
Top