C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 55 を表示中)
■30915 / )  Re[3]: Oracleから取得した画像ファイルの表示について
□投稿者/ 魔界の仮面弁士 (956回)-(2009/01/08(Thu) 21:18:09)
2009/01/08(Thu) 21:35:30 編集(投稿者)
No30905 (ひでき さん) に返信
> OracleConnection connection = new OracleConnection("Data Source=XXX;User ID=XXX;Password=XXX;");
Using / Close は?

> 画面のPictureBoxに表示したい。
Long Raw に、生のバイナリがそのまま格納されているのであれば、
最初の No30893 のコードで、問題無く表示できますよ。


> Accessからリンクを張り
> メニューの「挿入」→「オブジェクト」
> から画像ファイルを選択し、登録を行いました。。
それはつまり、ODBCリンクテーブルに対しての操作ですよね。
Access VBA のアプリならば良いですが、C# アプリで使うのであれば、
その登録方法は避けてください。

Access の[挿入]メニューからの場合、ファイルの生バイナリが挿入されるわけでは無く、
OLE (パッケージャ)オブジェクトとしてのデータ挿入が行われる事になります。
http://support.microsoft.com/kb/884484/ja

このため、データ内に OLE ヘッダ情報が付加されてしまう結果となり、
元ファイルのバイナリとは一致しなくなってしまいます。

データ内容から、元データを予想して取り出す方法もありますが、
そもそもは、ファイルの生バイナリを登録しておくべきでしょう。
http://support.microsoft.com/kb/175261/ja


たとえば、Oracle 上に
 CREATE TABLE XXX (XXX_CODE CHAR(3) PRIMARY KEY, PIC LONG RAW)
なテーブルを用意してあるのだとします。


C# から登録するのであれば、たとえばこんな感じ。

string sql = "INSERT INTO XXX (XXX_CODE, PIC) VALUES (:ID, :IMG)";
using (OracleCommand cmd = new OracleCommand(sql, connection))
{
    OracleParameter ID = cmd.Parameters.Add("ID", OracleType.Char, 3);
    OracleParameter IMG = cmd.Parameters.Add("IMG", OracleType.LongRaw);

    ID.Value = "123";
    IMG.Value = File.ReadAllBytes(@"C:\a.bmp");

    connection.Open();
    cmd.ExecuteNonQuery();
    connection.Close();
}


■No30905 (ひでき さん) に返信
> Oracle専用に登録する手段があるならば
> そちらの方が良いとは思うのですが実行できていません;
生のバイナリを Oracle に登録するための画面は、Access 側には用意されていないので、
SQL で直接指定するか、Access VBA から AppendChunk メソッドを呼び出さねばなりません。


VBA のコードは書いても仕方ないので、SQL の記述例を書いておきます。
(下記では、画像のバイナリデータを 16進数にて指定しています)

****** ODBC リンクテーブルの場合 ******

INSERT INTO リンクテーブル名 (XXX_CODE, PIC) VALUES (
  '123', 
  0x424D860000000000000076000000280000000400000004000000010004000000000010000000C40E0000C40E000000000000000000000000000000008000008000000080800080000000800080008080000080808000C0C0C0000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00AECD000026450000F89B000007130000
)

****** パススルー クエリの場合 ******

INSERT INTO XXX (XXX_CODE, PIC) VALUES (
  '123', 
  HEXTORAW('424D860000000000000076000000280000000400000004000000010004000000000010000000C40E0000C40E000000000000000000000000000000008000008000000080800080000000800080008080000080808000C0C0C0000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00AECD000026450000F89B000007130000')
)

返信 編集キー/


管理者用

- Child Tree -