1

次の構造を持つ oracle10g に 1 つのテーブルを持つ 1 つの Web アプリケーションがあります。

Column Name       DataType
UserImage         long   

私の問題は、長い形式で保存されている aspx ページに IMAGE を表示するにはどうすればよいですか?

データ型が BLOB または CLOB の場合は簡単ですが、long に格納されます。

これはサードパーティの DB であるため、データ型を変更できませんでした。

どうすればこれを達成できるか教えてください。ソリューションは、Oracle または C# のいずれかを使用することができます。私はどちらでも問題ありません。

前もって感謝します。

4

2 に答える 2

1

イメージを「long」データ型に格納することはできません。

代わりに、キーと値のペアの静的リストを保持します。各ペアは画像のインデックス (たとえば、1 から n) を定義し、値は画像のファイル名を保持します。

たとえば、次の疑似コードは同様のアプローチを示しています (DB ではなく、アプリケーションのクライアント/サーバー側に実装する必要があります)。

SWITCH (USERIMAGE)
    CASE 1:
         SETIMAGE("IMAGES/IMAGE_NUMBER_ONE.JPG");
         BREAK:
    CASE 2:
         SETIMAGE("IMAGES/IMAGE_NUMBER_TWO.JPG");
         BREAK:

等々。

別の解決策:

最初のテーブルが「Table1」と呼ばれているとします。データベースに my_images という新しいテーブルを作成します

Column name     Column type       Comments
UserImage       LONG              Foreign key to Table1.UserImage
ImageData       BLOB          

と、

SELECT t1.ImageData FROM Table1 t1, my_images mi 
WHERE t1.UserImage == mi.UserImage;
于 2012-07-30T07:58:06.470 に答える
0

あなたが投稿した「チャンク」文字は TIFF 画像のようです。これにより、画像がどのように保存されているかがわかります。実際には、バイナリ イメージ データは文字データとして格納されているようです。それは確かに完全にサポートされておらず、非常に壊れやすいものです。早めに変換することをお勧めします。

それまでの間、データを取得する 2 つの方法を提案できるので、どちらかが機能することを保証することはできません。

ただし、アプローチは文字セットの影響を受けやすくなります。2 つ以上の文字セットが関係している場合、データは変換され、それによって破壊されます。また、どちらも特定のデータ型の最大長の影響を受けやすくなっています。

アプローチ 1:

RAW データ型を経由して、バイト配列として取得してみてください。確かに 32,000 文字に制限されていますが、それよりも少ないかもしれません。

SELECT UTL_RAW.CAST_TO_RAW(UserImage) FROM UNNAMED_TABLE WHERE ...

C# 側では、OracleBinaryまたはbyte[]インスタンスを取得する必要があります。

アプローチ 2:

文字列として取得してみてください。次に、元のエンコーディング ( Encoding.GetBytes ) を使用して文字列をバイト配列に変換します。運が良ければ、元のデータを復元できます。

于 2012-07-30T10:07:19.070 に答える