SQLite Blob Feld aus Datei füllen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
double7
Beiträge: 55
Registriert: 20.09.2004 00:40
Kontaktdaten:

SQLite Blob Feld aus Datei füllen

Beitrag 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.
Zuletzt geändert von double7 am 30.01.2013 12:08, insgesamt 1-mal geändert.
[0d1n6 15 n07 @ j0b 17´5 |1f357y|3
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: SQLite Blob Feld aus Datei füllen

Beitrag 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
a²+b²=mc²
Benutzeravatar
double7
Beiträge: 55
Registriert: 20.09.2004 00:40
Kontaktdaten:

Re: SQLite Blob Feld aus Datei füllen

Beitrag 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
[0d1n6 15 n07 @ j0b 17´5 |1f357y|3
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: SQLite Blob Feld aus Datei füllen

Beitrag 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
a²+b²=mc²
Benutzeravatar
double7
Beiträge: 55
Registriert: 20.09.2004 00:40
Kontaktdaten:

Re: SQLite Blob Feld aus Datei füllen

Beitrag von double7 »

Ich danke Dir Kiffi, auf Dich ist seit Jahren schon immer Verlass :allright:
[0d1n6 15 n07 @ j0b 17´5 |1f357y|3
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: SQLite Blob Feld aus Datei füllen

Beitrag 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
a²+b²=mc²
Benutzeravatar
double7
Beiträge: 55
Registriert: 20.09.2004 00:40
Kontaktdaten:

Re: SQLite Blob Feld aus Datei füllen

Beitrag 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
[0d1n6 15 n07 @ j0b 17´5 |1f357y|3
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: SQLite Blob Feld aus Datei füllen

Beitrag 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.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
double7
Beiträge: 55
Registriert: 20.09.2004 00:40
Kontaktdaten:

Re: SQLite Blob Feld aus Datei füllen

Beitrag 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 :)
[0d1n6 15 n07 @ j0b 17´5 |1f357y|3
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: SQLite Blob Feld aus Datei füllen

Beitrag von Kiffi »

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

Grüße ... Kiffi
a²+b²=mc²
Antworten