SQLite Blob Feld aus Datei füllen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: SQLite Blob Feld aus Datei füllen

Beitrag von bobobo »

double7 hat geschrieben: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 :)

wennze meins.

So ein selbstlaufender Index ist aber eigentlich überall Standard. Wenn nicht, isses eigentlich auch kein DBMS was man
nutzen möchte.

Sobald Du andere Datenbanken benutzt, wirst Du die SQL-Syntax vermutlich eh etwas angleichen müssen.
Die SQL-Syntax sollte zwar Standard sein, isses aber wie soviele Standards dann am Ende doch nicht so ganz.
Auch wie da was gespeichert wird ist durchaus nicht konsistent.
Gerade SQLite ist hier z.B. typenlos. Du kannst also durchaus Texte in Integer-felder hinterlegen.
Das sollte man nicht tun, kann man aber. Auch aus Versehen. Oder boshafter Absicht. :twisted:
Es gibt externe tools, die sowas dann wiederum nahezu korrekterweise als 0 darstellen 'Sqlite Administrator' oder eben
als Text (sqliteman kennt auch solche eigentlich verqueren Inhalte).

Code: Alles auswählen

CreateFile(0,"D:\h2g2.db3")
CloseFile(0)
UseSQLiteDatabase()
OpenDatabase(0,"D:\h2g2.db3","","",#PB_Database_SQLite)
DatabaseUpdate(0,"create table whatever (inh Integer)")
try.s=DatabaseError()
If tryold.s<>try
  Debug "Error "+try
  tryold=try
EndIf

DatabaseUpdate(0,"Insert into whatever values('die Antwort auf die Frage nach dem Leben, dem Universum und dem ganzen Rest.');")
try.s=DatabaseError()
If tryold.s<>try
  Debug "Error "+try
  tryold=try
EndIf
DatabaseUpdate(0,"Insert into whatever values(42);")
try.s=DatabaseError()
If tryold.s<>try
  Debug "Error "+try
  tryold=try
EndIf

DatabaseQuery(0,"select * from whatever")
While NextDatabaseRow(0)
  Debug GetDatabaseString(0,0) ;Man kann Integer auch als String auslesen
Wend
FinishDatabaseQuery(0)
CloseDatabase(0)
[/size]
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: SQLite Blob Feld aus Datei füllen

Beitrag von NicTheQuick »

Und jetzt mal noch wegen ein paar anderen Fehlern in deinem Code.

- Korrekt einrücken wäre schon mal schön für alle Helfer hier.
- buffer sollte kein Long sein, sondern ein Pointer oder eben Integer.
- Database und File teilen sich die IDs nicht, sondern sind eigenständig, also Enumeration teilen.
- EnableExplicit ist auch sehr praktisch um nicht den Überblick über Variablen und deren Typung zu verlieren

Das würde dann so aussehen. :)

Code: Alles auswählen

EnableExplicit

Structure Binary
	*buffer
	size.l
EndStructure

Enumeration
	#database
EndEnumeration

Enumeration
	#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
Benutzeravatar
double7
Beiträge: 55
Registriert: 20.09.2004 00:40
Kontaktdaten:

Re: SQLite Blob Feld aus Datei füllen

Beitrag von double7 »

Korrekt einrücken wäre schon mal schön für alle Helfer hier.
Definitiv, sorry, ich stehe mit dem Tabulator und diesem Webinterface etwas auf dem Kriegsfuß :)

Buffer sollte kein Long sein, sondern ein Pointer oder eben Integer.
Ja, der Rückgabewert von AllocateMemory ist ein Pointer, aber mal ne dumme Frage, in 32 Bit Systemen verbraucht ein Pointer 4 Bytes, ist also equivalent zu einem long Typ, oder?

Database und File teilen sich die IDs nicht, sondern sind eigenständig, also Enumeration teilen.
Wurde in dem Beispiel zusammen gefasst, um Platz zu sparen. Wo liegt denn eigentlich das Maximum? Wenn es bei ein paar tausend liegt ist es doch egal ob man die unterschiedlichen Pools trennt,oder? Klar, man Programmiert sauberer, aber für kleine Projekte wäre es unbedeutend.

EnableExplicit ist auch sehr praktisch um nicht den Überblick über Variablen und deren Typung zu verlieren
ja, steht bei mir im Hauptprogramm :) Ist auch der Faulheit in diesem Beispiel zum Opfer gefallen :roll:
[0d1n6 15 n07 @ j0b 17´5 |1f357y|3
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: SQLite Blob Feld aus Datei füllen

Beitrag von ts-soft »

Zu Buffer:
In PB gibt es einen Extra Datentype Integer, der auf 32- und 64-Bit Systemen die richtige grösse hat. Dieser sollte auch
verwendet werden, um eine 64-Bit Kompatibilität zu erhalten.

Zu Enumerationen:
Enumeration verschiedener Objekte sollte jede für sich mit 0 beginnen, um Speicherplatz zu sparen. Im Falle von 2 Objekten
mit je einer ID spielt es sicher keine grosse Rolle, aber beispielhafter Code ist hier eher willkommen, um auch den ganzen
Einsteigern gerecht zu werden. Ein bißchen Vorbild ist immer gut :wink:

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
double7
Beiträge: 55
Registriert: 20.09.2004 00:40
Kontaktdaten:

Re: SQLite Blob Feld aus Datei füllen

Beitrag von double7 »

Touché !

Deine Argumente sind überzeugend :mrgreen:
[0d1n6 15 n07 @ j0b 17´5 |1f357y|3
Antworten