SQLite Blob (Speicherfehler?)
Verfasst: 18.02.2013 17:57
Hallo,
ich habe mit PB5.1 eine Datenbank von Darstellerbildern(Actors). Jeder Actor gehört einem Ensemble an.
Nun lade ich die Bilder in die Datenbank und zeige sie an. Das klappt wie gewünscht. Nur: Nach dem Laden eines neuen Darstellers mit 'loadActor' treten die Probleme auf, obwohl das Bild richtig in die DB kommt und auch von dort korrekt angezeigt wird:
1. Übersetze ich das PB-Programm noch einmal, antwortet der Debugger nicht.
2. Nach Beenden von PB treten im gesamten Windows Vista unerklärlich lange Ladezeiten bei allen Programmen auf.
Kurzum: Das riecht nach einem Speicherzuordnungsfehler. Ich finde ihn aber trotz tagelangen Suchens nicht!
Den Code von 'loadActor' habe ich nach dem SQLITE3-Einsteigertutorial von TS-Soft erstellt und m.E. auch verstanden.
Wo ist der Fehler?
ich habe mit PB5.1 eine Datenbank von Darstellerbildern(Actors). Jeder Actor gehört einem Ensemble an.
Nun lade ich die Bilder in die Datenbank und zeige sie an. Das klappt wie gewünscht. Nur: Nach dem Laden eines neuen Darstellers mit 'loadActor' treten die Probleme auf, obwohl das Bild richtig in die DB kommt und auch von dort korrekt angezeigt wird:
1. Übersetze ich das PB-Programm noch einmal, antwortet der Debugger nicht.
2. Nach Beenden von PB treten im gesamten Windows Vista unerklärlich lange Ladezeiten bei allen Programmen auf.
Kurzum: Das riecht nach einem Speicherzuordnungsfehler. Ich finde ihn aber trotz tagelangen Suchens nicht!
Den Code von 'loadActor' habe ich nach dem SQLITE3-Einsteigertutorial von TS-Soft erstellt und m.E. auch verstanden.
Wo ist der Fehler?
Code: Alles auswählen
Procedure.i getEnsembleID()
;Bestimmt die ID des gerade aktuellen Ensembles
Protected EnsembleName.s,EnsembleID.i,DBQuery.s
UseGadgetList(WindowID(#ActorsWin))
EnsembleName=GetGadgetText(#SelEnsembleGad)
DBQuery="SELECT EnsID,EnsName FROM ensembles WHERE EnsName = "+"'"+EnsembleName+"'"
If DatabaseQuery(#Databasenum,DBQuery)
If NextDatabaseRow(#Databasenum)
EnsembleID=Val(GetDatabaseString(#Databasenum,0))
;MessageRequester(Ensemblename+" "+GetDatabaseString(#Databasenum,0),"")
EndIf
Else
EnsembleID=0
EndIf
FinishDatabaseQuery(#Databasenum)
ProcedureReturn EnsembleID
EndProcedure
Procedure loadActor(ActWin.i)
; Lade ein neues Bild ins Actorfenster
;nach TS-Soft:SQLITE3-Einsteigertutorial
Protected Filename.s,ImNr.i,ImResizedNr.i,ImCopyNr.i,ImGadget.i,TBHeight.i,DBQuery.s,ActTypes.s,EnsembleName.s,EnsembleID.i
Protected *mem, size.q,id.i, item
Static DefaultFile.s
;Hier später noch andre Datentypen
ActTypes="(*.bmp,*.jpg,*.tiff,*.png,*.tga)|*.bmp;*.jpg;*.tiff;*.png;*.tga|All Files (*.*)|*.*"
FileName = OpenFileRequester("Open Image", DefaultFile, ActTypes, 0)
;Option #PB_Requester_MultiSelection) noch nicht, weil anders auswerten
;Filename steht zunächst Pfad+Name
DefaultFile = FileName
EnsembleID=getEnsembleID()
If ReadFile(0, Filename)
size = Lof(0)
If size
*mem = AllocateMemory(size)
If *mem
ReadData(0, *mem, size)
; SetDatabaseBlob bereitet die Daten für unseren DatabaseUpdate vor.
; Der zweite parameter ist nicht die Spalte (row), sondern der Index des Statements,
; also der wievielte Blob (das wievielte Fragezeichen). Dieser Index beginnt bei 0!
SetDatabaseBlob(#Databasenum, 0, *mem, size)
DBQuery= "INSERT INTO actors (ActName,Ensemble,ActData) VALUES ("
DBQuery=DBQuery+ "'"+GetFilePart(Filename) +"',"+"'"+ Str(EnsembleID)+"', ?)"
If DatabaseUpdate(#Databasenum, DBQuery)
If DatabaseQuery(#Databasenum, "SELECT last_insert_rowid()")
NextDatabaseRow(#Databasenum)
id = GetDatabaseLong(#Databasenum, 0)
FinishDatabaseQuery(#Databasenum)
item = CountGadgetItems(#ActorsListIcon)
AddGadgetItem(#ActorsListIcon, item, ""+Chr(10)+Str(id)+Chr(10)+GetFilePart(Filename))
SetGadgetItemData(#ActorsListIcon, item, id)
;Bild anzeigen
;SetGadgetState(#ActorsListIcon, item)
;ZeigeBild(id)
EndIf
EndIf
FinishDatabaseQuery(#Databasenum)
Else
Debug DatabaseError()
EndIf
FreeMemory(*mem)
EndIf
EndIf
CloseFile(0)
;showActors(GetGadgetText(#SelEnsembleGad))
EndProcedure