Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi TImage an Datenbankfeld (https://www.delphipraxis.net/26341-timage-datenbankfeld.html)

DirkG 22. Jul 2004 11:32


TImage an Datenbankfeld
 
Hallo zusammen!
Wie bekomme ich Bilddaten aus einem TImage in ein Datenbankfeld. :wall:

Ich übergebe bisher String- oder Zahlen-Daten an eine Access-DB auf folgende Weise

Delphi-Quellcode:

with QRY_AddData do begin
   SQL.Clear;
   SQL.Add('INSERT INTO dbName (Feld1, Feld2, Feld3) VALUES (:Fld1, : Fld2, :Fld3)');
   Parameters.ParamByName('Fld1').Value := Trim('Text');
   Parameters.ParamByName('Fld2').Value := 123;
   Parameters.ParamByName('Fld3').Value := Bild;
   try
     ExecSQL;
   except;
   end;
end;
Das Problem ist Fld3, es sollen die Daten vom Typ "TImage" aufnehmen, macht aber bisher nur Ärger.
:gruebel:
Dirk!

Leuselator 28. Jul 2004 02:41

Re: TImage an Datenbankfeld
 
Delphi-Quellcode:
var
  BildStrom : TMemoryStream;
begin
  with QRY_AddData do begin
    SQL.Clear;
    SQL.Add('INSERT INTO dbName ');
    SQL.Add('         ( Feld1  ');
    SQL.Add('         , Feld2  ');
    SQL.Add('         , Feld3  ');
    SQL.Add('         )       ');
    SQL.Add('    VALUES       ');
    SQL.Add('         ( :Fld1  ');
    SQL.Add('         , :Fld2  ');
    SQL.Add('         , :Fld3  ')
    SQL.Add('         )       ');

    Parameters.ParamByName('Fld1').DataType := ftString;('Text');
    Parameters.ParamByName('Fld2').DataType := ftInteger;
    Parameters.ParamByName('Fld3').DataType := ftBlob;

    Parameters.ParamByName('Fld1').Value := Trim('Text');
    Parameters.ParamByName('Fld2').Value := 123;

    if not Bild.Picture.Bitmap.Empty then begin // is überhaupt was drin im Bild?
      BildStrom := TMemoryStream.Create;
      try
        Bild.Picture.Bitmap.SaveToStream(BildStrom); // Kühlschrank auf, Kuh rein..
        Parameters.ParamByName('Fld3').LoadFromStream(BildStrom,ftBlob); // Kuh raus, Elefant rein
      finally
        BildStrom.Free; // Aufräumen
      end;
    end else begin    // wenn Bild leer, dann brauchen wir auch
                       // keine Bilddaten in DB zu schreiben...
      Parameters.ParamByName('Fld2').Value := NULL; // damit das funzt, unit Variants
                                                    // einbinden - da is NULL deklariert! 
    end;
  end;
  try
    ExecSQL;
  except;
  end;
end;
Gruß

Leuselator 28. Jul 2004 04:47

Re: TImage an Datenbankfeld
 
Da ich gern aber selten faul bin, hier eine kleine Prozedur welche die Arbeit mit Parametern erleichtert, da sie eine Menge Tipp-Arbeit erspart:
Delphi-Quellcode:
procedure ParaSecured(DasDataSet   : TComponent;
                      Parametername : String;
                      DataType     : TFieldType;
                      Wert         : Variant;
                      PicOrMemo    : TObject = nil);
var AStream : TMemoryStream;
    DerParam    : TParam;
    DerParameter : TParameter;
    IsAdo  : Boolean;
begin
  DerParam    := nil;
  DerParameter := nil;

  if DasDataSet is TQuery then begin
    IsAdo       := False;
    DerParam    := TQuery(DasDataSet).ParamByName(Parametername);
    DerParam.DataType := DataType;
  end else if DasDataSet is TStoredProc then begin
    IsAdo       := False;
    DerParam    := TStoredProc(DasDataSet).ParamByName(Parametername);
    DerParam.DataType := DataType;
  end else if DasDataSet is TAdoQuery then begin
    IsAdo       := True ;
    DerParameter := TAdoQuery(DasDataSet).Parameters.ParamByName(Parametername);
    DerParameter.DataType := DataType;
  end else if DasDataSet is TADOCommand then begin
    IsAdo := True ;
    DerParameter := TADOCommand(DasDataSet).Parameters.ParamByName(Parametername);
    DerParameter.DataType := DataType;
  end else if DasDataSet is TADOStoredProc then begin
    IsAdo := True ;
    DerParameter := TADOStoredProc(DasDataSet).Parameters.ParamByName(Parametername);
    DerParameter.DataType := DataType;
  end else if DasDataSet is TBetterADOQuery then begin
    IsAdo := True ;
    DerParameter := TBetterADOQuery(DasDataSet).Parameters.ParamByName(Parametername);
    DerParameter.DataType := DataType;
  end else if DasDataSet is TBetterADODataSet then begin
    IsAdo := True ;
    DerParameter := TBetterADODataSet(DasDataSet).Parameters.ParamByName(Parametername);
    DerParameter.DataType := DataType;
  end else raise Exception.Create('Fehler in ParSecure:'+#13#10+
                                  'Komponente DasDataSet kennt keine Parameter...');

  if IsAdo then begin
    if not Assigned(DerParameter)
      then raise Exception.Create('Fehler in ParSecure:'+#13#10+
                                  'Parameter nicht gefunden!');
  end else begin
    if not Assigned(DerParam)
      then raise Exception.Create('Fehler in ParSecure:'+#13#10+
                                  'Parameter nicht gefunden!');
  end;

  if Assigned(PicOrMemo) then begin
    AStream := TMemoryStream.Create;
    try
      case DataType of
        ftBlob,ftMemo,ftOraBlob,ftOraClob,ftFmtMemo,ftGraphic :
          begin
            if (PicOrMemo is TBitmap)
            and (DataType in [ftBlob,ftOraBlob,ftGraphic]) then begin
              TBitmap(PicOrMemo).SaveToStream(AStream);
            end else if (PicOrMemo is TPicture)
                     and (DataType in [ftBlob,ftOraBlob,ftGraphic]) then begin
              TPicture(PicOrMemo).Bitmap.SaveToStream(AStream);
            end else if (PicOrMemo is TLsPictureFrame)
                     and (DataType in [ftBlob,ftOraBlob,ftGraphic]) then begin
              TLsPictureFrame(PicOrMemo).Ls_Bitmap.SaveToStream(AStream);
            end else if (PicOrMemo is TMemo)
                     and (DataType in [ftBlob,ftOraBlob,ftOraClob,ftMemo,ftFmtMemo]) then begin
              TMemo(PicOrMemo).Lines.SaveToStream(AStream);
            end else if (PicOrMemo is TRichEdit)
                     and (DataType in [ftBlob,ftOraBlob,ftOraClob,ftMemo,ftFmtMemo]) then begin
              TRichEdit(PicOrMemo).Lines.SaveToStream(AStream);
            end
            else raise Exception.Create('Fehler in ParSecure:'+#13#10+
                                        'PicOrMemo kein unterstütztes Objekt!'+#13#10+
                                        'Kann daher keine Binärdaten aus Objekt in Parameter streamen!');
          end;
      else raise Exception.Create('Fehler in ParSecure:'+#13#10+
                                  'DataType passt nicht zu PicOrMemo oder'+#13#10+
                                  'DataType nicht ftBlob,'+#13#10+
                                  '              ftMemo,'+#13#10+
                                  '              ftOraBlob,'+#13#10+
                                  '              ftOraClob,'+#13#10+
                                  '              ftFmtMemo oder '+#13#10+
                                  '              ftGraphic'+#13#10+
                                  'Kann daher keine Binärdaten aus Objekt in Parameter streamen!');
      end;// case
      if IsAdo
        then DerParameter.LoadFromStream(AStream,DataType)
        else DerParam   .LoadFromStream(AStream,DataType);
    finally
      AStream.Free;
    end;
  end else begin // kein TObject übergeben also Wert benutzen
    if IsAdo
      then DerParameter.Value := Wert
      else DerParam   .Value := Wert;
  end;
end;
Aufruf z.B. mit TQuery (schnuckelt aber auch mit anderen DataSet-Nachkommen und mit TAdoCommand):
Delphi-Quellcode:
procedure InsertIntoDb(Query :TQuery; IntWert : Integer; StrWert : String; Bild : TBitmap);
begin
  Query.SQL.Clear;
  Query.SQL.Add('INSERT INTO TabellenName ');
  Query.SQL.Add('         ( IntegerFeld ');
  Query.SQL.Add('         , StringFeld  ');
  Query.SQL.Add('         , BlobFeld    ');
  Query.SQL.Add('         )             ');
  Query.SQL.Add('    VALUES             ');
  Query.SQL.Add('         ( :INTPARA    ');
  Query.SQL.Add('         , :STRPARA    ');
  Query.SQL.Add('         , :BLOBPARA   ');
  Query.SQL.Add('         )             ');
  ParaSecured(Query,'INTPARA' , ftInteger, IntWert      );
  ParaSecured(Query,'STRPARA' , ftString , StrWert      );
  ParaSecured(Query,'BLOBPARA', ftBlob  , 0      ,Bild );
  Query.ExecSQL;
end;
Elegantere Lösungen immer willkommen - bitte kein Gemecker wegen Code-Formatierung :-)
Gruß

DirkG 30. Jul 2004 14:30

Re: TImage an Datenbankfeld
 
Danke Leuselator für die Antwort zu später Stunde! :wink:
Werde mich mal gleich an die Implementierung der Routienen machen!
Hoffe, das dein Vorschlag die Lösung meiner Probleme ist! :zwinker:


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:32 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 by Thomas Breitkreuz