SQLite Datenbank aktualisieren mit Tabellendaten aus SQL-Server

  • Hallo Zusammen,

    meine kleine AutoIt-Anwendung (*.exe) enthält eine SQLite-DB, die beim Öffnen der Anwendung in den gleichen Ordner wie die Anwendung extrahiert wird.
    Dann werden je nach Userwunsch Daten per SELECT-Befehl aus dieser Datenbank ausgelesen und in einem Grid angezeigt.

    Die Anwendung möchte ich jetzt erweitern und Daten einer großen (ca. 350.000 Records) Tabelle meines SQL-Servers in die nach Öffnen des Tools extrahierte SQLite-DB importieren?

    Bin für jeden Ansatz dankbar :P

    Danke und Grüsse aus Köln, mausk

  • Und was genau willst du von uns nun hören?

    Meine Fragen zu deinem vorhaben:

    1. Wozu eine lokale sqlite DB Kopie, wenn du die Daten bereits auf einem "richtigen" Datenbankserver hast und deine Software diese auch live von dort beziehen könnte?
    2. Wenn du das schon machen willst, dann mach es doch. Wo genau ist deine Frage oder dein Problem? Das Vorgehen sollte doch kein Problem darstellen... SQL-Server Verbindung aufbauen, Daten lesen und Daten in die lokale DB schreiben.
    3. Wenn du keine Ahnung hast wie du überhaupt eine Verbindung zur externen DB herstellst wäre es vielleicht nicht verkehrt zu erwähnen von welchem DB Server du sprichst (MS-SQL, MySQL, PostgreSQL oder vielleicht auch nur eine Access DB oder sonst irgendwas...). Je nach DB-Server gibt es die unterschiedlichsten Autoit UDFs.

  • Hallo misterspeed,

    danke für Deine Antwort.

    Nun zu Deinen Fragen:

    1. Wozu eine lokale sqlite DB Kopie, wenn du die Daten bereits auf einem "richtigen" Datenbankserver hast und deine Software diese auch live von dort beziehen könnte?
    Weil div.User das Tool meistens offline nutzen und so die Daten nicht direkt vom MS-SQL-SERVER bezogen werden können.
    Sowie der User dann im unseren System eingelockt ist, soll die lokale SQLite-DB (nach vorheriger Rückfrage) mit den Daten vom MS-SQL-SERVER aktualisiert werden.

    2. Wenn du das schon machen willst, dann mach es doch. Wo genau ist deine Frage oder dein Problem? Das Vorgehen sollte doch kein Problem darstellen...
    SQL-Server Verbindung aufbauen, Daten lesen und Daten in die lokale DB schreiben.
    Der Verbindungsaufbau zur StoredProcedure im MS-SQL-SERVER funktioniert per ADO und ich habe die Daten dann in einem Recordset drin.
    Mein Problem ist nun der performante Upload vom Recordset in die SQLite-DB.

    Vielen Dank und Grüsse, Mike

    2 Mal editiert, zuletzt von mausk (17. Oktober 2016 um 11:53)

  • Dir geht es also eigentlich nur um Performance Optimierung? Dann würde ich dir empfehlen deine bisherigen Versuche hier zu posten und ggf. auch erste Analysen durchzuführen was genau wieviel bzw. am meisten Zeit verschlingt.

    Am lesen der Daten wirst du nicht viel optimieren können. Wenn du 350000 Einzelwerte zurückbekommst wird das immer einiges an Zeit benötigen. Tricksereien sind natürlich auch hier möglich. Im unten verlinkten Thread nutze ich beim Auslesen aus der DB die DB-Funktionen zum Verketten von Stings um letztlich nur einen einzigen Riesenstring aus der DB zurück zu bekommen. Dieser String muss dann zwar wieder von mir gesplittet werden, letztlich spart man je nach Datenmenge aber dennoch Zeit (insbesondere bei einer "entferneten" DB sollte das sehr viel bringen, da hier die meiste Zeit für den Transfer der vielen Einzelpakete drauf geht).

    Beim Schreiben der Daten kann man aber durchaus einiges optimieren. Die simpelste Variante ist der Aufbau eines großen "Write"-Statements anstatt für jeden Recordset ein eigenes "Write"-Statement abzuschicken. Dadurch hast du nur einen einzigen Schreibvorgang und nicht hunderttausende.

    Performance von SQLite optimieren?

  • Ein weiteres Optimierungspotential besteht noch wenn deine Daten entsprechend strukturiert sind. Anstatt jedesmal die volle DB auszulesen könntest du dann inkrementelle Updates der lokalen DB machen. Sprich lediglich die Erstsynchronisierung verschlingt viel Zeit, alle Folgesynchronisiserungen werden kaum noch Zeit benötigen. Das erfordert aber zwingend einen Timestamp in den Tabelleneinträgen oder eine Log-Tabelle, welche jede Änderung zeitlich protokolliert.