使用NHibernate从postgresql读取bytea会产生意想不到的结果

时间:2014-10-01 08:58:33

标签: c# postgresql nhibernate npgsql bytea

我有一个使用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>

有人有建议吗?

0 个答案:

没有答案