Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi MySQL und Streams bzw. Blobs (https://www.delphipraxis.net/5694-mysql-und-streams-bzw-blobs.html)

Captnemo 16. Jun 2003 06:23


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.

darkstone 16. Jun 2003 07:31

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:
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;
Wie gesagt - ist aus dem Stegreif. Dies ist die BDE-Version - dbExpress funktioniert aber genau so. Mehr dazu in der Hilfe: TBlobStream

Delphianer 16. Jun 2003 11:39

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

Captnemo 16. Jun 2003 11:51

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:

Delphianer 16. Jun 2003 12:39

Hallo,

das klingt wie eine nicht abgeschlossene Transaction. Gibt es in MySQL sowas? Wenn ja sollte ein Commit hoffentlich das Problem lösen.

Lutz

r_kerber 16. Jun 2003 18:53

Zitat:

Zitat von Captnemo
Nein kein Interbase (zu teuer).

Dann nimm doch Firebird. Ist ein Interbase(6.0?!)-Ableger und OpenSource!

Delphianer 16. Jun 2003 19:23

Interbase in der Version 6 ist auch Freeware und läuft stabil :-)

Lutz

r_kerber 16. Jun 2003 19:33

Aber genau, wie Interbase 6 zu weiterentwickelt wurde, wurde auch Firebird weiterentwickelt!

Captnemo 16. Jun 2003 19:53

@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:

Delphianer 16. Jun 2003 20:24

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

Captnemo 16. Jun 2003 20:33

Das ist in der Tat mein erstes reinrassiges SQL-Projekt. Auf die Datenbank greife ich über ODBC -> TDatabase -> TQuery zu. Ich will das ganze vielleicht noch umstellen auf ADO, damit ich die BDE nicht mehr brauch. Aber damit muß ich mich noch auseinandersetzten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:35 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