Probleme beim abspeichern und wiederauslesen von GIFs in SQLite DB

  • Hallo zusammen,

    ich probiere gerade GIF-Dateien in SQLite zu speichern (nicht den Pfad sondern die Daten). Leider gehen aber entweder beim Ein- oder beim Auslesen Dateien verloren. Im Anhang ist das Skript, eine Liste der Ländercodes nach ISO 3166 und GIFs. Wäre gut wenn jemand den Bug finden könnte,

    mfg (Auto)Bert

    Einmal editiert, zuletzt von AutoBert (16. Juni 2009 um 05:50)

  • Warum willst du die Flagge in der DB speichern, wenn du sie schon als Bild hast? Soll der flags-Ordner später rausfliegen?

  • Hallo Progandy,

    ja Ziel ist es eine Anwendung zu haben, bei der am Schluss nur noch 2 Dateien existieren a) die Exe b) die DB. In der DB sollen auch alle Einstellungen gespeichert werden.

    mfg (Auto)Bert

  • So läuft es bei mir: Zuerst einmal musst du alle BLOBS als Binary aus der DB holen, da sonst 0-bytes als Stringende gesehen werden. Dann solltest du nach etwa 100000 Zeichen die INSERTS ausführen und den String leeren, da sonst nicht ales reinkommt (bei mir)

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_UseUpx=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    ; *** Start added by AutoIt3Wrapper ***
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    ; *** End added by AutoIt3Wrapper ***
    ;AutoIt Skript
    ;ListView aus Gif-Files erstellen und anschliessend in DB eintragen
    #include <GuiListView.au3>
    #include <TreeViewConstants.au3>
    #include <SQLite.au3>
    #include <SQLite.dll.au3>
    #Include <Misc.au3>
    #Include <GuiListView.au3>

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

    Opt('GUIOnEventMode', 1)
    Opt('MUSTDECLAREVARS' ,1)

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

    Global $sTitel = 'Flaggen Ver.: 0.7.0'
    Global $Colourpath = @ScriptDir & '\flags'

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

    ;Global $himglstColours = _GUIImageList_Create()

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

    If _Singleton($sTitel, 1) = 0 Then
    MsgBox(64, $sTitel, $sTitel & ' ist bereits gestartet',5)
    Exit
    EndIf

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

    Global $sSqldb = @ScriptDir & '\Laender.db'

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

    Global $hfrmMain ;Hauptfenster Adressstammdaten wird immer sofort erzeugt
    Global $hfrmConf=0 ;Konfigurationsfenster nur bei Bedarf 1mal erzeugt
    Global $hfrmAkt ;aktuelles Fenster
    Global $lstvwLaender

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

    Global $hmnuitmFile, $hmnuitmListQueries, $hmnuitm2, $hmnuitmExit, $hmnuitmSave, $hmnuitmWindow, $hmnuitmRestore, $nMsg

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

    _Main()
    Exit

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

    Func _Main()
    Local $iLeft, $iWith, $iNr, $hLine1, $aText, $hImage
    $hfrmMain = GUICreate($sTitel, 500, 300, 220, 200) ; GuiFenster erstellen ;800, 540, -1, -1, $WS_SIZEBOX + $WS_SYSMENU +$WS_MAXIMIZEBOX +$WS_MINIMIZEBOX)
    $hfrmAkt = $hfrmMain ;zum vergleichen merken
    GUISetOnEvent($GUI_EVENT_CLOSE, '_exitMain')

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

    if FileExists($sSqldb) = 0 Then _DatenbankAnlegen()
    _SQLite_Startup ()
    If @error > 0 Then
    MsgBox(16, "SQLite Fehler", "SQLite.dll kann nicht geladen werden!")
    Exit
    EndIf
    _SQLite_Open($sSqldb)
    If @error > 0 Then
    MsgBox(16, "SQLite Fehler", "Kann Datenbank nicht öffnen")
    Exit
    EndIf
    $hmnuitmFile = GUICtrlCreateMenu("&Datei")
    $hmnuitmWindow = GUICtrlCreateMenu("&Fenster")
    ;$hmnuitmListQueries = GUICtrlCreateMenuItem("&Auswertungen", $hmnuitmFile)
    ;$hmnuitmSave = GUICtrlCreateMenuItem("&Zwischenspeicherung", $hmnuitmFile)
    ;$MenuItem2 = GUICtrlCreateMenuItem("", $hmnuitmFile)
    $hmnuitmExit = GUICtrlCreateMenuItem("Be&enden", $hmnuitmFile)
    GUICtrlSetOnEvent(-1, '_exitMain')
    $lstvwLaender = GUICtrlCreateListView("Speichern?|nID|Bzeichnung|Flagge", 10, 10, 480, 230, _
    BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT), BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES)) ;$LVS_SHOWSELALWAYS
    ; wichtig ist der Stil $LVS_Report und der eweiterte Stil $LVS_EX_Checkboxes
    ; erzeugt eine Listview mit den Spaltenüberschriften die zurückgegebene ID wird in der Variablen $ListView gespeichert

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

    _GUICtrlListView_SetColumnWidth($lstvwLaender, 0, 80) ; Breite für Spalte mit Index 0 auf 80 setzen
    _GUICtrlListView_SetColumnWidth($lstvwLaender, 1, 40) ; Breite für Spalte mit Index 1 auf 160 setzen
    _GUICtrlListView_SetColumnWidth($lstvwLaender, 2, 160) ; Breite für Spalte mit Index 2 auf 160 setzen

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

    LaenderEintragen()
    FlaggeAusgeben("DE") ;Test fü Deutschland-Flagge
    GUISetState()
    While 1
    Sleep(125)
    WEnd

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

    EndFunc

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

    Func _exitMain()
    Switch @GUI_WINHANDLE
    Case $hfrmMain
    _SQLite_Close()
    _SQLite_Shutdown()
    Exit
    EndSwitch
    EndFunc

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

    Func _DatenbankAnlegen()
    Local $aSql, $res
    _FileCreate($sSqldb)
    _SQLite_Startup ()
    If @error > 0 Then
    MsgBox(16, "SQLite Fehler", "SQLite.dll kann nicht geladen werden!")
    Exit
    EndIf
    _SQLite_Open($sSqldb)
    If @error > 0 Then
    MsgBox(16, "SQLite Fehler", "Kann Datenbank nicht öffnen")
    Exit
    EndIf
    $aSql = "CREATE TABLE [Laender] ([lID] VARCHAR(3) UNIQUE NOT NULL,[lName] vARCHAR(50) NULL,[lColours] BLOB NULL)"
    $res = _SQLite_Exec (-1, $aSql)
    _SQLite_Close()
    _SQLite_Shutdown()
    EndFunc

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

    Func FlaggeAusgeben($slID)
    Local $aSql, $res ,$rawFile, $aRow, $hQuery
    ; $aSql = 'Select lColours from Laender where lID = "' & $slID & '" LIMIT 1'
    $aSql = "Select * from Laender WHERE lID=" & _SQLite_Escape($slID) & " LIMIT 1"
    ; $aSql = 'Select * from Laender order by lID'
    If $SqlITE_OK <> _SQlite_Query (-1, $aSql, $hQuery) Then _ ; erstellt das Query mit den Daten
    MsgBox(0,"SQLite Error","Error Code: " & _SQLite_ErrCode() & @CR & "Error Message: " & _SQLite_ErrMsg())
    while _SQLite_FetchDataBin ($hQuery, $aRow ) = $SqlITE_OK ; gibt 1D-Array zurück mit den Daten einer Zeile aus Query
    ;If $aRow[2]="" Then ContinueLoop
    $rawFile = FileOpen(_DecodeUTF8($aRow[0]) & ".gif",18)
    ;ConsoleWrite(_DecodeUTF8($aRow[0]) & " " & _DecodeUTF8($aRow[1]) & @CRLF)
    FileWrite($rawFile,$aRow[2])
    FileClose($rawFile)
    WEnd
    EndFunc

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

    Func LaenderEintragen()
    Local $aSql = "", $res, $rawFile, $_preData, $_postData
    Local $i, $aName, $sData = "", $pic
    Local $aFile = StringSplit(StringReplace(FileRead("LändercodeTabelle_ISO_3166.txt"),@CRLF,"|"),"|") ;0 basierend aber es steht die Anzahl darin
    If Not IsArray($aFile) Then Return
    ;_ArrayDisplay($aFile)
    ;hier werden die ListViewItems erzeugt mit das "|" ist das Trennzeichen zwischen den Spalten
    _GUICtrlListView_BeginUpdate($lstvwLaender)
    For $i = 1 To $aFile[0] -1
    $aName = StringSplit($aFile[$i],";",2) ;Dateinamen teilen Trennzeichen ist Punkt 2=Array = 0-basierend

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

    if FileExists($Colourpath & "\" & $aName[1] & ".gif") then
    $rawFile = FileOpen($Colourpath & "\" & $aName[1] & ".gif",16)
    $sData = FileRead($rawFile,FileGetSize($Colourpath & "\" & $aName[1] & ".gif"))
    FileClose($rawFile)
    Else
    $sData = ""
    EndIf
    GUICtrlCreateListViewItem(" |" & $aName[1] & "|" & $aName[0] & "|" & $sData, $lstvwLaender)
    ;$pic = GUICtrlCreatePic($Colourpath & "\" & $aName[0] & "." & $aName[1],-1,-1)
    ;$sData = _SQLite_Encode(Binary(GUICtrlRead($pic)))
    Select
    Case $sData = ""
    $aSql &= "INSERT INTO Laender (lID,lName) VALUES ('" & $aName[1] & "','" & $aName[0]& "');" & @CRLF
    Case Else
    $aSql &= "INSERT INTO Laender (lID,lName,lColours) VALUES ('" & $aName[1] & "','" & $aName[0]& "', X'" & Hex($sData) & "');" & @CRLF
    EndSelect
    ;SQL-Aktionen sammeln
    If StringLen($aSQL) > 100000 Then
    ; sonst wird zu viel Speicher verbraucht oder so, auf jeden Fall läuft es nicht.
    $res = _SQLite_Exec (-1, $aSql); SQL auf einmal ausführen
    $aSQL = ""
    EndIf
    Next
    $res = _SQLite_Exec (-1, $aSql); SQL auf einmal ausführen
    _GUICtrlListView_EndUpdate($lstvwLaender)
    EndFunc

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

    ; Author(s): piccaso (Fida Florian)
    ; Modified: Prog@ndy
    Func _SQLite_FetchDataBin($hQuery, ByRef $aRow)
    If $g_hDll_SQLite = 0 Then Return SetError(1, 0, $SQLITE_MISUSE)
    If Not __SQLite_hChk($hQuery, $SQLITE_QUERYHANDLE) = $SQLITE_OK Then Return SetError(7, 0, $SQLITE_MISUSE)
    If Not IsArray($aRow) Then
    Dim $aRow[1]
    EndIf
    Local $iRval_Step, $iRval_ColCnt, $sRval, $i, $iRval_coltype
    Local $iColBytes, $vResult, $vResultStruct
    Local $SQLITE_NULL = 5
    $iRval_Step = DllCall($g_hDll_SQLite, "int:cdecl", "sqlite3_step", "ptr", $hQuery)
    If @error > 0 Then
    Return SetError(1, 0, $SQLITE_MISUSE)
    ElseIf $iRval_Step[0] = $SQLITE_ROW Then
    $iRval_ColCnt = DllCall($g_hDll_SQLite, "int:cdecl", "sqlite3_data_count", "ptr", $hQuery)
    If @error > 0 Then
    Return SetError(2, 0, $SQLITE_MISUSE)
    EndIf
    If $iRval_ColCnt[0] > 0 Then
    ReDim $aRow[$iRval_ColCnt[0]]
    For $i = 0 To $iRval_ColCnt[0] - 1
    $iColBytes = DllCall($g_hDll_SQLite, "int:cdecl", "sqlite3_column_bytes", "ptr", $hQuery, "int", $i)
    If @error > 0 Then Return SetError(5, 0, $SQLITE_MISUSE)
    $vResult = DllCall($g_hDll_SQLite, "ptr:cdecl", "sqlite3_column_blob", "ptr", $hQuery, "int", $i)
    If @error > 0 Then Return SetError(6, 0, $SQLITE_MISUSE)
    if $iColBytes[0]=0 Then
    $aRow[$i] = ""
    else
    $vResultStruct = DllStructCreate("byte[" & $iColBytes[0] & "]", $vResult[0])
    $aRow[$i] = DllStructGetData($vResultStruct, 1)
    Endif
    Next
    Return $SQLITE_OK
    Else
    Return SetError(-1, 0, $SQLITE_EMPTY)
    EndIf
    Else ; incl. $SQLITE_DONE
    _SQLite_QueryFinalize($hQuery)
    If $iRval_Step[0] <> $SQLITE_OK Then SetError(-1)
    Return $iRval_Step[0]
    EndIf
    EndFunc ;==>_SQLite_FetchData

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

    Func _DecodeUTF8(ByRef Const $vData)
    ; Author: Prog@ndy
    If IsBinary($vData) Then Return BinaryToString($vData, 4)
    Return BinaryToString(StringToBinary($sData, 1), 4)
    EndFunc

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

    Func _EncodeUTF8(ByRef Const $vData, $fBinary =False)
    ; Author: Prog@ndy
    If $fBinary Then Return StringToBinary($vData,4)
    Return BinaryToString(StringToBinary($vData,4),1)
    EndFunc

    [/autoit]
  • Hallo Progandy,

    danke erster Test klappt super :thumbup: ,

    Edit: es wurden immer noch Flaggen unterschlagen, das lag aber an dem Text-File, dass noch (bisher nicht abgefangene) SQLite-Errors erzeugt hat, nach Anpassung des Textfiles werden alle 227 Flaggen (Textfile-Eintrag + Flagge vorhanden) ein- und ausgelesen.

    Beim Auslesen werden noch für die Einträge bei denen keine Flagge vorhanden war Files mit der Länge 0 erzeugt, aber da find ich sicher noch eine Lösung

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiListView.au3>
    #include <TreeViewConstants.au3>
    #include <SQLite.au3>
    #include <SQLite.dll.au3>
    #Include <Misc.au3>
    #Include <GuiListView.au3>

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

    Opt('GUIOnEventMode', 1)
    Opt('MUSTDECLAREVARS' ,1)

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

    Global $sTitel = 'Flaggen Ver.: 0.7.2'
    Global $Colourpath = @ScriptDir & '\flags'

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

    ;Global $himglstColours = _GUIImageList_Create()

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

    If _Singleton($sTitel, 1) = 0 Then
    MsgBox(64, $sTitel, $sTitel & ' ist bereits gestartet',5)
    Exit
    EndIf

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

    Global $sSqldb = @ScriptDir & '\Laender.db'

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

    Global $hfrmMain ;Hauptfenster wird immer sofort erzeugt
    ;Global $hfrmConf=0 ;Konfigurationsfenster nur bei Bedarf 1mal erzeugt
    ;Global $hfrmAkt ;aktuelles Fenster
    Global $lstvwLaender, $hLVHandle

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

    Global $hmnuitmFile, $hmnuitmListQueries, $hmnuitm2, $hmnuitmExit, $hmnuitmSave, $hmnuitmWindow, $hmnuitmRestore, $nMsg

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

    _Main()
    Exit

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

    Func _Main()
    Local $iLeft, $iWith, $iNr, $hLine1, $aText, $hImage
    $hfrmMain = GUICreate($sTitel, 500, 300, 220, 200) ; GuiFenster erstellen ;800, 540, -1, -1, $WS_SIZEBOX + $WS_SYSMENU +$WS_MAXIMIZEBOX +$WS_MINIMIZEBOX)
    ;$hfrmAkt = $hfrmMain ;zum vergleichen merken
    GUISetOnEvent($GUI_EVENT_CLOSE, '_exitMain')

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

    $hmnuitmFile = GUICtrlCreateMenu("&Datei")
    $hmnuitmWindow = GUICtrlCreateMenu("&Fenster")
    ;$hmnuitmListQueries = GUICtrlCreateMenuItem("&Auswertungen", $hmnuitmFile)
    ;$hmnuitmSave = GUICtrlCreateMenuItem("&Zwischenspeicherung", $hmnuitmFile)
    ;$MenuItem2 = GUICtrlCreateMenuItem("", $hmnuitmFile)
    $hmnuitmExit = GUICtrlCreateMenuItem("Be&enden", $hmnuitmFile)
    GUICtrlSetOnEvent(-1, '_exitMain')
    $lstvwLaender = GUICtrlCreateListView("Speichern?|nID|Bzeichnung|Flagge", 10, 10, 480, 230, _
    BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT), BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES)) ;$LVS_SHOWSELALWAYS
    ; wichtig ist der Stil $LVS_Report und der eweiterte Stil $LVS_EX_Checkboxes
    ; erzeugt eine Listview mit den Spaltenüberschriften die zurückgegebene ID wird in der Variablen $ListView gespeichert
    $hLVHandle = GUICtrlGetHandle($lstvwLaender) ; das Handle aus ID ermitteln

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

    _GUICtrlListView_SetColumnWidth($lstvwLaender, 0, 80) ; Breite für Spalte mit Index 0 auf 80 setzen
    _GUICtrlListView_SetColumnWidth($lstvwLaender, 1, 40) ; Breite für Spalte mit Index 1 auf 160 setzen
    _GUICtrlListView_SetColumnWidth($lstvwLaender, 2, 160) ; Breite für Spalte mit Index 2 auf 160 setzen

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

    if FileExists($sSqldb) = 0 Then
    _DatenbankAnlegen()
    Else
    _SQliteStart()
    ListviewFuellen()
    EndIf
    FlaggeAusgeben("DE") ;Test für Deutschland-Flagge (im Moment für alle Flaggen in @ScriptDir)
    GUISetState()
    While 1
    Sleep(125)
    WEnd

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

    EndFunc

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

    Func _exitMain()
    _SQLite_Close()
    _SQLite_Shutdown()
    Exit
    EndFunc

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

    Func _SQliteStart()
    _SQLite_Startup ()
    If @error > 0 Then
    MsgBox(16, "SQLite Fehler", "SQLite.dll kann nicht geladen werden!")
    Exit
    EndIf
    _SQLite_Open($sSqldb)
    If @error > 0 Then
    MsgBox(16, "SQLite Fehler", "Kann Datenbank nicht öffnen")
    _exitMain()
    EndIf
    EndFunc

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

    Func _DatenbankAnlegen()
    Local $aSql, $res
    _FileCreate($sSqldb)
    _SQliteStart()
    $aSql = "CREATE TABLE [Laender] ([lID] VARCHAR(3) UNIQUE NOT NULL,[lName] vARCHAR(50) NULL,[lColours] BLOB NULL)"
    $res = _SQLite_Exec (-1, $aSql)
    LaenderEintragen()
    ;_SQLite_Close()
    ;_SQLite_Shutdown()
    EndFunc

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

    Func EintragZeigen()
    Local $aItem = _GUICtrlListView_GetItemTextArray($hLVHandle)
    FlaggeAusgeben($aItem[1])
    WinSetTitle($hfrmMain,"",$sTitel & " " & $aItem[3] & " ist ausgewählt")
    EndFunc ;==>Edit

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

    Func FlaggeAusgeben($slID)
    ConsoleWrite("Flagge für: " & $slID & @CRLF)
    Local $aSql, $res ,$rawFile, $aRow, $hQuery
    $aSql = "Select * from Laender WHERE lID=" & _SQLite_Escape($slID) & " LIMIT 1" ;SQL Abfrage für das gewünschte Land
    If $SqlITE_OK <> _SQlite_Query (-1, $aSql, $hQuery) Then _ ; erstellt das Query mit den Daten
    MsgBox(0,"SQLite Error","Error Code: " & _SQLite_ErrCode() & @CR & "Error Message: " & _SQLite_ErrMsg())
    while _SQLite_FetchDataBin ($hQuery, $aRow ) = $SqlITE_OK ; gibt 1D-Array zurück mit den Daten einer Zeile aus Query
    If $aRow[2]="" Then ContinueLoop
    $rawFile = FileOpen(_DecodeUTF8($aRow[0]) & ".gif",18)
    ;ConsoleWrite(_DecodeUTF8($aRow[0]) & " " & _DecodeUTF8($aRow[1]) & @CRLF)
    FileWrite($rawFile,$aRow[2])
    FileClose($rawFile)
    WEnd
    EndFunc

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

    Func ListviewFuellen()
    Local $iZeit = TimerInit(), $j
    Local $aSql, $res ,$rawFile, $aRow, $hQuery
    $aSql = 'Select * from Laender order by lID' ; SQL Abfage zeigt alle Länder der Tabelle
    If $SqlITE_OK <> _SQlite_Query (-1, $aSql, $hQuery) Then _ ; erstellt das Query mit den Daten
    MsgBox(0,"SQLite Error","Error Code: " & _SQLite_ErrCode() & @CR & "Error Message: " & _SQLite_ErrMsg())
    while _SQLite_FetchDataBin ($hQuery, $aRow ) = $SqlITE_OK ; gibt 1D-Array zurück mit den Daten einer Zeile aus Query
    If $aRow[2]="" Then
    $aRow[2]="NEIN"
    Else
    $aRow[2]="JA"
    EndIf
    FlaggeAusgeben(_DecodeUTF8($aRow[0])) ;später löschen
    GUICtrlCreateListViewItem(" |" & _DecodeUTF8($aRow[0]) & "|" & _DecodeUTF8($aRow[1]) & "|" & $aRow[2], $lstvwLaender)
    GUICtrlSetOnEvent(-1,"EintragZeigen")
    $j += 1
    WEnd
    $iZeit = TimerDiff($iZeit)
    MsgBox(0,"Anzahl: " & $j,"in " & $iZeit & " ms")
    EndFunc

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

    Func LaenderEintragen()
    Local $iZeit = TimerInit()
    Local $aSql = "", $res, $rawFile, $_preData, $_postData
    Local $i, $j, $k, $aName, $sData = "", $pic
    Local $aFile = StringSplit(StringReplace(FileRead("LändercodeTabelle_ISO_3166_2.txt"),@CRLF,"|"),"|") ;0 basierend aber es steht die Anzahl darin
    If Not IsArray($aFile) Then Return
    ;_ArrayDisplay($aFile)
    ;hier werden die ListViewItems erzeugt mit das "|" ist das Trennzeichen zwischen den Spalten
    _GUICtrlListView_BeginUpdate($lstvwLaender)
    For $i = 1 To $aFile[0] -1
    $aName = StringSplit($aFile[$i],";",2) ;Dateinamen teilen Trennzeichen ist Punkt 2=Array = 0-basierend

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

    if FileExists($Colourpath & "\" & $aName[1] & ".gif") then
    $rawFile = FileOpen($Colourpath & "\" & $aName[1] & ".gif",16)
    $sData = FileRead($rawFile,FileGetSize($Colourpath & "\" & $aName[1] & ".gif"))
    FileClose($rawFile)
    Else
    $sData = "NEIN"
    EndIf
    GUICtrlCreateListViewItem(" |" & $aName[1] & "|" & $aName[0] & "|" & $sData, $lstvwLaender)
    GUICtrlSetOnEvent(-1,"EintragZeigen")
    Select
    Case $sData = "NEIN"
    $aSql &= "INSERT INTO Laender (lID,lName) VALUES ('" & $aName[1] & "','" & $aName[0]& "');" & @CRLF
    $k += 1
    Case Else
    $aSql &= "INSERT INTO Laender (lID,lName,lColours) VALUES ('" & $aName[1] & "','" & $aName[0]& "', X'" & Hex($sData) & "');" & @CRLF
    $j += 1
    EndSelect
    ;SQL-Aktionen sammeln
    If StringLen($aSQL) > 100000 Then
    ; sonst wird zu viel Speicher verbraucht oder so, auf jeden Fall läuft es nicht.
    $res = _SQLite_Exec (-1, $aSql); SQL auf einmal ausführen
    $aSQL = ""
    EndIf
    Next
    $res = _SQLite_Exec (-1, $aSql); SQL auf einmal ausführen
    _GUICtrlListView_EndUpdate($lstvwLaender)
    $iZeit = TimerDiff($iZeit)
    MsgBox(0,"Anzahl: " & $j + $k,"in " & $iZeit & " ms")
    EndFunc

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

    ; Author(s): piccaso (Fida Florian)
    ; Modified: Prog@ndy
    Func _SQLite_FetchDataBin($hQuery, ByRef $aRow)
    If $g_hDll_SQLite = 0 Then Return SetError(1, 0, $SQLITE_MISUSE)
    If Not __SQLite_hChk($hQuery, $SQLITE_QUERYHANDLE) = $SQLITE_OK Then Return SetError(7, 0, $SQLITE_MISUSE)
    If Not IsArray($aRow) Then
    Dim $aRow[1]
    EndIf
    Local $iRval_Step, $iRval_ColCnt, $sRval, $i, $iRval_coltype
    Local $iColBytes, $vResult, $vResultStruct
    Local $SQLITE_NULL = 5
    $iRval_Step = DllCall($g_hDll_SQLite, "int:cdecl", "sqlite3_step", "ptr", $hQuery)
    If @error > 0 Then
    Return SetError(1, 0, $SQLITE_MISUSE)
    ElseIf $iRval_Step[0] = $SQLITE_ROW Then
    $iRval_ColCnt = DllCall($g_hDll_SQLite, "int:cdecl", "sqlite3_data_count", "ptr", $hQuery)
    If @error > 0 Then
    Return SetError(2, 0, $SQLITE_MISUSE)
    EndIf
    If $iRval_ColCnt[0] > 0 Then
    ReDim $aRow[$iRval_ColCnt[0]]
    For $i = 0 To $iRval_ColCnt[0] - 1
    $iColBytes = DllCall($g_hDll_SQLite, "int:cdecl", "sqlite3_column_bytes", "ptr", $hQuery, "int", $i)
    If @error > 0 Then Return SetError(5, 0, $SQLITE_MISUSE)
    $vResult = DllCall($g_hDll_SQLite, "ptr:cdecl", "sqlite3_column_blob", "ptr", $hQuery, "int", $i)
    If @error > 0 Then Return SetError(6, 0, $SQLITE_MISUSE)
    if $iColBytes[0]=0 Then
    $aRow[$i] = ""
    else
    $vResultStruct = DllStructCreate("byte[" & $iColBytes[0] & "]", $vResult[0])
    $aRow[$i] = DllStructGetData($vResultStruct, 1)
    Endif
    Next
    Return $SQLITE_OK
    Else
    Return SetError(-1, 0, $SQLITE_EMPTY)
    EndIf
    Else ; incl. $SQLITE_DONE
    _SQLite_QueryFinalize($hQuery)
    If $iRval_Step[0] <> $SQLITE_OK Then SetError(-1)
    Return $iRval_Step[0]
    EndIf
    EndFunc ;==>_SQLite_FetchData

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

    Func _DecodeUTF8(ByRef Const $vData)
    ; Author: Prog@ndy
    Local $sData
    If IsBinary($vData) Then Return BinaryToString($vData, 4)
    Return BinaryToString(StringToBinary($sData, 1), 4)
    EndFunc

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

    Func _EncodeUTF8(ByRef Const $vData, $fBinary =False)
    ; Author: Prog@ndy
    If $fBinary Then Return StringToBinary($vData,4)
    Return BinaryToString(StringToBinary($vData,4),1)
    EndFunc

    [/autoit]


    überarbeitete Ländertabelle: autoit.de/wcf/attachment/5173/
    Die Flaggen befinden sich im Zip-File #1

    mfg (Auto)Bert

    3 Mal editiert, zuletzt von AutoBert (16. Juni 2009 um 05:44)