喫茶XRAYトップページ

[スレッド全体
]

[10537] Re3:Blobフィールドへの格納方法への質問返信 削除
2016/11/19 (土) 17:45:37 Mr.XRAY
▼ SOさん

> バックコーテーションの間違いですかね?

だとすると,というより,
実際データを SELECT して TDBGrid 等に表示できるか確認する必要が...
そんなことやっているでしょうね.
いや,もしかしたら... ハハハッ

どうして POST できないのか興味あるんですが,
例によって,怖くてレスできません !!
やっぱりここはエスパーの登場を期待することにします.


[10538] Re4:Blobフィールドへの格納方法への質問返信 削除
2016/11/19 (土) 18:00:52 SO
▼ Mr.XRAYさん

Delphi手元にないので、私も妄想で書いてますが、
「function CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream; virtual;」
って、ポインタを返すわけではないですよね?
BlobStream.Free;
ADODataSet1.Post;
Postする前に解放してるけど???

[10539] Re5:Blobフィールドへの格納方法への質問返信 削除
2016/11/19 (土) 18:16:03 Mr.XRAY
▼ SOさん

> BlobStream.Free;
> ADODataSet1.Post;
> Postする前に解放してるけど???


これは,質問された方のコードが本当であれば,OK です.
Free しても実体はあります.nil しなければ.

[01-01_生成したコンポーネントの解放と破棄 -  Free と nil]
http://mrxray.on.coocan.jp/Delphi/plSamples/160_CreateComponent.htm#01-01

ただですね.質問された方のコードは,コピペではないですよね.明らかに.
それが問題なんですよね.


[10540] Re6:Blobフィールドへの格納方法への質問返信 削除
2016/11/19 (土) 18:22:20 Mr.XRAY
> Free しても実体はあります.nil しなければ.

これを読んだ方が誤解するといけないので補足しておきます.
こういうことが可能なのは,Free した直後ぐらいと思った方がいいです.

Free というのは,文字通り自由になってしまうわけですから,
もし,その後にいろいろなコードを実行すると,他のオブジェクトが
そのメモリ領域を使ってしまうとアウトです.ハイ.


[10559] Re7:Blobフィールドへの格納方法への質問返信 削除
2016/11/24 (木) 09:07:55 snail
▼ Mr.XRAYさん
> > Free しても実体はあります.nil しなければ.
>
> これを読んだ方が誤解するといけないので補足しておきます.
> こういうことが可能なのは,Free した直後ぐらいと思った方がいいです.
>
> Free というのは,文字通り自由になってしまうわけですから,
> もし,その後にいろいろなコードを実行すると,他のオブジェクトが
> そのメモリ領域を使ってしまうとアウトです.ハイ.


これは「こうすればエラーがでません」というだけで、本当はおかしい使い方
のように感じます。
これはやっぱり障害回避方法だと思いますが間違っていますか。


[10554] Re5:Blobフィールドへの格納方法への質問返信 削除
2016/11/22 (火) 08:33:37 おかぽん
▼ SOさん
> BlobStream.Free;
> ADODataSet1.Post;
> Postする前に解放してるけど???


元ネタがどこなのかはわからないのですが・・・
//TBlobStreamは必ずTable.Editよりも後でCreateしなければならず、
//Table.Postの前までにFreeしなければならない。
以下からの転載
Q: データベーステーブルのGraphicフィールドにビットマップを保存するには どのようにすれば良いのでしょうか?
http://delfusa.main.jp/delfusafloor/archive/www.nifty.ne.jp_forum_fdelphi/faq/00107.htm

Mr.XRAY さんの記事もそのようになっていますし。
560_画像や RichEdit ワード文書をデータベースで読書き
http://mrxray.on.coocan.jp/Delphi/plSamples/560_RichEditDB.htm#03

CopyFrom じゃなく SaveToStream を使うのがミソだったりして。。。

[10555] Re6:Blobフィールドへの格納方法への質問返信 削除
2016/11/22 (火) 12:36:08 Mr.XRAY
▼ おかぽんさん,お久です.

> CopyFrom じゃなく SaveToStream を使うのがミソだったりして。。。

本人のレスがあって,Delphi XE7 だと OK で,Delphi 6 だとエラー発生
のようです.SaveToStream なのかな ?
調べてみないと分かりませんね.

ところで,サーバの障害直ったようですが.
https://my.7artisan.com/serverstatus.php


[10557] Re7:Blobフィールドへの格納方法への質問返信 削除
2016/11/22 (火) 18:16:04 おかぽん
▼ Mr.XRAYさん
> ところで,サーバの障害直ったようですが.
> https://my.7artisan.com/serverstatus.php

