C# 检索长数据类型中存储的图像

C# 检索长数据类型中存储的图像,c#,oracle10g,C#,Oracle10g,我有一个web应用程序,在oracle10g中有一个表,具有以下结构: Column Name DataType UserImage long 我的问题是,如何在我的aspx页面上显示以长格式存储的图像 若数据类型是BLOB或CLOB,那个么它可能更简单,但它存储在long中 我无法更改数据类型,因为这是第三方数据库 请告诉我如何才能做到这一点。解决方案可以是使用Oracle或C#,两者我都可以 提前谢谢 不能将图像存储在“long”数据类型中 相反,保留一个

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

Column Name       DataType
UserImage         long   
我的问题是,如何在我的aspx页面上显示以长格式存储的图像

若数据类型是BLOB或CLOB,那个么它可能更简单,但它存储在long中

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

请告诉我如何才能做到这一点。解决方案可以是使用Oracle或C#,两者我都可以


提前谢谢

不能将图像存储在“long”数据类型中

相反,保留一个静态的键值对列表,每对键值定义一个图像的索引(比如,从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          
以及


不能将映像存储在“long”数据类型中

相反,保留一个静态的键值对列表,每对键值定义一个图像的索引(比如,从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          
以及

您发布的“区块”字符似乎是TIFF图像。这让我们了解了图像的存储方式。事实上,二进制图像数据似乎是作为字符数据存储的。这当然是完全不受支持且非常脆弱的。我建议尽快转换它

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

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

方法1:

尝试遍历原始数据类型并将其作为字节数组检索。它当然被限制为32000个字符,甚至更少

SELECT UTL_RAW.CAST_TO_RAW(UserImage) FROM UNNAMED_TABLE WHERE ...
在C端,您应该得到一个or
byte[]
实例

方法2:

尝试将其作为字符串检索。然后使用原始编码将该字符串转换为字节数组。如果运气好,可以恢复原始数据。

块您发布的字符似乎是TIFF图像。这让我们了解了图像的存储方式。事实上,二进制图像数据似乎是作为字符数据存储的。这当然是完全不受支持且非常脆弱的。我建议尽快转换它

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

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

方法1:

尝试遍历原始数据类型并将其作为字节数组检索。它当然被限制为32000个字符,甚至更少

SELECT UTL_RAW.CAST_TO_RAW(UserImage) FROM UNNAMED_TABLE WHERE ...
在C端,您应该得到一个or
byte[]
实例

方法2:


尝试将其作为字符串检索。然后使用原始编码将字符串转换为字节数组。如果运气好,可以还原原始数据。

LONG
是字符数据类型。因此不能直接用于存储图像。要么图像已编码(例如,在Base 64中)或者数据类型是
LONG RAW
。你能发布一个UserImage列内容的示例吗?@Codo:在数据库中,它显示了一些垃圾字符,这就是我无法复制它的原因。有一个示例代码使用它在数据库端实现了相同的事情,所以有人可以建议我如何实现相同的事情:fo:=utl_file.fopen(fpath,fname,fmode);从asbasign中选择图像到x;utl_file.put_line(fo,x);utl_file.fclose(fo);该代码与您问题中提到的表有何关系?该表是否称为asbasign?如果是,为什么该列称为image而不是UserImage?能否显示其中一些“垃圾”字符?
LONG
是一种字符数据类型。因此它不能直接用于存储图像。要么图像已编码(例如,在Base 64中)或者数据类型是
LONG RAW
。你能发布一个UserImage列内容的示例吗?@Codo:在数据库中,它显示了一些垃圾字符,这就是我无法复制它的原因。有一个示例代码使用它在数据库端实现了相同的事情,所以有人可以建议我如何实现相同的事情:fo:=utl_file.fopen(fpath,fname,fmode);从asbasign中选择图像到x;utl_file.put_line(fo,x);utl_file.fclose(fo);这段代码与您问题中提到的表有什么关系?表名为asbasign吗?如果是,为什么列名为image而不是UserImage?您能显示一些“垃圾”吗字符?感谢您的解决方案,但它会抛出损坏的图像,即黑色背景的图像。然后,您需要仔细调查是否已收到完整的图像,它是否仍然具有相同的长度,是否所有字节都与原始字节匹配等,并可能尝试不同的方法。您使用了哪种方法?BTW:甚至可能数据库中的图像是无效的,因为某些转换(如换行符转换)发生在im上