检索以long数据类型存储的图像

时间:2012-07-30 07:55:30

标签: c# oracle10g

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

Column Name       DataType
UserImage         long   

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

如果数据类型是BLOB或CLOB,那么它可能更容易,但它存储的时间很长。

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

请建议我如何实现这一目标。解决方案可能是使用Oracle或C#,我对两者都很好。

提前致谢。

2 个答案:

答案 0 :(得分:1)

您无法以'long'数据类型存储图像。

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

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

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;

答案 1 :(得分:0)

您发布的“块”字符似乎是TIFF图像。这给出了如何存储图像的想法。实际上,二进制图像数据似乎存储为字符数据。这当然完全没有支持,而且非常脆弱。我建议尽快转换它。

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

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

方法1:

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

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

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

方法2:

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