Einzelnen Beitrag anzeigen

Perlsau
(Gast)

n/a Beiträge
 
#9

AW: Bilddatei aus dem MySQL Blobdfeld laden geht nicht

  Alt 10. Aug 2014, 21:31
Delphi-Quellcode:
// ----- Lädt eine Datei in ein Blob-Feld
Function TDatMod.DateiInBlobFeld(Feld: TField; Datei: String): Boolean;
Var
  S : TStream;
  FileS : TFileStream;

begin
  Result := False;
  If Not FileExists(Datei) Then Exit;
  If Not Feld.IsBlob Then Exit;
  If Not ((Feld.DataSet.State = dsInsert) Or
          (Feld.DataSet.State = dsEdit)) Then Exit;

  S := Feld.DataSet.CreateBlobStream(Feld, bmReadWrite);

  Try
    Try
      FileS := TFileStream.Create(Datei, fmOpenRead);
      S.CopyFrom(FileS, FileS.Size);
      Result := True;
    Except
      on e:exception Do GL.FehlerMeldung := e.Message;
    End;
  Finally
    FileS.Free;
    S.Free;
  End;
end;

// ----- Speichert den Inhalt eines Blob-Feldes in einer Datei
Function TDatMod.BlobFeldInDatei(Feld: TField; Datei: String): Boolean;
Var
  S : TStream;
  FileS : TFileStream;

begin
  Result := False;
  If Not Feld.IsBlob Then Exit;
  If Feld.IsNull Then EXIT;

  S := Feld.DataSet.CreateBlobStream(Feld, bmRead);
  FileS := TFileStream.Create(Datei, fmCreate);
  Try
    Try
      FileS.CopyFrom(S, S.Size);
      Result := FileExists(Datei);
    Except
      on e:exception Do
      Begin
        GL.FehlerMeldung := e.Message;
        Result := False;
      End;
    End;
  Finally
    S.Free;
    FileS.Free;
  End;
end;

// ----- Übergibt den Inhalt eines Streams an ein Blobfeld
Function TDatMod.StreamInBlobFeld(Strom: TMemoryStream; Feld: TField): Boolean;
Var
  S : TStream;

begin
  Result := False;
  If Not Feld.IsBlob Then Exit;
  If Not ((Feld.DataSet.State = dsInsert) Or
          (Feld.DataSet.State = dsEdit)) Then Exit;

  S := Feld.DataSet.CreateBlobStream(Feld, bmReadWrite);

  Try
    S.CopyFrom(Strom,Strom.Size);
    Result := True;
  Finally
    S.Free;
  End;
end;

// ----- Übergibt den Inhalt eines Blobfelds an Strom
Function TDatMod.BlobFeldInStream(Strom: TMemoryStream; Feld: TField): Boolean;
Var
   S : TStream;

begin
   Result := False;
   If Not Feld.IsBlob Then Exit;
   If Feld.IsNull Then Exit;

   Try
     S := Feld.DataSet.CreateBlobStream(Feld, bmRead);
     Strom.Clear;
     Strom.CopyFrom(S,S.Size);
     Result := True;
   Finally
     S.Free;
   End;
end;

// ----- Übergibt den Inhalt eines Blobfelds an ein TBitMap
Function TDatMod.BlobFeldInImage(Feld: TField; Bild: TBitMap): Boolean;
Var
  S : TStream;
  JBild : TJpegImage;

begin
  Result := False;
   If Not Feld.IsBlob Then Exit;
   If Feld.IsNull Then Exit;

  JBild := TJPegImage.Create;
  S := Feld.DataSet.CreateBlobStream(Feld, bmRead);

  Try
    JBild.LoadFromStream(S);
    Bild.Assign(JBild);
    Result := True;

  Finally
    If Not Result Then
       GL.FehlerMeldung := 'Fehler beim Speichern eines Blobfelds in ein Bitmap';
    S.Free;
    JBild.Free;
  End;
end;

// ----- Übergibt den Inhalt eines BitMaps an ein Blobfeld
Function TDatMod.ImageInBlobFeld(Feld: TField; Bild: TBitMap): Boolean;
Var
  S : TStream;
  JBild : TJpegImage;

begin
  Result := False;
  If Not Feld.IsBlob Then Exit;
  If Not ((Feld.DataSet.State = dsInsert) Or
          (Feld.DataSet.State = dsEdit)) Then Exit;

  JBild := TJPegImage.Create;
  S := Feld.DataSet.CreateBlobStream(Feld, bmWrite);

  Try
    JBild.Assign(Bild);
    JBild.CompressionQuality := 100;
    JBild.Compress;
    JBild.SaveToStream(S);
    S.Position := 0;
    Result := True;
  Finally
    If Not Result Then
       GL.FehlerMeldung := 'Fehler beim Speichern eines Bitmap in ein Blobfeld';
    S.Free;
    JBild.Free;
  End;
end;
Diese Methoden funktionieren bei mir mit allen gängigen Datenbanken: Firebird, MySQL, MsSQL, PostGreSQL ... wobei GL.Fehlermeldung eine ClassVar in meiner Tools-Klasse darstellt, was aber für die eigentliche Funktionalität der obigen Methoden keine wichtige Rolle spielt.
  Mit Zitat antworten Zitat