SQLite kopieren

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

SQLite kopieren

Beitrag von Velindos »

SQLite kopieren

Hallo Leute,

möchte aus meiner aktuellen gewählten Base über ein Listicon sortierte Datensätze in einer
Base_Kopie speichern!

Nun habe ich zwar eine Lösung, aber die Funzt sehr, sehr langsam.

Ausserdem reagiert das Window nicht, geschweige der Focus im ListIconGadget!!!

Code: Alles auswählen

Procedure Datenbank_Kopie()
  Protected Target = 2
  Protected Source = 1
  Protected Bildspalte = 5
  Protected SQL.s
  
  Protected LoopZeiger = 0
  Protected Aktueller_Base_Verezichniss$
  Protected Aktueller_Base_Name$
  Protected Kopie_Base_Name$
  Protected Kopie_Base_File$
  Protected Recordzeiger
  ; --------------------------------
  ; #Zuerst den Record aufrufen
  ListIcon_FocusReset()
  ; --------------------------------
  ;{ Neue Base anlegen
  Aktueller_Base_Verezichniss$ = GetPathPart(DatabaseFile$)
  ; ------------------------------
  ; Database FileName
  Aktueller_Base_Name$ = GetFilePart(DatabaseFile$,#PB_FileSystem_NoExtension)
  ; ------------------------------
  ; Filenamen kopieren
  Kopie_Base_Name$ = Aktueller_Base_Name$ + "_Kopie"
  ; ------------------------------
  ; Base File
  Kopie_Base_File$ = Aktueller_Base_Verezichniss$ + Kopie_Base_Name$
  ; ------------------------------
  ; Neue Base Anlegen
  Datenbank_Anlegen(Kopie_Base_File$)
  ; *************  
  ;Rettung
  Rtg_ListIconzeile = ListIconZeile
  ;}
  ; *************  
  ;{ SQLite KOPIEREN
  For Recordzeiger = 0 To WahlLetzter
    ;{ Record Zähler einrichten
    ListIcon_Record$ = GetGadgetItemText(#Work_L_ListIcon,Recordzeiger,ListIconSpalteRecord)
    ;}
    ;{ BASE lesen
    If OpenDatabase(Source, DatabaseFile$, "", "", #PB_Database_SQLite)
      DatabaseQuery(Source, "Select * From Velindos WHERE ID ="+ ListIcon_Record$)
      While NextDatabaseRow(Source)
        Read_KEYID$= GetDatabaseString(Source,0)
        Read_STICHWORT$= GetDatabaseString(Source,1)
        ; NOTIZ wegen Richtext
        Read_NOTIZ$ = GetDatabaseString(Source,2)
        Read_NOTIZ$ = ReplaceString(Read_NOTIZ$, "'", "''")
        Read_PFAD$  = GetDatabaseString(Source,3)
        Read_Genre$ =GetDatabaseString(Source,4)
        ; ------------------------------------------------
        ; Bild
        If DatabaseColumnType(Source, Bildspalte) = #PB_Database_Blob
          MemSize = DatabaseColumnSize(Source,Bildspalte)
          If MemSize
            ; AllocateMemory
            *ImageMemory = AllocateMemory(MemSize)
            Debug "MemSize= "+MemSize
            ; Memory
            If *ImageMemory
              If GetDatabaseBlob(Source, Bildspalte, *ImageMemory,MemSize)
                ; ------------------------------------------------
                Debug  "Read_KEYID$= "+Read_KEYID$
                Debug  "Read_STICHWORT$= "+Read_STICHWORT$
                Debug  "Read_NOTIZ$= "+Read_NOTIZ$
                Debug  "Read_PFAD$= "+Read_PFAD$
                Debug  "Read_Genre$= "+Read_Genre$
                Debug  "Read_Ordner$= "+Read_Ordner$
                Debug  "Read_CODEC$= "+Read_CODEC$
                Debug  "Read_Source$= "+Read_Source$
                Debug  "Read_Artikel$= "+Read_Artikel$
                ; --------------------------------
                Debug "LoopZeiger= " +LoopZeiger
              Else
                Debug "GetDatabaseBlob ist fehlgeschlagen"
              EndIf
              ;FreeMemory(*ImageMemory)
            Else
              Debug "Nicht genügend Speicher vorhanden"
            EndIf
          Else
            Debug "picsize is null"
          EndIf
        Else
          Debug "DatabaseColumnType(0, 1) ist kein Blob"
        EndIf
        ; ------------------------------------------------
        Read_Ordner$ = GetDatabaseString(Source,6)
        Read_CODEC$ = GetDatabaseString(Source,7)
        Read_Source$ = GetDatabaseString(Source,8)
        Read_Artikel$ =GetDatabaseString(Source,9)
        ; ------------------------------------------------
      Wend
      FinishDatabaseQuery(Source)
      CloseDatabase (Source)
    Else
      MessageRequester("Database", "Fehlende Database")
    EndIf
    ; ------------------------------------------------
    ;}
    ;{ FOCUS
    ;Zeiger  setzen
    SendMessage_(GadgetID(#Work_L_ListIcon),#LVM_ENSUREVISIBLE,ListIconZeile,0)   
    ; FOCUS auf Zeile
    SetGadgetState(#Work_L_ListIcon, ListIconZeile) 
    ; Aktivited
    SetActiveGadget(#Work_L_ListIcon)
    ;}
    ;{ BASE schreiben
    If OpenDatabase(Target, Kopie_Base_File$, "", "", #PB_Database_SQLite)
      ; Bild laden
      SetDatabaseBlob(Target, 0, *ImageMemory, MemSize)
      ; *************  
      ; SQL String new
      SQL = "Insert Into Velindos (Stichwort, Notiz, Pfad, Genre, myBild, Ordner, Codec, Source, Artikel) Values "
      SQL + " ('"+Read_STICHWORT$+"','"+Read_NOTIZ$+"','"+Read_PFAD$+"','"+Read_GENRE$+"',?,'"+Read_Ordner$+"','"+Read_Codec$+"','"+Read_Source$+"','"+Read_Artikel$+"');"
      ; INSERT BASE
      If DatabaseUpdate(Target, SQL) 
        Debug "Datensatz eingefügt"
      EndIf
      ; FreeMemory
      FreeMemory(*ImageMemory) 
      CloseDatabase(Target)
    Else
      Debug DatabaseError()
      MessageRequester("Database", "Fehlende Database")
    EndIf
    ;}
  Next
  ;}
  
  ; *************  
  
  ;{ FERTIG
  ; #Zuerst den Record aufrufen
  ; ===========
  ; ListIcon_FocusReset()
  DatabaseFile$ = Kopie_Base_File$
  ; ===========
  Datenbank_Wahl()
  ; ===========
  ;Rettung
  ListIconZeile = Rtg_ListIconzeile
  ; ===========
  ; Key
  Datenbank_Key()
  ; ===========
  ; #Zuerst den Record aufrufen
  ListIcon_FocusSet()
  ;}
  
EndProcedure
Jemand einen Tip wie ich die Sache beschleunigen kann?

Gruss ... Velindos
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Kiffi
Beiträge: 10620
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: SQLite kopieren

Beitrag von Kiffi »

Velindos hat geschrieben:Nun habe ich zwar eine Lösung, aber die Funzt sehr, sehr langsam.
das ist kein Wunder, denn für jeder Kopieraktion öffnest und schließt Du sowohl Quell- als auch Zieldatenbank.

Vorschlag: Zu Beginn der Kopieraktion beide Datenbanken öffnen und erst zum Schluss beide schließen. Das sollte schon mal was an Geschwindigkeit bringen.

Den größten Performance-Schub wirst Du allerdings haben, wenn Du alle DatabaseUpdate() - Befehle mit einer Transaktion klammerst.

siehe z.B. hier: http://www.purebasic.fr/german/viewtopi ... 09#p342309

Grüße ... Peter
Hygge
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: SQLite kopieren

Beitrag von Velindos »

Hallo,

habe die Sache abgeändert, funzt sehr langsam!

Code: Alles auswählen

Procedure Datenbank_Kopie()
  Protected Target = 2
  Protected Source = 1
  Protected Bildspalte = 5
  Protected SQL.s
  
  Protected LoopZeiger = 0
  Protected Aktueller_Base_Verezichniss$
  Protected Aktueller_Base_Name$
  Protected Kopie_Base_Name$
  Protected Kopie_Base_File$
  Protected Recordzeiger
  ; --------------------------------
  ; #Zuerst den Record aufrufen
  ListIcon_FocusReset()
  ; --------------------------------
  ;{ Neue Base anlegen
  Aktueller_Base_Verezichniss$ = GetPathPart(DatabaseFile$)
  ; ------------------------------
  ; Database FileName
  Aktueller_Base_Name$ = GetFilePart(DatabaseFile$,#PB_FileSystem_NoExtension)
  ; ------------------------------
  ; Filenamen kopieren
  Kopie_Base_Name$ = Aktueller_Base_Name$ + "_Kopie.db"
  ; ------------------------------
  ; Base File
  Kopie_Base_File$ = Aktueller_Base_Verezichniss$ + Kopie_Base_Name$
  ; ------------------------------
  ; Neue Base Anlegen
  Datenbank_Anlegen(Kopie_Base_File$)
  ; ************* 
  ;Rettung
  Rtg_ListIconzeile = ListIconZeile
  ;}
  ; ************* 
  If OpenDatabase(Source, DatabaseFile$, "", "", #PB_Database_SQLite)
      
      ;{ SQLite KOPIEREN
      For Recordzeiger = 0 To WahlLetzter-1
        ;{ Record Zähler einrichten
        ListIcon_Record$ = GetGadgetItemText(#Work_L_ListIcon,Recordzeiger,ListIconSpalteRecord)
        ;}
        Debug "Recordzeiger= "+Recordzeiger
        ;{ BASE lesen
        DatabaseQuery(Source, "Select * From Velindos WHERE ID ="+ ListIcon_Record$)
        While NextDatabaseRow(Source)
          Read_KEYID$= GetDatabaseString(Source,0)
          Read_STICHWORT$= GetDatabaseString(Source,1)
          ; NOTIZ wegen Richtext
          Read_NOTIZ$ = GetDatabaseString(Source,2)
          Read_NOTIZ$ = ReplaceString(Read_NOTIZ$, "'", "''")
          Read_PFAD$  = GetDatabaseString(Source,3)
          Read_Genre$ =GetDatabaseString(Source,4)
          ; ------------------------------------------------
          ; Bild
          If DatabaseColumnType(Source, Bildspalte) = #PB_Database_Blob
            MemSize = DatabaseColumnSize(Source,Bildspalte)
            If MemSize
              ; AllocateMemory
              *ImageMemory = AllocateMemory(MemSize)
              Debug "MemSize= "+MemSize
              ; Memory
              If *ImageMemory
                If GetDatabaseBlob(Source, Bildspalte, *ImageMemory,MemSize)
                  ; ------------------------------------------------
                  Debug  "Read_KEYID$= "+Read_KEYID$
                  Debug  "Read_STICHWORT$= "+Read_STICHWORT$
                  Debug  "Read_NOTIZ$= "+Read_NOTIZ$
                  Debug  "Read_PFAD$= "+Read_PFAD$
                  Debug  "Read_Genre$= "+Read_Genre$
                  Debug  "Read_Ordner$= "+Read_Ordner$
                  Debug  "Read_CODEC$= "+Read_CODEC$
                  Debug  "Read_Source$= "+Read_Source$
                  Debug  "Read_Artikel$= "+Read_Artikel$
                  ; --------------------------------
                  Debug "LoopZeiger= " +LoopZeiger
                Else
                  Debug "GetDatabaseBlob ist fehlgeschlagen"
                EndIf
                ;FreeMemory(*ImageMemory)
              Else
                Debug "Nicht genügend Speicher vorhanden"
              EndIf
            Else
              Debug "picsize is null"
            EndIf
          Else
            Debug "DatabaseColumnType(0, 1) ist kein Blob"
          EndIf
          ; ------------------------------------------------
          Read_Ordner$ = GetDatabaseString(Source,6)
          Read_CODEC$ = GetDatabaseString(Source,7)
          Read_Source$ = GetDatabaseString(Source,8)
          Read_Artikel$ =GetDatabaseString(Source,9)
          ; ------------------------------------------------
        Wend
        
        ; ------------------------------------------------
        ;}
        ;{ FOCUS
        ;Zeiger  setzen
        SendMessage_(GadgetID(#Work_L_ListIcon),#LVM_ENSUREVISIBLE,ListIconZeile,0)   
        ; FOCUS auf Zeile
        SetGadgetState(#Work_L_ListIcon, ListIconZeile)
        ; Aktivited
        SetActiveGadget(#Work_L_ListIcon)
        ;}
        
        
        ;{ BASE schreiben
        If OpenDatabase(Target, Kopie_Base_File$, "", "", #PB_Database_SQLite)
          ; ************* 
          ;PRAGMA schema.journal_mode = DELETE | TRUNCATE | PERSIST | MEMORY | WAL | OFF
          sql.s="PRAGMA journal_mode = MEMORY"
          DatabaseUpdate(Target,sql)
          Debug DatabaseError()
          DatabaseUpdate(Target,"begin transaction")
          ; ************* 
          ; Bild laden
          SetDatabaseBlob(Target, 0, *ImageMemory, MemSize)
          ; ************* 
          ; SQL String new
          SQL = "Insert Into Velindos (Stichwort, Notiz, Pfad, Genre, myBild, Ordner, Codec, Source, Artikel) Values "
          SQL + " ('"+Read_STICHWORT$+"','"+Read_NOTIZ$+"','"+Read_PFAD$+"','"+Read_GENRE$+"',?,'"+Read_Ordner$+"','"+Read_Codec$+"','"+Read_Source$+"','"+Read_Artikel$+"');"
          ; INSERT BASE
          If DatabaseUpdate(Target, SQL)
            Debug "Datensatz eingefügt"
          EndIf
          ; FreeMemory
          FreeMemory(*ImageMemory)
        Else
          MessageRequester("Database", "Fehlende Database")
        EndIf
        DatabaseUpdate(Target,"commit")
        CloseDatabase(Target)
        
        ;}
      Next
      ;}
      ; ************* 
      FinishDatabaseQuery(Source)
      CloseDatabase (Source)
  Else
    Debug DatabaseError()
    MessageRequester("Database", "Fehlende Database")
  EndIf
  
  
  ;{ FERTIG
  ; #Zuerst den Record aufrufen
  ; ===========
  ; ListIcon_FocusReset()
  DatabaseFile$ = Kopie_Base_File$
  ; ===========
  Datenbank_Wahl()
  ; ===========
  ;Rettung
  ListIconZeile = Rtg_ListIconzeile
  ; ===========
  ; Key
  Datenbank_Key()
  ; ===========
  ; #Zuerst den Record aufrufen
  ListIcon_FocusSet()
  ;}
  
EndProcedure
Gruss ... Velindos
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: SQLite kopieren

Beitrag von mk-soft »

Die Ziel-Datenbank wird immer noch ständig geöffnet und geschlossen...

Dann vielleicht noch die Daten direkt übergeben

Code: Alles auswählen

...
DatabaseQuery(Source, "Select * From Velindos WHERE ID ="+ ListIcon_Record$)
While NextDatabaseRow(Source)
  ...
  SetDatabaseString(Target , 0, GetDatabaseString(Source,1))
  SetDatabaseString(Target , 1, GetDatabaseString(Source,2))
  SetDatabaseString(Target , 2, GetDatabaseString(Source,3))
  SetDatabaseString(Target , 3, GetDatabaseString(Source,3))
  ...
  SQL = "Insert Into Velindos (Stichwort, Notiz, Pfad, Genre, myBild, Ordner, Codec, Source, Artikel) Values "
  SQL + " (?,?,?,?,?,?,?,?,?);"
  ; INSERT BASE
  If DatabaseUpdate(Target, SQL)
    Debug "Datensatz eingefügt"
  EndIf
  ...
Wend
...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: SQLite kopieren

Beitrag von Velindos »

Hallo,
habe die Sache eingefügt. Er überträgt die Sätze, wenn ich die Base mit SQL Manager nachsehe, sehe ich ein Bild! und die einzelnen Datensätze.

Wenn ich jedoch mit dem Velindos zugreife bekommt er keine Bild mehr und stürzt!

Code: Alles auswählen

Procedure Datenbank_Kopie()
  Protected Target = 2
  Protected Source = 1
  Protected Bildspalte = 5
  Protected SQL.s
  
  Protected LoopZeiger = 0
  Protected Aktueller_Base_Verezichniss$
  Protected Aktueller_Base_Name$
  Protected Kopie_Base_Name$
  Protected Kopie_Base_File$
  Protected Recordzeiger
  ; --------------------------------
  ; #Zuerst den Record aufrufen
  ListIcon_FocusReset()
  ; --------------------------------
  ;{ Neue Base anlegen
  Aktueller_Base_Verezichniss$ = GetPathPart(DatabaseFile$)
  ; ------------------------------
  ; Database FileName
  Aktueller_Base_Name$ = GetFilePart(DatabaseFile$,#PB_FileSystem_NoExtension)
  ; ------------------------------
  ; Filenamen kopieren
  Kopie_Base_Name$ = Aktueller_Base_Name$ + "_Kopie.db"
  ; ------------------------------
  ; Base File
  Kopie_Base_File$ = Aktueller_Base_Verezichniss$ + Kopie_Base_Name$
  ; ------------------------------
  ; Neue Base Anlegen
  Datenbank_Anlegen(Kopie_Base_File$)
  ; ************* 
  ;Rettung
  Rtg_ListIconzeile = ListIconZeile
  ;}
  ; ************* 
  If OpenDatabase(Source, DatabaseFile$, "", "", #PB_Database_SQLite)
    If OpenDatabase(Target, Kopie_Base_File$, "", "", #PB_Database_SQLite)
      ;PRAGMA schema.journal_mode = DELETE | TRUNCATE | PERSIST | MEMORY | WAL | OFF
      sql.s="PRAGMA journal_mode = MEMORY"
      DatabaseUpdate(Target,sql)
      Debug DatabaseError()
      DatabaseUpdate(Target,"begin transaction")
      
      ;{ SQLite KOPIEREN
      For Recordzeiger = 0 To WahlLetzter-1
        ;{ Record Zähler einrichten
        ListIcon_Record$ = GetGadgetItemText(#Work_L_ListIcon,Recordzeiger,ListIconSpalteRecord)
        ;}
        Debug "Recordzeiger= "+Recordzeiger
        ;{ BASE lesen
        DatabaseQuery(Source, "Select * From Velindos WHERE ID ="+ ListIcon_Record$)
        While NextDatabaseRow(Source)
          
          SetDatabaseString(Target , 0, GetDatabaseString(Source,1))
          SetDatabaseString(Target , 1, GetDatabaseString(Source,2))
          SetDatabaseString(Target , 2, GetDatabaseString(Source,3))
          SetDatabaseString(Target , 3, GetDatabaseString(Source,4))
          SetDatabaseString(Target , 4, GetDatabaseString(Source,5))
          SetDatabaseString(Target , 5, GetDatabaseString(Source,6))
          SetDatabaseString(Target , 6, GetDatabaseString(Source,7))
          SetDatabaseString(Target , 7, GetDatabaseString(Source,8))
          SetDatabaseString(Target , 8, GetDatabaseString(Source,9))
          SetDatabaseString(Target , 9, GetDatabaseString(Source,10))
        Wend
        
        ; ------------------------------------------------
        ;}
        ;{ FOCUS
        ;Zeiger  setzen
        SendMessage_(GadgetID(#Work_L_ListIcon),#LVM_ENSUREVISIBLE,ListIconZeile,0)   
        ; FOCUS auf Zeile
        SetGadgetState(#Work_L_ListIcon, ListIconZeile)
        ; Aktivited
        SetActiveGadget(#Work_L_ListIcon)
        ;}
        
        
        ;{ BASE schreiben
        ; ************* 
        ; ************* 
        ; Bild laden
        ; SetDatabaseBlob(Target, 0, *ImageMemory, MemSize)
        ; ************* 
        ; SQL String new
        ;           SQL = "Insert Into Velindos (Stichwort, Notiz, Pfad, Genre, myBild, Ordner, Codec, Source, Artikel) Values "
        ;           SQL + " ('"+Read_STICHWORT$+"','"+Read_NOTIZ$+"','"+Read_PFAD$+"','"+Read_GENRE$+"',?,'"+Read_Ordner$+"','"+Read_Codec$+"','"+Read_Source$+"','"+Read_Artikel$+"');"
        SQL = "Insert Into Velindos (Stichwort, Notiz, Pfad, Genre, myBild, Ordner, Codec, Source, Artikel) Values "
        SQL + " (?,?,?,?,?,?,?,?,?);"
        ; INSERT BASE
        If DatabaseUpdate(Target, SQL)
          Debug "Datensatz eingefügt"
        EndIf
        ; FreeMemory
        ; FreeMemory(*ImageMemory)
        
        ;}
      Next
      ;}
      ; ************* 
    Else
      MessageRequester("Database", "Fehlende Database")
    EndIf
    DatabaseUpdate(Target,"commit")
    CloseDatabase(Target)
    
    
    FinishDatabaseQuery(Source)
    CloseDatabase (Source)
  Else
    Debug DatabaseError()
    MessageRequester("Database", "Fehlende Database")
  EndIf
  
  
  ;{ FERTIG
  ; #Zuerst den Record aufrufen
  ; ===========
  ; ListIcon_FocusReset()
  DatabaseFile$ = Kopie_Base_File$
  ; ===========
  Datenbank_Wahl()
  ; ===========
  ;Rettung
  ;ListIconZeile = Rtg_ListIconzeile
  ListIconZeile = DataWahlLetzter
  ; ===========
  ; Key
  Datenbank_Key()
  ; ===========
  ; #Zuerst den Record aufrufen
  ListIcon_FocusSet()
  ;}
  
EndProcedure
Gruss ... Velindos
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: SQLite kopieren

Beitrag von mk-soft »

Für das Bild nicht Set/GetDatabaseString, sondern Set/GetDatabaseBlob

Eben auf die schnelle...

P.S.
Und natürlich alles was zum 'Blob' dazugehört...
AllocateMemory, etc
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: SQLite kopieren

Beitrag von Velindos »

Hallo,

habe die Sache eingefügt, funzt nicht!

Update: Wurde geändert

Code: Alles auswählen

Procedure Datenbank_Kopie()
  ;{ BASE mit Bild kopieren
  Protected Target = 2
  Protected Source = 1
  Protected Bildspalte = 5
  Protected SQL.s
  
  Protected LoopZeiger = 0
  Protected Aktueller_Base_Verezichniss$
  Protected Aktueller_Base_Name$
  Protected Kopie_Base_Name$
  Protected Kopie_Base_File$
  Protected Recordzeiger
  ; --------------------------------
  ; #Zuerst den Record aufrufen
  ListIcon_FocusReset()
  ; --------------------------------
  ;}
  ;{ Neue Base anlegen
  Aktueller_Base_Verezichniss$ = GetPathPart(DatabaseFile$)
  ; ------------------------------
  ; Database FileName
  Aktueller_Base_Name$ = GetFilePart(DatabaseFile$,#PB_FileSystem_NoExtension)
  ; ------------------------------
  ; Filenamen kopieren
  Kopie_Base_Name$ = Aktueller_Base_Name$ + "_Kopie.db"
  ; ------------------------------
  ; Base File
  Kopie_Base_File$ = Aktueller_Base_Verezichniss$ + Kopie_Base_Name$
  ; ------------------------------
  ; Neue Base Anlegen
  Datenbank_Anlegen(Kopie_Base_File$)
  ; *************
  ;Rettung
  Rtg_ListIconzeile = ListIconZeile
  ;}
  ; *************
  If OpenDatabase(Source, DatabaseFile$, "", "", #PB_Database_SQLite)
    If OpenDatabase(Target, Kopie_Base_File$, "", "", #PB_Database_SQLite)
      ;PRAGMA schema.journal_mode = DELETE | TRUNCATE | PERSIST | MEMORY | WAL | OFF
      sql.s="PRAGMA journal_mode = MEMORY"
      DatabaseUpdate(Target,sql)
      Debug DatabaseError()
      DatabaseUpdate(Target,"begin transaction")
      ; *************
      ;{ SQLite KOPIEREN
      For Recordzeiger = 0 To WahlLetzter-1
        ;{ Record Zähler einrichten
        ListIcon_Record$ = GetGadgetItemText(#Work_L_ListIcon,Recordzeiger,ListIconSpalteRecord)
        ;}
        Debug "Recordzeiger= "+Recordzeiger
        ;{ BASE lesen
        DatabaseQuery(Source, "Select * From Velindos WHERE ID ="+ ListIcon_Record$)
        While NextDatabaseRow(Source)
          ; ------------------------------------------------
          SetDatabaseString(Target , 0, GetDatabaseString(Source,1))
          SetDatabaseString(Target , 1, GetDatabaseString(Source,2))
          SetDatabaseString(Target , 2, GetDatabaseString(Source,3))
          SetDatabaseString(Target , 3, GetDatabaseString(Source,4))
          
          SetDatabaseString(Target , 5, GetDatabaseString(Source,6))
          SetDatabaseString(Target , 6, GetDatabaseString(Source,7))
          SetDatabaseString(Target , 7, GetDatabaseString(Source,8))
          SetDatabaseString(Target , 8, GetDatabaseString(Source,9))
          SetDatabaseString(Target , 9, GetDatabaseString(Source,10))
          ; ------------------------------------------------
          ; Bild
          If DatabaseColumnType(Source, Bildspalte) = #PB_Database_Blob
            MemSize = DatabaseColumnSize(Source,Bildspalte)
            If MemSize
              ; AllocateMemory
              *ImageMemory = AllocateMemory(MemSize)
              Debug "MemSize= "+MemSize
              ; Memory
              If *ImageMemory
                If GetDatabaseBlob(Source, Bildspalte, *ImageMemory,MemSize)
                  ; --------------------------------
                  Debug "LoopZeiger= " +LoopZeiger
                Else
                  Debug "GetDatabaseBlob ist fehlgeschlagen"
                EndIf
                ;FreeMemory(*ImageMemory)
              Else
                Debug "Nicht genügend Speicher vorhanden"
              EndIf
            Else
              Debug "picsize is null"
            EndIf
          Else
            Debug "DatabaseColumnType(0, 1) ist kein Blob"
          EndIf
          ; ------------------------------------------------
          
          
        Wend
        
        ; ------------------------------------------------
        ;}
        ; *************
        ;{ FOCUS
        ;Zeiger  setzen
        SendMessage_(GadgetID(#Work_L_ListIcon),#LVM_ENSUREVISIBLE,ListIconZeile,0)   
        ; FOCUS auf Zeile
        SetGadgetState(#Work_L_ListIcon, ListIconZeile)
        ; Aktivited
        SetActiveGadget(#Work_L_ListIcon)
        ;}
        ; *************
        ;{ BASE schreiben
        ; *************
        ; SQL String new
        ;           SQL = "Insert Into Velindos (Stichwort, Notiz, Pfad, Genre, myBild, Ordner, Codec, Source, Artikel) Values "
        ;           SQL + " ('"+Read_STICHWORT$+"','"+Read_NOTIZ$+"','"+Read_PFAD$+"','"+Read_GENRE$+"',?,'"+Read_Ordner$+"','"+Read_Codec$+"','"+Read_Source$+"','"+Read_Artikel$+"');"
        SQL = "Insert Into Velindos (Stichwort, Notiz, Pfad, Genre, myBild, Ordner, Codec, Source, Artikel) Values "
        SQL + " (?,?,?,?,?,?,?,?,?);"
        ; *************
        ; Bild laden
        SetDatabaseBlob(Target, 4, *ImageMemory, MemSize)
        ; *************
        ; INSERT BASE
        If DatabaseUpdate(Target, SQL)
          Debug "Datensatz eingefügt"
        EndIf
        ; FreeMemory
        ; FreeMemory(*ImageMemory)
        
        ;}
      Next
      ;}
      ; *************
    Else
      MessageRequester("Database", "Fehlende Database")
    EndIf
    ; *************
    ; Finish TARGET
    DatabaseUpdate(Target,"commit")
    CloseDatabase(Target)
    ; *************
    ; Finish SOURCE
    FinishDatabaseQuery(Source)
    CloseDatabase (Source)
  Else
    Debug DatabaseError()
    MessageRequester("Database", "Fehlende Database")
  EndIf
  ; *************
  ;{ FERTIG
  ; #Zuerst den Record aufrufen
  ; ===========
  ; ListIcon_FocusReset()
  DatabaseFile$ = Kopie_Base_File$
  ; ===========
  Datenbank_Wahl()
  ; ===========
  ;Rettung
  ;ListIconZeile = Rtg_ListIconzeile
  ListIconZeile = DataWahlLetzter
  ; ===========
  ; Key
  Datenbank_Key()
  ; ===========
  ; #Zuerst den Record aufrufen
  ListIcon_FocusSet()
  ;}
EndProcedure
Gruss ... Velindos
Zuletzt geändert von Velindos am 07.11.2017 07:40, insgesamt 1-mal geändert.
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: SQLite kopieren

Beitrag von mk-soft »

Code: Alles auswählen

; Bild laden
         SetDatabaseBlob(Target, 0, *ImageMemory, MemSize)
        ; *************
Müsste das nicht Index 4 sein? 'SetDatabaseBlob(Target, 4, *ImageMemory, MemSize)'
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: SQLite kopieren

Beitrag von Velindos »

Hallo,
Danke, stimmt! War woll schon genug. Nun habe die Sache geändert wie vorab und die Funzt!

Etwas schneller, jedoch der Focus kommt nicht zur Anzeige.

Gruss ... Velindos
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: SQLite kopieren

Beitrag von mk-soft »

Jetzt noch das kopieren in einen Thread verlagern und per Postevent den Status an das Hauptprogramm senden.

Somit hängt sich das Fenster nicht auf, 'Programm reagiert nicht'.
Aber verhindern das der Thread nicht zwei mal gestartet werden kann...

P.S. Wenn die Tabelle auch Einträge hat die nicht als String definiert sind, sollte man diese auch nicht String übernehmen.
Dafür gibt es noch Set/GetDatabase[Long,Float, etc]. Somit spart man die Zeit zum umwandeln zu einen String und wieder zurück.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten