![]() |
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:
Das Problem ist Fld3, es sollen die Daten vom Typ "TImage" aufnehmen, macht aber bisher nur Ärger.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; :gruebel: Dirk! |
Re: TImage an Datenbankfeld
Delphi-Quellcode:
Gruß
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; |
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:
Aufruf z.B. mit TQuery (schnuckelt aber auch mit anderen DataSet-Nachkommen und mit TAdoCommand):
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;
Delphi-Quellcode:
Elegantere Lösungen immer willkommen - bitte kein Gemecker wegen Code-Formatierung :-)
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; Gruß |
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