AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi TImage an Datenbankfeld
Thema durchsuchen
Ansicht
Themen-Optionen

TImage an Datenbankfeld

Ein Thema von DirkG · begonnen am 22. Jul 2004 · letzter Beitrag vom 30. Jul 2004
Antwort Antwort
Benutzerbild von DirkG
DirkG

Registriert seit: 29. Sep 2003
Ort: Schwerin
67 Beiträge
 
Delphi 5 Enterprise
 
#1

TImage an Datenbankfeld

  Alt 22. Jul 2004, 10:32
Hallo zusammen!
Wie bekomme ich Bilddaten aus einem TImage in ein Datenbankfeld.

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.

Dirk!
Human are Human to make mistakes.
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#2

Re: TImage an Datenbankfeld

  Alt 28. Jul 2004, 01:41
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ß
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#3

Re: TImage an Datenbankfeld

  Alt 28. Jul 2004, 03:47
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ß
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
Benutzerbild von DirkG
DirkG

Registriert seit: 29. Sep 2003
Ort: Schwerin
67 Beiträge
 
Delphi 5 Enterprise
 
#4

Re: TImage an Datenbankfeld

  Alt 30. Jul 2004, 13:30
Danke Leuselator für die Antwort zu später Stunde!
Werde mich mal gleich an die Implementierung der Routienen machen!
Hoffe, das dein Vorschlag die Lösung meiner Probleme ist!
Human are Human to make mistakes.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz