SQLite-DB im Speicher in Datei kopieren

  • Hallo liebe Forumsmitglieder,
    ich suche eine elegante Lösung für folgendes Problem:
    Mit $dbMem = _SQLite_Open() habe ich mir eine Datenbank im Speicher angelegt. Diese fülle ich nun mit Daten und werte sie aus. Manchmal möchte ich diese Speicherdatenbank in eine Datei sichern. Dafür lese ich sie zeilenweise aus und schreibe sie in die "reale" Datenbank. Dieser Prozess dauert bei einigen tausend Datensätzen jedoch ziemlich lange.
    Gibt es eine Möglichkeit, die Speicherdaten "in einem Rutsch" auf die Festplatte zu kopieren?
    Danke schon einmal
    bastelfritze

    Einmal editiert, zuletzt von bastelfritze (27. Juli 2012 um 13:57)

  • Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <SQLite.au3>
    #include <SQLite.dll.au3>
    Global $aResult, $iRows, $iColumns
    $Timer2 = TimerInit()
    _SQLite_Startup()
    $Memdatabase = _SQLite_Open()
    $filedb = _SQLite_Open(@ScriptDir&"\test.db")
    $Createtable = "CREATE TABLE tbl_Demo (ID INTEGER PRIMARY KEY AUTOINCREMENT, Test1 Varchar(150), Test2 Varchar(150), Test3 Varchar(150), Test4 Varchar(150),Test5 Varchar(150), Test6 Varchar(150), Test7 Varchar(150));"
    _SQLite_Exec($Memdatabase, $Createtable)
    _SQLite_Exec($filedb, $Createtable)
    $aSql = 'Begin Transaction ;' & @CRLF
    For $i = 1 To 10000
    $aSql &= "INSERT INTO tbl_Demo (Test1,Test2,Test3,Test4,Test5,Test6,Test7) VALUES ('" & Random(1,10000, 1) & "', '" & Random(1,100000, 1) & "', '" & Random(1,100000, 1) & "', '" & Random(1,100000, 1) & "', '" & Random(1,100000, 1) & "', '" & Random(1,100000, 1) & "', '" & Random(1,100000, 1) & "');" & @CRLF
    Next
    $aSql &= 'Commit Transaction ;' & @CRLF
    _SQLite_Exec($Memdatabase, $aSql)
    _SQLite_GetTable2d($Memdatabase, "SELECT * FROM tbl_Demo", $aResult, $iRows, $iColumns)
    _ArrayDisplay($aResult)
    $Timer = TimerInit()
    $aSql = 'Begin Transaction ;' & @CRLF
    For $i = 1 To UBound($aResult) -1
    $aSql &= "INSERT INTO tbl_Demo (Test1,Test2,Test3,Test4,Test5,Test6,Test7) VALUES ('" & $aResult[$i][0] & "', '" & $aResult[$i][1] & "', '" & $aResult[$i][2] & "', '" & $aResult[$i][3] & "', '" & $aResult[$i][4] & "', '" & $aResult[$i][5] & "', '" & $aResult[$i][6] & "');" & @CRLF
    Next
    $aSql &= 'Commit Transaction ;' & @CRLF
    _SQLite_Exec($filedb, $aSql)
    $Diff = TimerDiff($Timer)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $Diff = ' & $Diff & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    _SQLite_GetTable2d($filedb, "SELECT * FROM tbl_Demo", $aResult, $iRows, $iColumns)
    _ArrayDisplay($aResult)

    [/autoit] [autoit][/autoit] [autoit]

    _SQLite_Close($Memdatabase)
    _SQLite_Close($filedb)
    _SQLite_Shutdown()
    $Diff2 = TimerDiff($Timer2)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $Diff2 = ' & $Diff2 & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

    [/autoit]

    10000 Datensätze mit 8 Spalten schreiben, auslesen und dann in ne Datei schreiben dauert ca 5.5 sec bei mir

  • Die Idee mit dem Zwischenspeicher per _SQLite_GetTable2d ist hervorragend. Die Bearbeitungszeit wird wirklich auf wenige Sekunden verkürzt. Zuvor habe ich alternierend gelesen und geschrieben, das hat eine kleine Ewigkeit gedauert. Dank an TheLuBu für den Vorschlag und ein schönes Wochenende schon einmal.
    Viele Grüße - bastelfritze