Seite 2 von 2

Re: SQLite Blob Feld aus Datei füllen

Verfasst: 30.01.2013 16:43
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]

Re: SQLite Blob Feld aus Datei füllen

Verfasst: 30.01.2013 17:50
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

Re: SQLite Blob Feld aus Datei füllen

Verfasst: 31.01.2013 11:48
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:

Re: SQLite Blob Feld aus Datei füllen

Verfasst: 31.01.2013 12:40
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

Re: SQLite Blob Feld aus Datei füllen

Verfasst: 31.01.2013 13:10
von double7
Touché !

Deine Argumente sind überzeugend :mrgreen: