Insertar / actualizar TBlobfield (también conocido como image) usando parameters sql

Quiero almacenar imágenes en una database usando sql pero no puedo hacer que funcione:

qry.SQL.Clear; qry.Sql.Add('update tbl set pic = :blobVal where id = :idVal'); qry.Parameters.ParamByName('idVal')._?:=1; 

.Parameters no tiene .astenger como .Param tiene pero .Param no es compatible con TADOquery – para solucionarlo lo intenté:

 a_TParameter:=qry.Parameters.CreateParameter('blobval',ftBlob,pdinput,SizeOf(TBlobField),Null); a_TParam.Assign(a_TParameter); a_TParam.asblob:=a_Tblob; qry.ExecSql; 

Esto tampoco funciona:

 qry.SQL.Clear; qry.Sql.Add('update tbl set pic = :blobVal where id = 1') qry.Parameters.ParamByName('blobVal').LoadFromStream(img as a_TFileStream,ftGraphic);//ftblob //or qry.Parameters.ParamByName('blobVal').LoadFromFile('c:\sample.jpg',ftgrafic);//ftblob qry.ExecSql; 

Debería ser algo así como:

 qry.Parameters.Clear; qry.Parameters.AddParameter.Name := 'blobVal'; qry.Parameters.ParamByName('blobVal').LoadFromFile('c:\sample.jpg', ftBlob); // or load from stream: // qry.Parameters.ParamByName('blobVal').LoadFromStream(MyStream, ftBlob); qry.Parameters.AddParameter.Name := 'idVal'; qry.Parameters.ParamByName('idVal').Value := 1; qry.SQL.Text := 'update tbl set pic = :blobVal where id = :idVal'; qry.ExecSQL; 

Para leer el BLOB desde el DB:

 qry.SQL.Text := 'select id, pic from tbl where id = 1'; qry.Open; TBlobField(qry.FieldByName('pic')).SaveToFile('c:\sample_2.jpg'); 

Estoy usando a Lázaro, no a Delphi, pero supongo que usualmente es la misma syntax. Si es así, aquí hay una ligera mejora en la sugerencia de Kobiks:

Los parameters se agregan automáticamente si se asigna SQL.Text antes de tratar de asignar valores a los parameters. Me gusta esto:

 qry.Parameters.Clear; qry.SQL.Text := 'update tbl set pic = :blobVal where id = :idVal'; qry.Parameters.ParamByName('blobVal').LoadFromFile('c:\sample.jpg', ftBlob); qry.Parameters.ParamByName('idVal').Value := 1; qry.ExecSQL; 

Escribí esto como una respuesta a esto. Delphi guardó el logging empaquetado como blob en una database sql que actualmente está marcada como un duplicado, posiblemente incorrectamente porque la técnica utilizada por el OP como se describe en los comentarios parece ser correcta. Entonces, la causa del problema puede estar en otra parte.

Si se elimina el indicador Duplicar, volveré a publicar esta respuesta allí.

El siguiente código funciona bien para mí contra una tabla de server Sql definida como se muestra a continuación.

Los datos de Rec1 se guardan en la tabla y se vuelven a leer correctamente en Rec2.

 (* MS Sql Server DDL CREATE TABLE [blobs] ( [id] [int] NOT NULL , [blob] [image] NULL , CONSTRAINT [PK_blobs] PRIMARY KEY CLUSTERED ( [id] ) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO *) TForm1 = class(TForm) ADOConnection1: TADOConnection; qBlobInsert: TADOQuery; qBlobRead: TADOQuery; Button1: TButton; procedure Button1Click(Sender: TObject); [...] type TMyRecord = packed record FontName: string[30]; FontSize: word; FontColor: integer; FontStyle: word; Attachement: string[255]; URL: string[255]; end; const scInsert = 'insert into blobs(id, blob) values(:id, :blob)'; scSelect = 'select * from blobs where id = %d'; procedure TForm1.Button1Click(Sender: TObject); begin TestInsert; end; procedure TForm1.TestInsert; var Rec1, Rec2 : TMyRecord; MS : TMemoryStream; begin FillChar(Rec1, SizeOf(Rec1), #0); FillChar(Rec2, SizeOf(Rec2), #0); Rec1.FontName := 'AName'; Rec1.URL := 'AUrl'; MS := TMemoryStream.Create; try // Save Rec1 using an INSERT statement MS.Write(Rec1, SizeOf(Rec1)); MS.Seek(0, soFromBeginning); qBlobInsert.Parameters[0].Value := 1; qBlobInsert.Parameters[1].LoadFromStream(MS, ftBlob); qBlobInsert.SQL.Text := scInsert; qBlobInsert.ExecSQL; // Read saved data back into Rec2 qBlobRead.SQL.Text := Format(scSelect, [1]); qBlobRead.Open; MS.Clear; TBlobField(qBlobRead.FieldByName('blob')).SaveToStream(MS); MS.Seek(0, soFromBeginning); MS.Read(Rec2, MS.Size - 1); Caption := Rec2.FontName + ':' + Rec2.URL; finally MS.Free; end; end; 

Extracto de DFM

 object qBlobInsert: TADOQuery Connection = ADOConnection1 Parameters = < item Name = 'id' DataType = ftInteger Value = Null end item Name = 'blob' DataType = ftBlob Value = Null end> Left = 56 Top = 32 end