1

我有一个 Web 应用程序,在 oracle10g 中有一个表,其结构如下:

Column Name       DataType
UserImage         long   

我的问题是我应该如何在以长格式存储的 aspx 页面上显示图像?

如果数据类型是 BLOB 或 CLOB,那么它可能更容易,但它存储在 long 中。

我无法更改数据类型,因为这是第三方数据库。

请建议我如何实现这一目标。解决方案可以使用 Oracle 或 C#,我都可以。

提前致谢。

4

2 回答 2

1

您不能以“长”数据类型存储图像。

相反 - 保存键值对的静态列表,每对定义图像的索引(例如,从 1 到 n),值保存图像的文件名。

例如,下面的伪代码演示了一种类似的方法(应该在应用程序的客户端/服务器端实现,而不是在数据库中

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 图像。这给出了如何存储图像的想法。事实上,二进制图像数据似乎是作为字符数据存储的。这当然是完全不受支持且非常脆弱的。我建议尽快转换它。

同时,我可以提出两种检索数据的方法,因此我不能保证任何一种都有效。

但是方法容易受到字符集的影响:如果涉及两个或多个字符集,您的数据将被转换并因此被破坏。两者都容易受到某些数据类型的最大长度的影响。

方法一:

尝试通过 RAW 数据类型并将其作为字节数组检索。它当然限于 32'000 个字符,甚至可能更少。

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

在 C# 方面,您应该获得一个OracleBinarybyte[]实例。

方法二:

尝试将其作为字符串检索。然后使用原始编码( Encoding.GetBytes )将字符串转换为字节数组。运气好的话,可以恢复原始数据。

于 2012-07-30T10:07:19.070 回答