NHibernate 2 + NHibernate.JetDriver + MS Access:如何访问表的“附件”字段
Posted
技术标签:
【中文标题】NHibernate 2 + NHibernate.JetDriver + MS Access:如何访问表的“附件”字段【英文标题】:NHibernate 2 + NHibernate.JetDriver + MS Access: how to access 'attachment' field of table 【发布时间】:2013-07-07 22:29:36 【问题描述】:这是我在 *** 上的第一个问题!
我在我的 vb.net 项目中使用 NHibernate 2 我还使用 NHibernate.JetDriver 来访问 MS Access 数据库
我有一个名为 tblPeople 的表,它有一个名为“PersonImage”的字段,它属于“附件”字段类型
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
namespace="BusinessModel" assembly="NHibernateDemo">
<class name="clsPeople" table="tblPeople">
<id name="ID">
<column name="[ID]" sql-type="int" not-null="true" />
</id>
....
<property name="Image">
<column name="[PersonImage]" sql-type="ntext/nvarchar/varbinary/?????" />
<!--varbinary(max)-->
</property>
</class>
</hibernate-mapping>
这是课程
Namespace BusinessModel
Public Class clsPeople
Public Overridable Overloads Property ID() As Integer
Public Overridable Overloads Property Image() As [byte()/String/String/**?????**]
End Class
End Namespace
关于为映射选择什么数据类型以便从表中获取实际图像的任何想法?
任何对正确方向的帮助都会让我开心!
我什至尝试过使用休眠 3 和自定义编译的 JetDriver,但无论我做什么,我都会不断出错 无法将 String 类型的字段列中的值转换为 BinaryBlobType 或 Byte[] 或其他类型 除非我把字符串放在我得到的地方;单独的文件名列表,仅此而已!
【问题讨论】:
我找到了这个但我不明白***.com/questions/2141149/… 我也发现了这个,但我不明白我是否应该使用它martinwilley.com/net/code/nhibernate/usertype.html 【参考方案1】:除非真的有必要,否则不必指定 sql-type。相反,您可以将“类型”指定为“字符串”或“AnsiString”。
其次,我强烈建议您使用 NHibernate 的最新版本(目前为 3.3.3)。您也可以考虑其他映射类型,例如按代码映射或属性(但远离流利的 :) PS。我从 freenode IRC 找到了你的问题
【讨论】:
棘手的是如何从字符串转换为图像?我不确定如何使用 3.3.3 版本编译 jetdriver,但我现在正在下载存储库以找出答案。 我用 JetDriver 编译了最新的 nhebernate 3.3.3GA 也没有运气。无论我做什么,我都会不断收到错误“无法将字符串类型的字段列中的值转换为 BinaryBlobType 类型”或“字节 []”或“任何东西”,除非我将字符串放在我得到的地方;单独的文件名列表,仅此而已!似乎发生了这种情况:***.com//questions/6895523/…【参考方案2】:好吧,我想我已经足够接近了!
我在我的 hbm.xml 中使用这个属性
<property name="FileData">
<column name="Image.FileData" />
</property>
我在我的班级 clsPeople 中使用这个属性
Private _FileData As Byte() 公共可重写重载属性 FileData 作为 Byte() 得到 返回 _FileData 结束获取 设置(值作为字节())
If value IsNot Nothing Then Try 'get offset to data Dim offsetbytes As Byte() offsetbytes = SubArray(Of Byte)(value, 0, 4) Dim offset = BitConverter.ToInt32(offsetbytes, 0) Console.WriteLine("offset : " & offset) Dim headerBytes() As Byte = SubArray(Of Byte)(value, 0, offset) 'Dim allbytes() As Byte = CType(value, Byte()) Dim header = BitConverter.ToString(headerBytes, 0) Dim databytes(0 To (value.Length - offset) - 1) As Byte Array.ConstrainedCopy(value, offset, databytes, 0, value.Length - offset) Dim img As Image = ObjToImg(databytes) img.Save("c:\" & Κωδικός_Ακινήτου & ".jpg", ImageFormat.Jpeg) Catch ex As Exception End Try End If _FileData = value End Set End Property
我会及时通知您如何处理一个/多个附加文件
【讨论】:
以上是关于NHibernate 2 + NHibernate.JetDriver + MS Access:如何访问表的“附件”字段的主要内容,如果未能解决你的问题,请参考以下文章