Hallöchen liebe Community,
ich habe ein kleines Problem mit einer SQLite Datenbank
Hier erstmal das Script
Spoiler anzeigen
#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
$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)
;==================================================================================================
; 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
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
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?