いつも参考にさせていただいております。
現在Delphi2006、dbExpressで開発を行っております。
BDEを使用してのBLOB保存については参考になるコードがあったのですが、
dbExpressを使用しての保存方法に関しては調べることができませんでした。
どなたかご存知の方いらっしゃればお教えください。お願いいたします。
dbExpressでも、BLOBFieldはDataSetからの仕様は同じように使えるはずです。
使えなかったのでしょうか?
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;
テストとしては、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;
HOta様
レスありがとうございます。
Tableを使わず、ParamByNameで処理したかったのですが、できないのでしょうか?
↑のようにすると'変数の名前/数が無効です。'というエラーが出てしまうのです。。
すいません。追記です。
ヘルプを参照したのですが、dbExpress データセットの TSQLDataSetは単方向データセットになるらしく、Openしたデータを編集できないとのことです。
誰か助けてくださいませ。
まず、単純なソースでテストすればと思ったのです。ParamByNameも使えるとおもいます。Streamにデーターをいれて、代入すればいけると思います。
データを編集するのは、DataAccess頁のClientDataSetを追加します。
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;
エラーはFieldの項目型が違うと言うことで、対象の項目はBLOB型でしょうか?
エラーはどの行で出ていますか?
HOta様
何度もご対応いただき恐れ入ります。テーブルの項目はBLOB型で間違いありません。
エラーは ExecSQL; で出てしまいます。
> ParamByName('あああ').LoadFromStream(Bs,ftOraBlob);
を
ParamByName('あああ').Assign(Bs);
にしてみてください。
パラメター項目'あああ'のプロパティはblob型に指定していますか?
HOta様
>ParamByName('あああ').Assign(Bs);
ダメのようです。[Pascal エラー] E2010 'TPersistent' と 'TSQLBlobStream' には互換性がありません、とエラーです。
>パラメター項目'あああ'のプロパティはblob型に指定していますか?
指定しています。
実際にテストしてみました。
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;
以上で問題なく登録できます。
HOta様
ご連絡遅くなりました。。上記のように対応するとできました!!
動きました!!感動です!ほんっとにありがとうございました。
また、よろしくお願いいたします。
ツイート | ![]() |