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

Cra*_*gor 3 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>();
Run Code Online (Sandbox Code Playgroud)

班级:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

映射文件:

<?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>
Run Code Online (Sandbox Code Playgroud)

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

使用InnerException:"输入字符串的格式不正确."


堆栈跟踪:

在System.String.System.IConvertible.ToInt32(IFormatProvider)的System.Number.ParseInt32(String s,NumberStyles样式,NumberFormatInfo信息)处的System.Number.StringToNumber(String str,NumberStyles options,NumberBuffer&number,NumberFormatInfo info,Boolean parseDecimal)提供者)at 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)位于p:\nhibernate-core\src\NHibernate\Type\PersistentEnumType.cs:第33行,位于p:中的NHibernate.Type.PersistentEnumType.GetInstance(Object code) \nhibernate-core\src\NHibernate\Type\PersistentEnumType.cs:位于p:\nhibernate-core\src\NHibernate\Type\PersistentEnumType.cs中的NHibernate.Type.PersistentEnumType.Get(IDataReader rs,Int32 index)的第203行: NHibernate.Type.NullableType.NullSafeGet的第189行(IDataReader rs,String 名称)在p:\nhibernate-core\src\NHibernate\Type\NullableType.cs:第253行,位于p:\nhibernate的NHibernate.Type.NullableType.NullSafeGet(IDataReader rs,String []名称,ISessionImplementor会话,对象所有者) -core\src\NHibernate\Type\NullableType.cs:第195行,位于p:\nhibernate-core\src\NHibernate \中的NHibernate.Type.AbstractType.Hydrate(IDataReader rs,String []名称,ISessionImplementor会话,对象所有者)类型\ AbstractType.cs:线131在NHibernate.Persister.Entity.AbstractEntityPersister.Hydrate(IDataReader的RS,对象ID,对象OBJ,ILoadable rootLoadable,字符串[] [] suffixedPropertyColumns,布尔allProperties,ISessionImplementor会话)的对:\nhibernate-芯\ SRC\NHibernate的\持留\实体\ AbstractEntityPersister.cs:在NHibernate.Loader.Loader.LoadFromResultSet线2518(RS IDataReader的,我的Int32,对象OBJ,字符串instanceClass,的EntityKey键,字符串rowIdAlias,LockMode lockMode,ILoadable rootPersister,ISessionImplementor会话)在p:\nhibernate-core\src\NHibernate\Load中 呃\ Loader.cs:在NHibernate.Loader.Loader.InstanceNotYetLoaded线989在P(IDataReader的医生,我的Int32,ILoadable留存,关键的EntityKey,LockMode lockMode,字符串rowIdAlias,的EntityKey optionalObjectKey,对象optionalObject,IList的hydratedObjects,ISessionImplementor会话): \nhibernate-core\src\NHibernate\Loader\Loader.cs:NHibernate.Loader.Loader.GetRow的第944行(IDataReader rs,ILoadable [] persisters,EntityKey [] keys,Object optionalObject,EntityKey optionalObjectKey,LockMode [] lockModes,的IList hydratedObjects,ISessionImplementor会话)的对:\ NHibernate的核\ SRC\NHibernate的\装载机\ Loader.cs:线876在NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader的结果集和ISessionImplementor会话,queryParameters queryParameters,LockMode [] lockModeArray,的EntityKey optionalObjectKey,IList hydratedObjects,EntityKey [] keys,Boolean returnProxies)在p:\nhibernate-core\src\NHibernate\Loader\Loader.cs:第342行NHibernate.Loader.Loader.DoQuery(ISessionImplementor session,Q ueryParameters queryParameters,布尔returnProxies)的对:\ NHibernate的核\ SRC\NHibernate的\装载机\ Loader.cs:线473在NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor会话,QueryParameters queryParameters,布尔returnProxies)的对:\nhibernate- core\src\NHibernate\Loader\Loader.cs:位于p:\nhibernate-core\src\NHibernate\Loader\Loader.cs的NHibernate.Loader.Loader.DoList(ISessionImplementor session,QueryParameters queryParameters)第251行:第1564行


从NHibernate:

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

我试过浏览NHibernate的源代码,但我没有想到任何东西.

任何有关这方面的帮助将不胜感激.

Mar*_*nst 6

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

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

<property name="Result" column="Result" type="NHibernate.Type.EnumStringType`1[[MyNamespace.TResult, MyAssembly]], NHibernate"/>
Run Code Online (Sandbox Code Playgroud)

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

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