oracleの blob型を 操作するには?


クルクルマスター  2004-05-27 06:20:58  No: 9153

ORACLE の テーブル(Info)に (Photo)BLOB型を定義し
そこへ JPEGファイルを 格納して
DELPHI で 登録・参照をしたいのですが
テーブル(Info)を TTable、TQueryにて
開くことすらできません。
調べ方が悪いのか、そういう資料等もなく。。。
ムリなんでしょうか?
ちなみに ORACLE9 ⇔ BDE ⇔
DELPHI3 or DELPHI7 ※どちらでも
よろしくお願いします。


hideto  2004-05-27 20:17:04  No: 9154

TBlobField辺りを調べてみては如何でしょうか?
昔以下のようなロジックをテスト的に作成した事がありますので
少しでも参考になればと思い記述しておきます。

DBにJPGを登録する場合
procedure TForm1.Button1Click(Sender: TObject);
var
  ST : TMemoryStream;
begin
  try
    ST := TMemoryStream.Create;
    ST.LoadFromFile('C:\test.jpg');
    with Table1 do
    begin
      Append;
      TBlobField(FieldByName('ファイルデータ')).LoadFromStream(ST);
      Post;
    end;
  finally
    ST.Free;
  end;
end;

DBからBLOBデータを取得する場合は、「LoadFromStream」部分を
「SaveToStream」に変更し、その前後のロジックを適宜変更すれば
良いかと思います。

的外れだったらゴメンなさい!m(_'_)m


クルクルマスター  2004-05-28 05:07:08  No: 9155

hidetoさん ありがとうございます。
私も いろいろ調べた際 そのような コードで
いけると思っていたのですが、、
Table1 がOPENできないんです。。。
基本的なところでコケてるんでしょうか?


hideto  2004-05-28 17:26:44  No: 9156

...これって...
SQL Explorerでそのテーブルを開くとSQL Explorer自体が
コケますか?


クルクルマスター  2004-05-28 19:34:21  No: 9157


おっしゃるとおりです
おかしいでしょうか?


hideto  2004-05-31 18:09:36  No: 9158

テーブルを開く際に、SELECT * FROM ...ではなく、そのBLOBフィールドを
指定して「SELECT BLOB_FIELD FROM ...」の形にした場合も
落ちますか?フィールド数って多かったりします?例えば255個以上の
フィールドが有るとか...

私の場合は、MySQLで同じ現象になった事があり、苦労しました。(^^;)
ちょっと表現が悪いかもしれませんが..
TTableやTQueryではフィールドの数(サイズ!?)に上限があるようです。

そこで私の場合はSQLをわけて各々処理させました。
strSQL1 := "SELECT TESTA FROM A";
strSQL2 := "SELECT TESTB FROM B";
strSQL3 := "SELECT TESTC FROM C";
Query1.SQL.Text := strSQL1;
Query2.SQL.Text := strSQL2;
Query3.SQL.Text := strSQL3;
で各々Openして...
while not Query1.Eof do
begin
  必要な処理を書いて...
    .
    .
    .
  Query1.Next;
  Query2.Next;
  Query3.Next;
end;

こんな感じです。
これが今回の件にも当てはまるかどうかわかりません。


クルクルマスター  2004-06-01 06:02:27  No: 9159

hidetoさん すいません つきあってもらって。
hidetoさんの解答でピンと来るものがあり
OPENできるようになりました!!
結局 BDEのNativeのOracleドライバ 設定変更でした。
ウチでは、SQLORA32.DLLを使ってるんです。
SQLORA8.DLLは OK

あとは 作りこみだけ。と思いきや

  JPG := TJPEGImage.Create;

  PhotoQuery.Close;
  PhotoQuery.SQL.Clear;
  PhotoQuery.SQL.Add('select NO,PHOTO FROM INFO');
  PhotoQuery.Open;

  PhotoQuery.First;

  { BLOB ストリームを作成 }
  Strm := TBlobStream.Create(
                         TBlobField(
                       PhotoQuery.FieldByName('PHOTO') as TBlobField
                                   ), bmRead
                             ); ※※※※※※※※※※※※※※※
  try
    JPG.LoadFromStream(Strm);
    Image1.Picture.Assign(JPG);
  finally
    Strm.Free;
    JPG.Free;
  end;

エラー:
「テーブル内の 非BLOB列で操作を実行する必要があります」

が出てしまいます。。。。


hideto  2004-06-01 17:52:43  No: 9160

クルクルマスターさんが記述されている「BLOB ストリームを作成」部分を
Paradoxで実際に試したのですが、問題ないですね。
ParadoxでOKでOracleでNGとなると、設定周りでしょうか...

以下の辺りが参考になりませんでしょうか?

http://www.borland.co.jp/qanda/delphi/d0003477.html

http://forum.nifty.com/fdelphi/faq/00253.htm


クルクルマスター  2004-06-03 03:14:55  No: 9161

hidetoさん ありがとうございます。
んーだめですねぇ
いろいろ BLOB関連の値を変えてみてるんですけど
エラーの意味も???状態なので
むつかしいです。
ORACLE BLOB型 特殊とは 聞いていたんですが、、、


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

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






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