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

解決


shiro  2006-07-18 19:01:42  No: 22661  IP: 192.*.*.*

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

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

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

編集 削除
HOta  2006-07-19 14:22:35  No: 22662  IP: 192.*.*.*

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

編集 削除
shiro  2006-07-19 17:10:54  No: 22663  IP: 192.*.*.*

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-19 20:31:36  No: 22664  IP: 192.*.*.*

テストとしては、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 14:34:34  No: 22665  IP: 192.*.*.*

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

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

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

編集 削除
shiro  2006-07-20 15:39:03  No: 22666  IP: 192.*.*.*

すいません。追記です。

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

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

編集 削除
HOta  2006-07-20 15:50:32  No: 22667  IP: 192.*.*.*

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

編集 削除
shiro  2006-07-21 09:58:35  No: 22668  IP: 192.*.*.*

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 11:07:15  No: 22669  IP: 192.*.*.*

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

編集 削除
shiro  2006-07-21 11:20:34  No: 22670  IP: 192.*.*.*

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

編集 削除
HOta  2006-07-21 15:09:43  No: 22671  IP: 192.*.*.*

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

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

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

編集 削除
shiro  2006-07-21 15:36:10  No: 22672  IP: 192.*.*.*

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

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

編集 削除
HOta  2006-07-22 10:38:39  No: 22673  IP: 192.*.*.*

実際にテストしてみました。
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-24 17:23:03  No: 22674  IP: 192.*.*.*

HOta様

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

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

編集 削除