BLOB-Felder mit der mysql.h C-API
-
Moin,
ich stehe gerade vor dem Problem, Daten in ein BLOB-Feld einer MySQL-DB zu speichern.
Das sollen jetzt Bilder, Word-Docs, PDFs oder sonstwas sein, also irgendwelche Datein. Meine Frage ist nun: Wie stelle ich das Senden der Datei über eine Query an?normalerweise geht das ja mit "insert into table values('tolles value');". wie ist das jetzt bei Datein? Muss ich die Datei ins RAM laden und als char* in die Query übergeben?
Wenn ja: BLOBs können ja bis zu 4GB groß werden. Nicht das ich so was benötige, aber wie würde man solche BLOB-Felder lesen oder schreiben? Hat ja keiner soviel RAM, das die Datei auf anhieb ins RAM passt.
Oder kann ich nen FileStream oder sowas an die Query übergeben?Sollte das mit dem Speichern dann jemals klappen, muss ich die Daten natürlich auch wieder auslesen. Darum meine Frage hinterher: Wie würde das dann laufen, das ich das File wieder als Datei auf Platte bekomme.
Zur info: Dateiinformationen werden in einem extra Feld gespeichert. es geht mir nur um den reinen Dateiinhalt.
Viel spass beim Mitdenken

-
Hallo
Wenn du die BDE mit TTable/TQuery benutzt, kannst du die Mehtoden von TBlobField benutzen :
TTable *Table; TBlobField *BlobField; ... BlobField = dynamic_cast<TBlobField *> (Table->FieldByName(<FeldName>)); if (BlobField != NULL) { BlobField->LoadFromFile(<FileName>); BlobField->SaveToFile(<FileName>); } ...Allerdings hatte ich damit ein Problem, Dateien größer als ca. 1 MByte zu speichern, da der MySQL-Server eine Grenze für die Größe der Befehle hat.
bis bald
akari
-
Die Komponenten benutze ich aber nicht

Hatte mir auch schon überlegt die ganze Datei in einen String zu laden und das als Query zu schicken. Aber wie gesagt finde ich das irgendwie nicht so elegand wenn ich jetzt theoretisch 4GB schicken würde.
Aber wenn ich das jetzt richtig verstehen, macht die Komponente im prinzip genau das (wegen der 1MB Grenze), oder.....
Edit:
Also wäre eine Möglichkeit, das ich ne schleife mache und immer, sagen wir mal, 500kb als query schicke und das an das BLOB-Feld dranhänge... so eine Art Filestream im Eigenbau. Oder gibts noch andere Vorschläge?
-
Hallo
Hatte mir auch schon überlegt die ganze Datei in einen String zu laden und das als Query zu schicken. Aber wie gesagt finde ich das irgendwie nicht so elegand wenn ich jetzt theoretisch 4GB schicken würde.
Aber wenn ich das jetzt richtig verstehen, macht die Komponente im prinzip genau das (wegen der 1MB Grenze), oder.....
Darauf läuft es hinaus. Du machst eine SQL-Anweisung
UPDATE <TableName> WHERE <Condition> SET <FieldName> = '<Dateiinhalt>'<Dateiinhalt> sollte keine Steuerzeichen enthalten, denke ich.
Wegen der Grenze : Die ist bei meinen SQL-Server unter dem Parameter 'max_allowed_packet' eingetragen. Wenn du die ändern kannst (sei bloß vorsichtig) kannst du ja einen höheren Wert eintragen.
Ich bezweifle, das das mit dem Streamen etwas wird. Man kann Felder nur auf einmal ändern, und nichts dranhängen. Oder?bis bald
akari
-
Joa mist.....
Zahle-Felder lassen sich addieren, Strings nicht
Das mit den Steuerzeichen ist kein Problem, dafür gibts ne Funktion mit der ich einen String in einen schönen Query-Konformen String umwandeln kann. An die Datenbank bzw an max_allowed_packet komme ich auch dran, aber so schön finde ich das jetzt noch nicht... naja mal sehen. erstmal wirds so gehen