dbExpressを用いてBLOBファイルを保存するには?

解決


shiro  2006-07-19 04:01:42  No: 22661

いつも参考にさせていただいております。
現在Delphi2006、dbExpressで開発を行っております。

BDEを使用してのBLOB保存については参考になるコードがあったのですが、
dbExpressを使用しての保存方法に関しては調べることができませんでした。

どなたかご存知の方いらっしゃればお教えください。お願いいたします。


HOta  2006-07-19 23:22:35  No: 22662

dbExpressでも、BLOBFieldはDataSetからの仕様は同じように使えるはずです。
使えなかったのでしょうか?


shiro  2006-07-20 02:10:54  No: 22663

HOta様
お世話になります。

下記のようにBLOB型のデータを追加使用と試みているのですが、
エラーが出ます。。どのように対処したらいいのでしょうか?

まだ、何が何だかわかっておりません。。すいません。よろしくお願いいたします。

プロジェクト FaceYubi.exe は例外クラス EDatabaseError (メッセージ 'dbExpress エラー: [0x0003]:不正な項目型
データベースサーバーエラー: ORA-01036: 変数の名前/数が無効です。
')を送出しました。

function Data:boolean;
var
  SetQry : TSQLQuery;
begin
  Result := False;

  // TSQLQuery作成&設定
  SetQry := TSQLQuery.Create(Application);
  SetQry.SQLConnection := dmdbExDM.dbConn;
  // DB接続確認
  if not dmdbExDM.dbConn.Connected then dmdbExDM.dbConn.Open;

  with SetQry do begin
    try
      try
        SQL.Clear;
          SQL.Add(begin Add(:あああ); end;);

        ParamByName('あああ').LoadFromFile('aaa.bmp',ftGraphic);

        Prepared := True;
        ExecSQL;                 

      except
        on E: EDBEngineError do begin
          Exit;
        end else
          Raise;
      end;
    finally
      Close;
      Prepared := False;
      Free;
    end;
  end;
  Result := True;
end;


HOta  2006-07-20 05:31:36  No: 22664

テストとしては、TSQLQueryやSQL文を動的に作成せずに、
設計段階で全てセットしておいてから、やってみて下さい。

var
   b : TBlobStream;
   bmpValue: TBitmap;
begin
   wih SetQry do begin
        Open;
        Edit;
        try
           b := TBlobStream.Create(TBlobField(Table1.FieldByName('あああ')),bmWrite);
           bmpValue.LoadFromFile('aaa.bmp');
           bmpValue.SaveToStream(b);
        finally
           b.Free;
        end;
        Post;
        Close;
    end;
end;


shiro  2006-07-20 23:34:34  No: 22665

HOta様
レスありがとうございます。

Tableを使わず、ParamByNameで処理したかったのですが、できないのでしょうか?

↑のようにすると'変数の名前/数が無効です。'というエラーが出てしまうのです。。


shiro  2006-07-21 00:39:03  No: 22666

すいません。追記です。

ヘルプを参照したのですが、dbExpress データセットの TSQLDataSetは単方向データセットになるらしく、Openしたデータを編集できないとのことです。

誰か助けてくださいませ。


HOta  2006-07-21 00:50:32  No: 22667

まず、単純なソースでテストすればと思ったのです。ParamByNameも使えるとおもいます。Streamにデーターをいれて、代入すればいけると思います。
データを編集するのは、DataAccess頁のClientDataSetを追加します。


shiro  2006-07-21 18:58:35  No: 22668

HOta様
何度もお手数をおかけします。

下記のようにストリームを使用しているのですが、、同じようにエラーがでます。具体的な例などご存知であればご教授ください。お願いいたします。

function Data:boolean;
var
  SetQry : TSQLQuery;
  Bs : TSQLBlobStream;
begin
  Result := False;

  Bs := TSQLBlobStream.Create(TBlobField(Table1.FieldByName('あああ')),bmWrite);
  bmp.LoadFromFile('FaceImage.bmp');
  bmp.SaveToStream(Bs);

  SetQry := TSQLQuery.Create(Application);
  SetQry.SQLConnection := dmdbExDM.dbConn;
  if not dmdbExDM.dbConn.Connected then dmdbExDM.dbConn.Open;

  with SetQry do begin
    try
      try
        SQL.Clear;
        SQL.Add(INSERT文);

        ParamByName('あああ').LoadFromStream(Bs,ftOraBlob);

        Prepared := True;
        ExecSQL;                 

      except
        on E: EDBEngineError do begin
          Exit;
        end else
          Raise;
      end;
    finally
      Close;
      Prepared := False;
      Free;
    end;
  end;
  Result := True;
end;


HOta  2006-07-21 20:07:15  No: 22669

エラーはFieldの項目型が違うと言うことで、対象の項目はBLOB型でしょうか?
エラーはどの行で出ていますか?


shiro  2006-07-21 20:20:34  No: 22670

HOta様
何度もご対応いただき恐れ入ります。テーブルの項目はBLOB型で間違いありません。
エラーは  ExecSQL;  で出てしまいます。


HOta  2006-07-22 00:09:43  No: 22671

>        ParamByName('あああ').LoadFromStream(Bs,ftOraBlob);

        ParamByName('あああ').Assign(Bs);

にしてみてください。
パラメター項目'あああ'のプロパティはblob型に指定していますか?


shiro  2006-07-22 00:36:10  No: 22672

HOta様
>ParamByName('あああ').Assign(Bs);
ダメのようです。[Pascal エラー] E2010 'TPersistent' と 'TSQLBlobStream' には互換性がありません、とエラーです。

>パラメター項目'あああ'のプロパティはblob型に指定していますか?
指定しています。


HOta  2006-07-22 19:38:39  No: 22673

実際にテストしてみました。
JPegファイルを入れてみました。
RDBMSはInterBase7.1を使いました。

SQLConnection データーベース指定
SQLDataSet
  のCommandTextに
Insert Into SIENIMAGES (
    IMGNO
  , IMGDT 
) Values (
    :IMGNO
  , :IMGDT 
)
を指定

var
  Jpeg  : TJPEGImage;
begin
  inc(FImgNo);
  Jpeg      := TJPEGImage.Create;
  try
    Jpeg.LoadFromFile('DSCF0002.JPG');
    SQLDataSet1.ParamByName('IMGNO').AsInteger  := FImgNo;
    SQLDataSet1.ParamByName('IMGDT').Assign(Jpeg);
    SQLDataSet1.ExecSQL(False);
  finally
    FreeAndNil(Jpeg);
  end;

以上で問題なく登録できます。


shiro  2006-07-25 02:23:03  No: 22674

HOta様

ご連絡遅くなりました。。上記のように対応するとできました!!
動きました!!感動です!ほんっとにありがとうございました。

また、よろしくお願いいたします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加