Ich stelle zum Befüllen der Tabellen einer SQLite-DB die Queries in einer Funktion zusammen. Dabei hänge ich alle Insert-Befehle hintereinander und führe danach aus:
AutoIt
Function _Insert($_kind, $_sCSV)
Local $aLines = FileReadToArray($_sCSV)
Local $aSplit, $sQuery = 'BEGIN;'
For $i = 1 To UBound($aLines) -1
If $_kind = 'Tab1' Then
$aSplit = StringSplit($aLines[$i], ',', 2)
$sQuery &= _
StringFormat("INSERT INTO tab1 VALUES (%d, '%s', '%s', '%s', '%s', '%s', '%s');", $i, _
$aSplit[0], $aSplit[1], $aSplit[2], $aSplit[3], $aSplit[4], $aSplit[5])
Else
$aSplit = _SplitStreetLine($aLines[$i])
$sQuery &= _
StringFormat("INSERT INTO tab2 VALUES (%d, '%s', '%s', '%s', '%s');", $i, _
$aSplit[0], $aSplit[1], $aSplit[2], $aSplit[3])
EndIf
Next
Local $SQLiteResult = _SQLite_Exec($hSQL, $sQuery & 'COMMIT;')
If $SQLiteResult <> $SQLITE_OK Then
ConsoleWrite('!> ERROR! ' & @TAB & 'Inserting data in table [' & $_kind & '] has failed.' & @CRLF & _
'!> The sql-query is stored to "@ScriptDir\err_insert.txt".' & @CRLF & _
'!> Check this file.' & @CRLF)
Local $fh = FileOpen(@ScriptDir & '\err_insert.txt', 2+256)
FileWrite($fh, 'SQLite-Error = ' & $SQLiteResult & @CRLF & $sQuery)
FileClose($fh)
Exit
EndIf
EndFunc
Alles anzeigen
Tabelle 1 hat nur ein paar Hundert Datensätze, das Insert funktioniert ohne Probleme.
Für Tabelle 2 stelle ich 1,8 Mio Datensätze zusammen. AutoIt hat kein Problem mit der Stringlänge.
Aber das _SQLite_Exec schlägt fehl, Fehlercode = 1 - Error calling SQLite API 'sqlite3_exec'. Natürlich sehr aussagekräftig.
Meine Vermutung ist, dass der Befehlsstring einfach zu lang ist (~103 Mio. Zeichen).
Bevor ich jetzt anfange zu stückeln: Ist euch ein Limit für den Befehlsstring bekannt? Ich möchte mich da nicht rantasten.