Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Bild in Access DB speichern (https://www.delphipraxis.net/102245-bild-access-db-speichern.html)

Gehstock 25. Okt 2007 13:56

Datenbank: Access • Zugriff über: ADO

Bild in Access DB speichern
 
Delphi-Quellcode:
procedure TForm7.SavePic;
var
  bS : TADOBlobStream;
  Pic : TJpegImage;
begin
  bS := TADOBlobStream.Create(AdoTable1Picture, bmWrite);
  try
    Pic.Assign(AdoImage);
    try
     Pic.SaveToStream(bS);
     bs.Position := 0;
     TBlobField(Table1.FieldByName('Bild')).LoadFromStream(bs);
    finally
     Pic.Free;
    end;
  finally
    bS.Free
  end;
end;
Delphi-Quellcode:
  if Button = nbPost then
   begin
    LoadPIC.Visible := false;//TButton
    SavePIC;

erzeugt nur einern "Stream Lesefehler" in der DB werden nur die eingaben von den DBEdit Feldern gespeichert

Pfoto 25. Okt 2007 14:29

Re: Bild in Access DB speichern
 
bist du dir sicher, dass du die Tabelle zum editieren freigegeben hast:

also so:
Delphi-Quellcode:
BlobField := TBlobField(Table1.FieldByName('Bild'));
Table1.Edit;
BlobField.LoadFromStream(bs);

Gehstock 25. Okt 2007 16:28

Re: Bild in Access DB speichern
 
Liste der Anhänge anzeigen (Anzahl: 1)
klappt net er speichert einfach nicht vermute das programm weiß nicht in welche spalte hier mal der komplette source mit exe



Delphi-Quellcode:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Mask, DBCtrls, Grids, DBGrids, ExtCtrls, DB, DBTables,
  ADODB, Jpeg, ExtDlgs;

type
  TForm7 = class(TForm)
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    Panel1: TPanel;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    DBEdit1: TDBEdit;
    DBEdit2: TDBEdit;
    DBEdit3: TDBEdit;
    DBEdit4: TDBEdit;
    DBEdit5: TDBEdit;
    DBEdit6: TDBEdit;
    DBNavigator1: TDBNavigator;
    DBEdit8: TDBEdit;
    Label8: TLabel;
    Label12: TLabel;
    DBEdit11: TDBEdit;
    ADOImage: TImage;
    Table1: TADOTable;
    ADOTable1Nr: TAutoIncField;
    ADOTable1Name: TWideStringField;
    ADOTable1Vorname: TWideStringField;
    ADOTable1Strasse: TWideStringField;
    ADOTable1Ort: TWideStringField;
    ADOTable1Termin: TDateField;
    ADOTable1TelefonFest: TWideStringField;
    ADOTable1TelefonMobil: TWideStringField;
    ADOTable1Picture: TBlobField;
    LoadPIC: TButton;
    OpenPicture: TOpenPictureDialog;
    procedure FormCreate(Sender: TObject);
    function JpegStartsInBlob(PicField:TBlobField):integer;
    procedure OpenPic;
    procedure SavePic;
    procedure DBNavigator1Click(Sender: TObject; Button: TNavigateBtn);
    procedure LoadPICClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form7: TForm7;

implementation

{$R *.dfm}

procedure TForm7.DBNavigator1Click(Sender: TObject; Button: TNavigateBtn);
begin
if Length(DBEdit1.text)> 0 then OpenPic;
 if Button = nbedit then
   begin
    LoadPIC.Visible := True;
   end;
  if Button = nbInsert then
   begin
    LoadPIC.Visible := True;
   end;
  if Button = nbPost then
   begin
    LoadPIC.Visible := false;
    SavePIC;
   end;
end;

procedure TForm7.FormCreate(Sender: TObject);
begin
   Table1.Active := True;
   OpenPic;
end;

function TForm7.JpegStartsInBlob(PicField:TBlobField):integer;
var
 bS    : TADOBlobStream;
 buffer : Word;
 hx    : string;
begin
 Result := -1;
 bS := TADOBlobStream.Create(PicField, bmRead);
 try
  while (Result = -1) and (bS.Position + 1 < bS.Size) do begin
   bS.ReadBuffer(buffer, 1);
   hx:=IntToHex(buffer,2);
   if hx = 'FF' then begin
     bS.ReadBuffer(buffer, 1);
     hx:=IntToHex(buffer,2);
     if hx = 'D8' then Result := bS.Position - 2
     else if hx = 'FF' then bS.Position := bS.Position-1;
   end;//if
  end;//while
 finally
  bS.Free
 end; //try
end;

procedure TForm7.LoadPICClick(Sender: TObject);
{var
  jpg: TJPEGImage;
  bmp: TBitmap;  }
begin
if OpenPicture.execute then
 begin
  AdoImage.Picture.LoadFromFile(OpenPicture.FileName);
end;
end;

procedure TForm7.OpenPic;
var
  bS : TADOBlobStream;
  Pic : TJpegImage;
begin
  bS := TADOBlobStream.Create(AdoTable1Picture, bmRead);
  try
    bS.Seek(JpegStartsInBlob(AdoTable1Picture), soFromBeginning);
    Pic:=TJpegImage.Create;
    try
     Pic.LoadFromStream(bS);
     ADOImage.Picture.Graphic:=Pic;
    finally
     Pic.Free;
    end;
  finally
    bS.Free
  end;
end;

procedure TForm7.SavePic;
var
  bS : TADOBlobStream;
  Pic : TJpegImage;
begin
  bS := TADOBlobStream.Create(AdoTable1Picture, bmRead);
  try
    Pic.Assign(AdoImage);
    try
     Pic.SaveToStream(bS);
     bs.Position := 0;
     ADOTable1Picture := TBlobField(Table1.FieldByName('Bild'));
     Table1.Edit;
     ADOTable1Picture.LoadFromStream(bs);
    finally
     Pic.Free;
    end;
  finally
    bS.Free
  end;
end;

end.

Gehstock 26. Okt 2007 12:30

Re: Bild in Access DB speichern
 
Push

mikhal 26. Okt 2007 12:58

Re: Bild in Access DB speichern
 
Setze die Tabelle mal in den Edit-Modus, bevor du den BlobStream erzeugst, ansonsten schau dir mal an, wie ich es hier und hier realisiert habe. Wenn du dort TTable geben TAdoTable austauschst, sollte es genauso funktionieren.

Grüße
Mikhal

[edit]Rechtschreibfehler...[/edit]


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