情報ありがとうございます。

直っちゃったのか〜・・・絶賛放置中だったのに(^^;)
あんまり放置しすぎて、サーバーへのアクセス方法から調べないと。
・・・という状況です

[10560] Re7:Blobフィールドへの格納方法への質問返信 削除
2016/11/24 (木) 20:02:31 Mr.XRAY
> 本人のレスがあって,Delphi XE7 だと OK で,Delphi 6 だとエラー発生
> のようです.SaveToStream なのかな ?
> 調べてみないと分かりませんね.


以下のコードでやってみました.Window 7 U64(SP1) + Delphi6 Pro(UP2) です.
ただし,JPGE 画像ファイルでのテストです.
画像ファイルを変えて実行してみましたが,エラーは発生しませんでした.
データを読み出して表示するのも行っています.

以下はサンプルに掲載しているコードではなく,
質問されたコードをコピペして,画像の部分だけ変えています.
もちろん,データベースは違いますが...


procedure TForm1.Button1Click(Sender: TObject);
var
  StrText   : String;
  FileStream : TFileStream;
  BlobStream : TStream;
begin
  ADOConnection1.Connected   := False;
  ADOConnection1.LoginPrompt := False;

  StrText := 'Provider=Microsoft.Jet.OLEDB.4.0';
  StrText := StrText + ';Data Source=' + '../BlobTest_BLOB.mdb';

  ADOConnection1.ConnectionString := StrText;
  ADOConnection1.Mode             := cmReadWrite;

  ADODataSet1.Connection := ADOConnection1;

  ADODataSet1.CommandText := 'SELECT * FROM TEST where ID=100 ';
  ADODataSet1.Active := True;
  ADODataSet1.Edit;

  //---------------------------------------------------------------------------
  //  上はデータベースへの接続用コード
  //  以下が実際の書き込みコード
  //---------------------------------------------------------------------------
  try
    BlobStream := ADODataSet1.CreateBlobStream(ADODataSet1.FieldByName('Graphic'), bmWrite);
    FileStream := TFileStream.Create(ExpandFileName('../501.jpg'), fmOpenRead or fmShareDenyNone);
    BlobStream.CopyFrom(FileStream, FileStream.Size);
    FileStream.Free;
    BlobStream.Free;
    ADODataSet1.Post;
  except
    ADODataSet1.Cancel;
  end;
  ADODataSet1.Active := false;
end;




[10556] Re6:Blobフィールドへの格納方法への質問返信 削除
2016/11/22 (火) 13:09:01 SO
▼ おかぽんさん
> ▼ SOさん
> > BlobStream.Free;
> > ADODataSet1.Post;
> > Postする前に解放してるけど???


私と同じボケをしている人がw

>
> 元ネタがどこなのかはわからないのですが・・・
> //TBlobStreamは必ずTable.Editよりも後でCreateしなければならず、
> //Table.Postの前までにFreeしなければならない。


ぃやぁ、CreateBlobStreamが戻り値がクラスポインタと妄想してみたら、
データ使う前に解放してるし...と思った。
オペレーターがコピーしてくれてるのかな?

 
> Mr.XRAY さんの記事もそのようになっていますし。
> 560_画像や RichEdit ワード文書をデータベースで読書き
> http://mrxray.on.coocan.jp/Delphi/plSamples/560_RichEditDB.htm#03


(^_^;)適当すぎてすみません。

きちんと元スレをみると、ポインタ宣言してないし...

[10558] Re7:Blobフィールドへの格納方法への質問返信 削除
2016/11/22 (火) 18:33:08 おかぽん
▼ SOさん
> > 元ネタがどこなのかはわからないのですが・・・
> > //TBlobStreamは必ずTable.Editよりも後でCreateしなければならず、
> > //Table.Postの前までにFreeしなければならない。

実はこれ、結構最近知ったんですよ。

BDE+oracleで長い間開発してきましたが、AnyDAC(現FireDAC)に乗り換えたときに、
ある1箇所で、同じようにTBlobStreamエラーが出るようになりました。
原因がわからなくて、他にTBlobStreamを使っているところと見比べると
TBlobStream.Freeの順番がpostの後にありました。
post前に移動すると、見事に動作しましたが、理由は不明のまま「動けばいいや」で。
そして、最近、なんとなくQAを読んでいて発見したという。

BDEだとpost後でも大丈夫だったんですが、こういう仕様はHelpにしっかり
記載してほしいと思う、今日この頃。

[▼次のスレッド]
INCM/CMT
Cyclamen v3.82