5

単純な基本的な問題が1つあります。ステートメントを使用して画像をデータベースに挿入しようとしていますInsertが、他の列の値もTADOQueryコンポーネントを使用しています。

コードはすでに誰かによって書かれているので、それぞれのステップで明確にするために、ここにいくつかのダミーのサンプルコードを置きたいと思います。

これはコンポーネントで正常に機能していたことに注意してください。コンポーネントTQueryに置き換えTQueryているので、コンポーネントのみTADOQueryを使用して同じことを行う必要があります。TADOQuery

同じコードがSQLServerとOracleデータベースで機能するはずです。

画像を挿入しようとしている列のデータ型は、SQLServerVarBinaryデータベースの型です。

TQueryを使用して画像をテーブルに挿入する

  1. を使用してイメージを作成しTImageます。

    msBinImgStream := TMemoryStream.Create; 
    imgCustom := TImage.Create(self); 
    imgJpg := TJPEGImage.Create; 
    
  2. 画像をに変換し、TJpegImageに保存しTMemoryStreamます。

    imgJpg.Assign(imgCustom.Picture.Bitmap); 
    imgJpg.SaveToStream(msBinImgStream);
    
  3. コンポーネントSetBlobdataのプロパティを使用してデータベースに挿入します。TQuery

    sSql := 'INSERT INTO Table_Name(Column1, Column2, Column_Image) VALUES ( ''' + Value1 + ''', ''' + Value2 + ''', :pBlob)'; 
    qryTQuery.SQL.Add(sSQL); 
    qryTQuery.ParamByName('pBlob').SetBlobData(msBinImgStream.Memory, msBinImgStream.Size); 
    qryTQuery.ExecSQL; 
    

今同じことを使用してTADOQuery

  1. 画像を作成できます。
  2. それをTJpegに変換し、に保存しTMemoryStreamます。
  3. を使用して画像をデータベースに挿入しようとしましたが、 「文字列またはバイナリ値が切り捨てられる可能性があります」LoadFromStream(stream, ftBlob)というエラーが発生します。

    sSql := 'INSERT INTO Table_Name(Column1, Column2, Column_Image) VALUES ( ''' + Value1 + ''', ''' + Value2 + ''', :pBlob)'; 
    qryADOQuery.SQL.Add(sSQL); 
    qryADOQuery.Parameters.ParamByName('pBlob').LoadFromStream(msBinImgStream, ftBlob); 
    qryADOQuery.ExecSQL; 
    

このアプローチでこの問題をどのように克服すべきかを教えてください。

4

2 に答える 2

15

保存:

var
  Field: TBlobField;
  Stream: TStream;
begin
  if ADOQuery.Active and (Image.Picture.Graphic <> nil) then
  begin
    ADOQuery.Insert;
    Field := TBlobField(ADOQuery.FieldByName('ImageData')); // ensure it ís a blob
    Stream := ADOQuery.CreateBlobStream(Field, bmWrite);
    try
      Image1.Picture.Graphic.SaveToStream(Stream);
    finally
      Stream.Free;
      ADOQuery.Post;
    end;
  end;
end;    

または:のTADOBlobStream代わりに使用しTStreamます

var
  ...
  Stream: TADOBlobStream;
begin
  ...
    Stream := TADOBlobStream.Create(Field, bmWrite);
    ...

読み込み中:

var
  Field: TBlobField;
  Stream: TStream;
  Jpg: TJPEGImage;
begin
  if ADOQuery.Active then
  begin
    Field := TBlobField(ADOQuery.FieldByName('ImageData'));
    Stream := ADOQuery.CreateBlobStream(Field, bmRead);
    Jpg := TJPEGImage.Create;
    try
      Jpg.LoadFromStream(Stream);
      Image1.Picture.Graphic := Jpg;
    finally
      Jpg.Free;
      Stream.Free;
    end;
  end;
end;
于 2012-08-02T10:13:57.357 に答える
3

Attributesあなたがするようにパラメータを扱うとき、私はあなたが次のように、のような追加の設定をそれに提供しなければならないと思いますDataType

  sSql := 'INSERT INTO Table_Name (Column1, Column2, Column_Image) ' +
    'VALUES (''' + Value1 + ''', ''' + Value2 + ''', :pBlob)';

  qryADOQuery.SQL.Add(sSQL);
  qryADOQuery.Parameters[0].Attributes := [paLong];
  qryADOQuery.Parameters[0].DataType := ftBlob; // Or ftVarBytes
                                                // Or ftOraBlob (Oracle only)
  qryADOQuery.Parameters[0].LoadFromStream(msBinImgStream, ftBlob);
  qryADOQuery.ExecSQL;
于 2012-08-02T19:44:28.687 に答える