NHibernate - 无法执行查询 - 输入字符串的格式不正确

时间:2014-03-28 18:46:19

标签: c# mysql nhibernate orm

我现在已经用这个问题摸不着头脑了,我对于什么是错误一无所知。

概述:我在MySQL数据库中有两个表。两者都正确映射到数据库(我可以加载数据),我可以查询一个表,但不能查询另一个表。

我已经研究过的解决方案:在表和C#代码之间键入转换问题,映射问题,SQL格式问题。

失败的代码如下:

Configuration config = new Configuration();
config.Configure();
ISessionFactory sessionFactory = config.BuildSessionFactory();
var schema = new SchemaUpdate(config);
schema.Execute(true, true);
results = session.CreateSQLQuery("SELECT * FROM Stats_Table") // Exception thrown here
    .AddEntity(typeof(TestStats))
    .List<TestStats>();

班级:

public class Stats
{
    public virtual Guid      Id        { get; set; }
    public virtual Guid      TestId    { get; set; }
    public virtual String    Name      { get; set; }
    public virtual TResult   Result    { get; set; }
    public virtual DateTime? Timestamp { get; set; }
    public virtual UInt32    Duration  { get; set; }
    public virtual String    Notes     { get; set; }

    public Stats() 
    {
    }

    public Stats(TestCase tc, TResult Res, DateTime? Time, UInt32 Dura, String ResultNote="")
    {
        Id = Guid.NewGuid();
        TestId = tc.Id;
        Name = tc.TestName;
        Result = Res;
        Timestamp = Time;
        Duration = Dura;
        Notes = ResultNote;
    }

    public Stats(Guid T_Id, string Name, TResult Res, DateTime? Time, UInt32 Dura, String ResultNote="")
    {
        Id = Guid.NewGuid();
        TestId = T_Id;
        Name = Name;
        Result = Res;
        Timestamp = Time;
        Duration = Dura;
        Notes = ResultNote;
    }
}

映射文件:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="Test_Database"
                   namespace="Test_Database.TestClasses">
  <class name="Test_Database.TestClasses.Stats"
         table="Stats_Table"
         lazy="true">

    <id name="Id" column="ID" type="Guid">
      <generator class="assigned" />
    </id>

    <property name="TestId"    column="TestID" />
    <property name="Name"      column="Name" />
    <property name="Result"    column="Result" />
    <property name="Timestamp" column="Timestamp" />
    <property name="Duration"  column="Duration" />
    <property name="Notes"     column="Notes" />

  </class>
</hibernate-mapping>

我得到一个NHibernate GenericADOException:&#34;无法执行查询\ r \ n [SELECT * FROM Stats_Table] \ r \ n [SQL:SELECT * FROM Stats_Table]&#34;

使用InnerException:&#34;输入字符串的格式不正确。&#34;


堆栈跟踪:

