SQLITE Datenbank Problem

  • Hallöchen liebe Community,
    ich habe ein kleines Problem mit einer SQLite Datenbank
    Hier erstmal das Script

    Spoiler anzeigen
    [autoit]

    #include <SQLite.au3>
    #include <SQLite.dll.au3>
    _SQLite_Startup()
    _SQLite_Open(@ScriptDir & "\OBTBF.db")
    _SQLite_Exec(-1, "CREATE TABLE tbl_OBTBF(ID VARCHAR(20), Datum DATE, Uhrzeit VARCHAR(8), UNIQUE (ID,Datum,Uhrzeit));") ; Erzeugt Tabelle

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

    $File = FileSelectFolder("Ordner mit den OBTBF auswählen", "", 3)
    $array = _GetFilesFolder_Rekursiv($File, '*', 0)
    $aSql = 'Begin Transaction ;' & @CRLF
    For $i = 1 To $array[0]
    $tmpSplit = Stringsplit($array[$i], "\")
    $Split = Stringsplit($tmpSplit[$tmpSplit[0]], "_")
    $Datumsplit = Stringsplit($Split[2], "")
    $Datum = "20"&$Datumsplit[5]&$Datumsplit[6]&"-"&$Datumsplit[3]&$Datumsplit[4]&"-"&$Datumsplit[1]&$Datumsplit[2]
    $Uhrzeitsplit = Stringsplit($Split[3], "")
    $Uhrzeit = $Uhrzeitsplit[1]&$Uhrzeitsplit[2]&":"&$Uhrzeitsplit[3]&$Uhrzeitsplit[4]&":00"
    $aSql &= "INSERT INTO tbl_OBTBF (ID,Datum,Uhrzeit) VALUES ('" & $Split[1] & "','" & $Datum & "','" & $Uhrzeit & "');" & @CRLF
    Next
    $aSql &= 'Commit Transaction ;' & @CRLF
    _SQLite_Exec(-1, $aSql)
    _SQLite_Close(-1)

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

    ;==================================================================================================
    ; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
    ; Description: Rekursive Auflistung von Dateien und/oder Ordnern
    ; Parameter(s): $sPath der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad)
    ; $sExt Erweiterung für Dateiauswahl '*' oder -1 für alle (Standard)
    ; $iDir -1 Dateien+Ordner(Standard), 0 nur Dateien, 1 nur Ordner
    ; optional: $iRetType 0 gibt Array, 1 gibt String zurück
    ; optional: $sDelim legt Trennzeichen für Stringrückgabe fest
    ; 0 -@CRLF (Standard) 1 -@CR 2 -@LF 3 -';' 4 -'|'
    ; Return Value(s): Array (Standard) od. String mit den gefundenen Pfaden der Dateien und/oder Ordner
    ; Array[0] enthält die Anzahl der gefundenen Dateien/Ordner
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _GetFilesFolder_Rekursiv($sPath, $sExt='*', $iDir=-1, $iRetType=0, $sDelim='0')
    Global $oFSO = ObjCreate('Scripting.FileSystemObject')
    Global $strFiles = ''
    Switch $sDelim
    Case '1'
    $sDelim = @CR
    Case '2'
    $sDelim = @LF
    Case '3'
    $sDelim = ';'
    Case '4'
    $sDelim = '|'
    Case Else
    $sDelim = @CRLF
    EndSwitch
    If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
    If $sExt = -1 Then $sExt = '*'
    If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
    _ShowSubFolders($oFSO.GetFolder($sPath),$sExt,$iDir,$sDelim)
    If $iRetType = 0 Then
    Local $aOut
    $aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1)
    If $aOut[1] = '' Then
    ReDim $aOut[1]
    $aOut[0] = 0
    EndIf
    Return $aOut
    Else
    Return StringTrimRight($strFiles, StringLen($sDelim))
    EndIf
    EndFunc

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

    Func _ShowSubFolders($Folder, $Ext='*', $Dir=-1, $Delim=@CRLF)
    If Not IsDeclared("strFiles") Then Global $strFiles = ''
    If ($Dir = -1) Or ($Dir = 0) Then
    For $file In $Folder.Files
    If $Ext <> '*' Then
    If StringRight($file.Name, StringLen($Ext)) = $Ext Then _
    $strFiles &= $file.Path & $Delim
    Else
    $strFiles &= $file.Path & $Delim
    EndIf
    Next
    EndIf
    For $Subfolder In $Folder.SubFolders
    If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
    _ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
    Next
    EndFunc

    [/autoit]

    Das ganze liest erst alle mp3 Files in einem Ordner + Unterordner, splittet jeweils den Dateinamen in eine ID, ein Datum und eine Uhrzeit ( sind im Dateinamen vorhanden) und speichert das ganze in der Datenbank.

    Hier kommt jetzt mein Problem:

    Ich arbeite mit BEGIN TRANSACTION und COMMIT TRANSACTION, damit es schneller geht ( es sind bis jetzt ca. 600000 Dateien und es werden täglich mehr).
    Ich möchte und kann (größenbedingt) die Dateien nicht umbenennen und/oder verschieben, aber es sollen eben immer auch die neuesten Dateien in die Datenbank gespielt werden.

    Jetzt bin ich mir aber nicht sicher, ob eine Transaktion Fehler ignoriert und alle andern Datensätze speichert, oder ob er die gesamte Transaktion abbricht.
    Als Beispiel, die Datei mit 000001_200911_0922_ODDB.mp3 wurde bereits eingelesen, liegt aber ja noch in dem Ordner.
    Wenn das Programm diese Datei jetzt nimmt und einen INSERT INTO Befehl damit erstellt, das ganze mitten in der Transaktion, wird es dann nur eine Fehlermeldung geben, das dieser Datensatz nicht eingespielt werden konnte oder bricht die gesamte Transaktion, mit möglicherweise noch nicht eingespielten Datensätzen, ab?

    Weiß jemand, wie das ausgeführt wird, oder kennt eine andere (vielleicht bessere) Lösung?