我有一个 Web 应用程序,在 oracle10g 中有一个表,其结构如下:
Column Name DataType
UserImage long
我的问题是我应该如何在以长格式存储的 aspx 页面上显示图像?
如果数据类型是 BLOB 或 CLOB,那么它可能更容易,但它存储在 long 中。
我无法更改数据类型,因为这是第三方数据库。
请建议我如何实现这一目标。解决方案可以使用 Oracle 或 C#,我都可以。
提前致谢。
您不能以“长”数据类型存储图像。
相反 - 保存键值对的静态列表,每对定义图像的索引(例如,从 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;
您发布的“块”字符似乎是 TIFF 图像。这给出了如何存储图像的想法。事实上,二进制图像数据似乎是作为字符数据存储的。这当然是完全不受支持且非常脆弱的。我建议尽快转换它。
同时,我可以提出两种检索数据的方法,因此我不能保证任何一种都有效。
但是方法容易受到字符集的影响:如果涉及两个或多个字符集,您的数据将被转换并因此被破坏。两者都容易受到某些数据类型的最大长度的影响。
方法一:
尝试通过 RAW 数据类型并将其作为字节数组检索。它当然限于 32'000 个字符,甚至可能更少。
SELECT UTL_RAW.CAST_TO_RAW(UserImage) FROM UNNAMED_TABLE WHERE ...
在 C# 方面,您应该获得一个OracleBinary或byte[]
实例。
方法二:
尝试将其作为字符串检索。然后使用原始编码( Encoding.GetBytes )将字符串转换为字节数组。运气好的话,可以恢复原始数据。