at System.Number.StringToNumber(String str,NumberStyles options,NumberBuffer&amp; number,NumberFormatInfo info,Boolean parseDecimal)    在System.Number.ParseInt32(String s,NumberStyles样式,NumberFormatInfo信息)    在System.String.System.IConvertible.ToInt32(IFormatProvider提供程序)    在System.Convert.ToInt32(对象值)    at NHibernate.Type.PersistentEnumType.SystemInt32EnumConverter.Convert(Object input)in p:\ nhibernate-core \ src \ NHibernate \ Type \ PersistentEnumType.cs:line 88    at NHibernate.Type.PersistentEnumType.AbstractEnumConverter`1.ToObject(Type enumClass,Object code)in p:\ nhibernate-core \ src \ NHibernate \ Type \ PersistentEnumType.cs:line 33    at NHibernate.Type.PersistentEnumType.GetInstance(Object code)in p:\ nhibernate-core \ src \ NHibernate \ Type \ PersistentEnumType.cs:line 203    at NHibernate.Type.PersistentEnumType.Get(IDataReader rs,Int32 index)在p:\ nhibernate-core \ src \ NHibernate \ Type \ PersistentEnumType.cs:第189行    at NHibernate.Type.NullableType.NullSafeGet(IDataReader rs,String name)在p:\ nhibernate-core \ src \ NHibernate \ Type \ NullableType.cs:第253行    at NHibernate.Type.NullableType.NullSafeGet(IDataReader rs,String [] names,ISessionImplementor session,Object owner)在p:\ nhibernate-core \ src \ NHibernate \ Type \ NullableType.cs:第195行    at NHibernate.Type.AbstractType.Hydrate(IDataReader rs,String [] names,ISessionImplementor session,Object owner)在p:\ nhibernate-core \ src \ NHibernate \ Type \ AbstractType.cs:第131行    at NHibernate.Persister.Entity.AbstractEntityPersister.Hydrate(IDataReader rs,Object id,Object obj,ILoadable rootLoadable,String [] [] suffixedPropertyColumns,Boolean allProperties,ISessionImplementor session)in p:\ nhibernate-core \ src \ NHibernate \ Persister \ Entity \ AbstractEntityPersister.cs:第2518行    at NHibernate.Loader.Loader.LoadFromResultSet(IDataReader rs,Int32 i,Object obj,String instanceClass,EntityKey key,String rowIdAlias,LockMode lockMode,ILoadable rootPersister,ISessionImplementor session)in p:\ nhibernate-core \ src \ NHibernate \ Loader \ Loader.cs:第989行    at NHibernate.Loader.Loader.InstanceNotYetLoaded(IDataReader dr,Int32 i,ILoadable persister,EntityKey key,LockMode lockMode,String rowIdAlias,EntityKey optionalObjectKey,Object optionalObject,IList hydratedObjects,ISessionImplementor session)在p:\ nhibernate-core \ src \ NHibernate中\ Loader \ Loader.cs:第944行    at NHibernate.Loader.Loader.GetRow(IDataReader rs,ILoadable [] persisters,EntityKey [] keys,Object optionalObject,EntityKey optionalObjectKey,LockMode [] lockModes,IList hydratedObjects,ISessionImplementor session)in p:\ nhibernate-core \ src \ NHibernate \ Loader \ Loader.cs:第876行    at NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader resultSet,ISessionImplementor session,QueryParameters queryParameters,LockMode [] lockModeArray,EntityKey optionalObjectKey,IList hydratedObjects,EntityKey [] keys,Boolean returnProxies)p:\ nhibernate-core \ src \ NHibernate \ Loader \ Loader.cs:第342行    at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session,QueryParameters queryParameters,Boolean returnProxies)在p:\ nhibernate-core \ src \ NHibernate \ Loader \ Loader.cs:第473行    at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session,QueryParameters queryParameters,Boolean returnProxies)在p:\ nhibernate-core \ src \ NHibernate \ Loader \ Loader.cs:第251行    at NHibernate.Loader.Loader.DoList(ISessionImplementor session,QueryParameters queryParameters)在p:\ nhibernate-core \ src \ NHibernate \ Loader \ Loader.cs:第1564行


来自NHibernate:

位于p:\ nhibernate-core \ src \ NHibernate \ Loader \ Loader.cs中的NHibernate.Loader.Loader.DoList(ISessionImplementor session,QueryParameters queryParameters):第1573行    at NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session,QueryParameters queryParameters)in p:\ nhibernate-core \ src \ NHibernate \ Loader \ Loader.cs:line 1472    at NHibernate.Loader.Loader.List(ISessionImplementor session,QueryParameters queryParameters,ISet`1 querySpaces,IType [] resultTypes)in p:\ nhibernate-core \ src \ NHibernate \ Loader \ Loader.cs:line 1467    at NHibernate.Loader.Custom.CustomLoader.List(ISessionImplementor session,QueryParameters queryParameters)在p:\ nhibernate-core \ src \ NHibernate \ Loader \ Custom \ CustomLoader.cs:第276行    at NHibernate.Impl.SessionImpl.ListCustomQuery(ICustomQuery customQuery,QueryParameters queryParameters,IList results)p:\ nhibernate-core \ src \ NHibernate \ Impl \ SessionImpl.cs:line 2108    at NHibernate.Impl.SessionImpl.List(NativeSQLQuerySpecification规范,QueryParameters queryParameters,IList结果)在p:\ nhibernate-core \ src \ NHibernate \ Impl \ SessionImpl.cs:第2091行    at NHibernate.Impl.SessionImpl.List [T](NativeSQLQuerySpecification规范,QueryParameters queryParameters)在p:\ nhibernate-core \ src \ NHibernate \ Impl \ SessionImpl.cs:第2077行    在p:\ nhibernate-core \ src \ NHibernate \ Impl \ SqlQueryImpl.cs中的NHibernate.Impl.SqlQueryImpl.ListT:第163行    在C:\ Users \ cryan \ Documents \ Visual Studio 2010 \ Projects \ TestManager_Database \ TestManager_Database \ Program.cs中的TestManager_Database.Program.Main(String [] args):第287行    在System.AppDomain._nExecuteAssembly(RuntimeAssembly程序集,String [] args)    在System.AppDomain.ExecuteAssembly(String assemblyFile,Evidence assemblySecurity,String [] args)    在Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()    在System.Threading.ThreadHelper.ThreadStart_Context(对象状态)    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback callback,Object state,Boolean ignoreSyncCtx)    在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回调,对象状态)    在System.Threading.ThreadHelper.ThreadStart()

我已尝试浏览NHibernate的源代码,但我没有从中找到任何结果。

对此的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:5)

您的枚举 - 可能将TResult保存为字符串值并尝试将其解析为int值(从错误消息中猜测)

尝试将结果属性的配置更改为:

<property name="Result" column="Result" type="NHibernate.Type.EnumStringType`1[[MyNamespace.TResult, MyAssembly]], NHibernate"/>

其中MyNamespace.TResult,MyAssembly是你的枚举TResult的完全限定名称

或者,将Result列更改为int:)