Thanks for the previous help. I am having difficulty getting images from the database still. I have managed to use NHibernate and the class below to put them in the database but when i try the query mentioned towards teh bottom of this post I cannot retrive location objects. I can retrive them if the image is null (not set) but if it is i cannot retrive the object.
Code:
namespace Model
{
[Class(Table = "Locations")]
public class Location : ILocation
{
long _primKey = 0;
string _name;
Image _image;
/// <summary>
/// A default no-args constructor for NHibernate reflection.
/// </summary>
public Location() { }
/// <summary>
/// Gets the unique identifier of this object, surrogat key.
/// </summary>
[Id(Name = "PrimKey")]
[Generator(1, Class = "increment")]
public virtual long PrimKey
{
get { return _primKey; }
set { _primKey = value; }
}
/// <summary>
/// The name of the attraction
/// </summary>
[Property(NotNull = true)]
public string Name
{
get { return _name; }
set { _name = value; }
}
/// <summary>
/// This attribute provides the image displayed, representing the location on the map the location belongs to.
/// </summary>
[Property(NotNull = true)]
[Column(2, Name = "Image", SqlType = "image")]
public Image Image
{
get { return _image; }
set { _image = value; }
}
}
}
The code above produces the following mapping
Code:
<?xml version="1.0" encoding="utf-8"?>
<!--Generated from NHibernate.Mapping.Attributes on 2007-01-28 13:09:07Z.-->
<hibernate-mapping default-access="field.camelcase-underscore" xmlns="urn:nhibernate-mapping-2.0">
<class name="Model.Location, Model" table="Locations">
<id name="PrimKey">
<generator class="increment" />
</id>
<property name="Name" not-null="true" />
<property name="Image" not-null="true">
<column name="Image" sql-type="varbinary" />
</property>
</class>
....
That code works fine when getting a Location from the database that doesn't have an image set. Ones that have an image set give the following error:
Code:
NHibernate.ADOException: Could not execute query ---> NHibernate.Type.SerializationException: Could not deserialize a serializable property: ---> System.Runtime.Serialization.SerializationException: End of Stream encountered before parsing was completed.
at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run()
at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream)
at NHibernate.Type.SerializableType.FromBytes(Byte[] bytes)
--- End of inner exception stack trace ---
at NHibernate.Type.SerializableType.FromBytes(Byte[] bytes)
at NHibernate.Type.SerializableType.Get(IDataReader rs, Int32 index)
at NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String name)
at NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String[] names, ISessionImplementor session, Object owner)
at NHibernate.Type.AbstractType.Hydrate(IDataReader rs, String[] names, ISessionImplementor session, Object owner)
at NHibernate.Loader.Loader.Hydrate(IDataReader rs, Object id, Object obj, ILoadable persister, ISessionImplementor session, String[][] suffixedPropertyColumns)
at NHibernate.Loader.Loader.LoadFromResultSet(IDataReader rs, Int32 i, Object obj, Key key, String suffix, LockMode lockMode, ILoadable rootPersister, ISessionImplementor session)
at NHibernate.Loader.Loader.InstanceNotYetLoaded(IDataReader dr, Int32 i, ILoadable persister, String suffix, Key key, LockMode lockMode, Key optionalObjectKey, Object optionalObject, IList hydratedObjects, ISessionImplementor session)
at NHibernate.Loader.Loader.GetRow(IDataReader rs, ILoadable[] persisters, String[] suffixes, Key[] keys, Object optionalObject, Key optionalObjectKey, LockMode[] lockModes, IList hydratedObjects, ISessionImplementor session)
at NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader resultSet, ISessionImplementor session, QueryParameters queryParameters, IList hydratedObjects, Object optionalObject, Object optionalId, Key[] keys, Boolean returnProxies)
at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Object optionalObject, Object optionalId, Object[] optionalCollectionKeys, Boolean returnProxies)
at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Object optionalObject, Object optionalId, Object[] optionalCollectionKeys, Boolean returnProxies)
at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)
at NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet querySpaces, IType[] resultTypes)
at NHibernate.Hql.QueryTranslator.List(ISessionImplementor session, QueryParameters queryParameters)
at NHibernate.Impl.SessionImpl.Find(String query, QueryParameters parameters)
--- End of inner exception stack trace ---
at NHibernate.Impl.SessionImpl.Find(String query, QueryParameters parameters)
at NHibernate.Impl.QueryImpl.List()
at NHibernate_Controller.HibernateConfiguration.Query(String queryStr) in C:\Visual_Studio_Projects\hibernate_advanced_example\Model\Hibernate_Controller\HibernateConfiguration.cs:line 84
at Model.Query.MapDetails.GetMapObjects(Int32 mapId, String filter) in C:\Visual_Studio_Projects\hibernate_advanced_example\Model\Model\Query\MapDetails.cs:line 47
at Service.GetMapObjects(String name, String country) in c:\Inetpub\wwwroot\Hibernate_Advanced_Example\App_Code\Service.cs:line 85
(irrelevant i think) The query i am using to get this is: "select l from location as l";
The file I put into the database was a gif file and the database being used is mssql2005
I have tried using varbinary(max) and using image as the database type but this did not seem to make a difference.
Thanks for any help in advance.