5

SQLを使用してデータベースに画像を保存したいのですが、うまくいかないようです:

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

.Parameters には .Param のような .asinteger はありませんが、.Param は TADOquery と互換性がありません - 私が試した回避策:

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

これも機能しません:

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;
4

3 に答える 3

6

次のようになります。

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;

DB から BLOB を読み取るには:

qry.SQL.Text := 'select id, pic from tbl where id = 1';
qry.Open;
TBlobField(qry.FieldByName('pic')).SaveToFile('c:\sample_2.jpg');
于 2013-10-01T12:56:36.140 に答える
1

私は Delphi ではなく Lazarus を使用していますが、通常は同じ構文だと思います。もしそうなら、これはkobiksの提案をわずかに改善したものです:

パラメータに値を割り当てる前に SQL.Text が割り当てられている場合、パラメータは自動的に追加されます。このような:

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;
于 2014-03-14T12:34:50.987 に答える
1

私はこれをこのqへの回答として書き ました.Delphiは、現在重複としてフラグが付けられているsqlデータベースにパックされたレコードをblobとして保存 します。コメントで説明されているようにOPで使用される手法が正しいように見えるため、おそらく間違っています。したがって、問題の原因は別の場所にある可能性があります。

重複フラグが削除された場合は、この回答を再投稿します。

次のコードは、以下に示すように定義された Sql Server テーブルに対してうまく機能します。

Rec1 からのデータはテーブルに保存され、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;

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
于 2015-08-06T20:01:20.660 に答える