Seite 1 von 2

SQLite Blob Feld aus Datei füllen

Verfasst: 30.01.2013 11:41
von double7
HAllo,

das Thema ist nicht neu, mir sind die anderen Foren Artikel auch bekannt, jedoch schein ich irgendein Detail zu übersehen.

Ich habe eine kleine Funktion, die eine Datei auslesen und diese als Blob in die DB schreiben soll. Ich habe 5 Binär Dateien.
Mit einer Datei funktioniert es immer, mit den anderen nie :?

Aus Copyrightgründen darf ich leider diese Dateien hier nicht angeben. Im folgenden aber ein kleiner Auszug aus meinem Source:

Code: Alles auswählen

Structure Binary
	buffer.l
	size.l
EndStructure

Enumeration #PB_Compiler_EnumerationValue
  #database
  #binfile
EndEnumeration
;--------------------------------- import binary from file to database
Procedure ImportBin()
	Protected xxxbin.binary
	Protected File.s
	Protected maxid.l

	maxid=0
	
	File = OpenFileRequester("Bitte Datei zum Laden auswählen","","Binary (*.bin)|*.bin",0)
	If File
  		If ReadFile(#binfile,file)
  		xxxbin\size=Lof(#binfile)
 		xxxbin\buffer=AllocateMemory(xxxbin\Size)
 		ReadData(#binfile,xxxbin\buffer,xxxbin\size) 			
 			 			 			
 		If DatabaseQuery(#database, "SELECT max(idnr) FROM bin")      
	    		NextDatabaseRow(#database)
	     		maxid=GetDatabaseLong(#database,0)     
     			FinishDatabaseQuery(#database)
	    	EndIf

    		SetDatabaseBlob(#Database,0,xxxbin\buffer,xxxbin\Size)
 			If DatabaseUpdate(#Database,"insert into bin (idnr,binary,info) values ("+Str(maxid+1)+", ?,'"+GetFilePart(file)+"');")
	  		MessageRequester("Info",GetFilePart(file)+" wurde erfolgreich importiert!",#MB_ICONINFORMATION)
 			Else
	  		MessageRequester("Fehler",DatabaseError(),#MB_ICONERROR)
 			EndIf		
 			FreeMemory(xxxbin\buffer)
 			CloseFile(#binfile)  
  	EndIf
 EndIf	
EndProcedure
Ein neuer Datensatz wird in die DB geschrieben, jedoch bleibt bei 4/5 der Dateien das Blob Feld leer. Zugriffsrechte auf Filesystemebene sind vorhanden.
An der Größe der Dateien liegt es wahrscheinlich auch nicht, da diese nur ein paar kb groß sind und die, bei der es funktioniert, am größten ist.
Ich scheine gerade den Wald vor lauter Bäumen nicht zu sehen. :(

Ich wäre dankbar für jeden Hinweis :)

PS: ich benutze die Struktur aus diversen Gründen, der Code hier ist jedoch runter gebrochen auf das Nötigste.

Re: SQLite Blob Feld aus Datei füllen

Verfasst: 30.01.2013 11:59
von Kiffi
auf die Schnelle würde ich sagen, dass StatementIndex bei SetDatabaseBlob() auf 1 gesetzt werden muss.

Du speicherst ja 3 Werte: idnr, binary und info

binary liegt hier auf Position 1

Grüße ... Kiffi

Re: SQLite Blob Feld aus Datei füllen

Verfasst: 30.01.2013 12:07
von double7
Das würde aber mit dem Beispiel aus der Hilfedatei nicht überein stimmen, da ist der Statementindex die Angabe, um welches Blob es sich handelt:

SetDatabaseBlob(0, 0, ?Picture, PictureLength)
SetDatabaseBlob(0, 1, ?SmallPicture, SmallPictureLength)
DatabaseUpdate(0, "INSERT INTO PHOTOS (picture, name, small_picture) values (?, 'my description', ?);")

Dann müsste ?SmallPicture den Statementindex 3 bekommen oder seh ich das falsch ? :?


Nachtrag: ich habe es mit dem anderen Index getestet. Dadurch bekomme ich aber nichts mehr in die DB

Re: SQLite Blob Feld aus Datei füllen

Verfasst: 30.01.2013 12:21
von Kiffi
double7 hat geschrieben:Dann müsste ?SmallPicture den Statementindex 3 bekommen oder seh ich das falsch ? :?
nee, da hast Du recht. Habe ich in der Hilfe falsch gelesen. Ich probier das mal hier aus...

Grüße ... Kiffi

Re: SQLite Blob Feld aus Datei füllen

Verfasst: 30.01.2013 12:40
von double7
Ich danke Dir Kiffi, auf Dich ist seit Jahren schon immer Verlass :allright:

Re: SQLite Blob Feld aus Datei füllen

Verfasst: 30.01.2013 12:58
von Kiffi
ich habe Deinen Schnippsel hier auf meinem Rechner mal lauffähig gemacht.
Funktioniert ohne Probleme. Ich kann beliebige Dateien der Tabelle hinzufügen.

Wie kontrollierst Du, dass das Blob-Feld leer ist? Hast Du Dir die Größe des
entsprechenden Feldes testweise mal mit DatabaseColumnSize() ausgeben
lassen?

Poste ansonsten mal die Felddefinitionen der bin-Tabelle.

Grüße ... Kiffi

Re: SQLite Blob Feld aus Datei füllen

Verfasst: 30.01.2013 13:36
von double7
Du bist spitze. :praise:

Ich vertraue leider externen Tools mehr als meinen eigenen Code. Es läuft alles wie gewollt.

Die Überprüfung der Inhalte habe ich immer mit dem SQLite Database Browser 2.01 gemacht. Dieser scheint jedoch einen Bug bei Blob Feldern zu haben, so dass diese nicht immer korrekt angezeigt werden.

Das wieder auslesen der Datenbank aus meinem Code heraus ergab die richtige Größe des Inhalts :lol:

Ich habe einen halben Tag und Deine Zeit verschwendet mit einem Fehler, den es nicht gibt. Sorry >_<

Naja, dafür gibts jetzt einen neuen Code Schnipsel für die Nachwelt.

Beste Grüße 77

Re: SQLite Blob Feld aus Datei füllen

Verfasst: 30.01.2013 13:44
von bobobo
hatte das auch mal getestet (winxp32) und alles rannte wie es sollte

Ich benutze zu Betrachten der DB den ollen sqliteman, weil der u.a. auch gut mit Blobsen umgehen kann
(z.B. speichern als .. )

Tipp: Wenn die DB mit

Code: Alles auswählen

CREATE TABLE [bin] ([idnr] INTEGER  Not NULL PRIMARY KEY,[binary] Blob  NULL,[Info] varchar(255)  NULL)
erzeugt wird, kannst Du getrost auf die Ermittlung der nächsten ID und die Angabe im InsertString verzichten.

Re: SQLite Blob Feld aus Datei füllen

Verfasst: 30.01.2013 13:50
von double7
Danke für den SQLiteman Tipp. Den werde ich gleich mal testen :allright:

Die Ermittlung des max Schlüsselwertes mache ich, damit ich kompatibel zu diversen Datenbanken bin. Entwickelt wird erstmal mit der SQLite, das Programm soll später aber auch mit ODBC oder nativ Oracle / MSSQL funktionieren. Ich gehe dann lieber etwas umständlichere Schritte, spare mir dafür aber später Zeit :)

Re: SQLite Blob Feld aus Datei füllen

Verfasst: 30.01.2013 14:35
von Kiffi
double7 hat geschrieben:[...] und Deine Zeit verschwendet mit einem Fehler, den es nicht gibt. Sorry >_<
kein Thema. :-)

Grüße ... Kiffi