![]() |
MySQL und Streams bzw. Blobs
Hi Leute,
wie (in drei teufelsnamen :evil: ) kriegt man einen Stream oder ein Blob per SQL in ein Binaryfeld geladen. Ich möchte das, wenns irgendwie geht über ein tquery machen, nicht über ein ttable. Alle bisherigen Suchanfragen zu diesem Problem, haben nicht zu einer befriedigenden Antwort geführt. Hoffentlich könnt ihr mir ein wenig helfen. Danke. |
Hi!
Eigentlich müsste das mit einem BlobStream, der mit dem Blob-Feld verknüpft ist, gehen. Das folgende ist jetzt aus dem Stegreif: (keine Garantie, dass es funkt)
Delphi-Quellcode:
Wie gesagt - ist aus dem Stegreif. Dies ist die BDE-Version - dbExpress funktioniert aber genau so. Mehr dazu in der Hilfe: TBlobStream
function WriteBlob( aDB: TDatabase; aTableName: String; aFileName: String ): Boolean;
var aQuery: TQuery; aBlobStr: TBlobStream; aFileStr: TFileStream; begin aQuery := TQuery.Create( nil ); aQuery.Database := aDB; aQuery.SQL.Add( 'SELECT * FROM '+aTableName+' WHERE Nr=1' ); aQuery.RequestLive := True; // damit können Änderungen in TQuery-Feldern gemacht werden aQuery.Open; aQuery.Edit; aBlobStr := TBlobStream.Create( aQuery.FieldByName('BlobField') ); aFileStr := TFileStream.Create( aFileName, fmOpenRead ); aBlobStr.CopyFrom( aFileStr, aFileStr.Size ); aQuery.Post; aBlobStr.Destroy; aFileStr.Destroy; end; |
Hallo,
wenn ich von Interbase ausgehe, dann geht es per SQL (SQL ohne alles) nicht. 1. Du kannst eine UDF schreiben, die Dein Feld füllt 2. Du kannst eine IBUpdateSQL nehmen und dann auf das Feld mit AsString zugreifen Ich hoffe, es hilft. Lutz |
Nein kein Interbase (zu teuer). Ich nehme MySQL.
Das Beispiel von darkstone hat schon ganz gut geklappt. Allerdings habe ich noch Probleme beim auslesen. Das Funktioniert zwar auch im großen und ganzen, aber nur einmal. Danach bekomme ich den Fehler, das der Datensatz von einem Benutzer geändert wurden, und deshalb das Post nicht gemacht werden kann. Wenn ich das Programm neu starte nützt das nichts, ich muß erst die Datenbank runterfahren und neu starten. Dann gehts wieder einmal. (Ich bin der einzige User im Moment). Wenn da noch einer was weiß...? Der könnte dann so ca. 10000000000 Dankeschöns sein nennen :mrgreen: |
Hallo,
das klingt wie eine nicht abgeschlossene Transaction. Gibt es in MySQL sowas? Wenn ja sollte ein Commit hoffentlich das Problem lösen. Lutz |
Zitat:
|
Interbase in der Version 6 ist auch Freeware und läuft stabil :-)
Lutz |
Aber genau, wie Interbase 6 zu weiterentwickelt wurde, wurde auch Firebird weiterentwickelt!
|
@Delphianer: Ob MySQL Transactionen unterstützt, bin ich mir nicht sicher, aber ich glaube nicht. aber wenn ja, dann nutze ich die nicht bewust.
@All: Ich würde nur ungerne von MySQL auf Interbase oder Firebird umsteigen, weil meine Anwendung und die Datenbank incl. 40 Clients schon beim Kunden läuft, und ich nicht alles wieder umstellen will. Muß doch auch mit MySQL gehen. :mrgreen: |
Hallo,
ich habe gerade mal nachgelesen, MySQL unterstützt Transactions. Es gibt auch irgendwie einen Automodus. Da Dir das noch nicht über den Weg gelaufen ist, hast Du bis jetzt noch nicht mit Queries gearbeitet? Welche Komponenten verwendest Du und wie greifst Du überhaupt auf die Datenbank zu? Eventuell helfen auch die Methoden ApplyUpdates und CommitUpdates von TQuery. Viele Grüße, Lutz |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz