我有一个使用NHibernate连接到PostgreSQL数据库的webapplication。 在其中一个表格中,我有一个包含图像的bytea列。
使用我的webapp我可以插入并阅读这些图像。 我也有一个使用MySQL数据库的版本。
我尝试通过创建插入语句将数据从MySQL数据库转换为PostgreSQL。 这工作正常,但不适用于bytea列。有些图像没问题,有些只是部分可见。
这是我在MySQL中创建的PostgreSQL的insert语句:
select concat("insert into images (code, data) values ('",
CONCAT_WS("', '", code)
, "', decode('", CONVERT(hex(data) USING latin1), "', 'hex'));")
from images
where code is not null and data is not null;
当我使用SQLWorkbench从PostgreSQL保存bytea时,我可以看到图像是正确的。 但是当我使用NHibernate在我的C#应用程序中读取它时,它有时是错误的。 当我将NHibernate的输入流保存到文件时,图像是错误的。
[EDIT1:已添加单元测试] 这是一个显示问题的单元测试:
var item = this.itemDataAccess.Get(helperClass.Code);
var imgData = this.dataDataAccess.GetData(item);
var fdMs = new MemoryStream(imgData.Data);
var img = Image.FromStream(fdMs);
Assert.AreEqual(helperClass.Width, img.Width, "The width of the tiff is not as expected");
当我连接到MySQL数据库时,我得到的图像尺寸正确。当我连接到PostgreSQL数据库时,我得到的图像具有不同的尺寸,原点和像素大小。
[EDIT2:已添加调试结果] 我已经检查了MySQL和PostgreSQL数据库中imgData.Data的长度,它们的长度相同。我将两个流保存到文件并进行比较,看起来几个字节是不同的。我有几个hex10值改为hex13甚至hex14。 我已经调试了npsql,似乎数据被检索为字符串,这可能就是问题。
我没有使用NHibernate的任何花哨的绑定或设置:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
namespace="Data" assembly="Test" default-access="field.camelcase-underscore" default-lazy="false">
<class name="ImageDataDto" table="imageData">
<id name="Id" column="id">
<generator class="assigned" />
</id>
<property name="Code" />
<property name="Data" />
</class>
</hibernate-mapping>
有人有建议吗?