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

3

我对这个问题已经苦思冥想了一段时间,但是我对出错的原因毫无头绪。

概述:我在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异常:“无法执行查询\r\n[ SELECT * FROM Stats_Table ]\r\n[SQL: SELECT * FROM Stats_Table]”,并且还有一个InnerException异常:“输入字符串格式不正确。”
StackTrace:

在System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)方法中, 在System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)方法中, 在System.String.System.IConvertible.ToInt32(IFormatProvider provider)方法中, 在System.Convert.ToInt32(Object value)方法中, 在NHibernate.Type.PersistentEnumType.SystemInt32EnumConverter.Convert(Object input)方法中(位于p:\nhibernate-core\src\NHibernate\Type\PersistentEnumType.cs的第88行), 在NHibernate.Type.PersistentEnumType.AbstractEnumConverter`1.ToObject(Type enumClass, Object code)方法中(位于p:\nhibernate-core\src\NHibernate\Type\PersistentEnumType.cs的第33行), 在NHibernate.Type.PersistentEnumType.GetInstance(Object code)方法中(位于p:\nhibernate-core\src\NHibernate\Type\PersistentEnumType.cs的第203行), 在NHibernate.Type.PersistentEnumType.Get(IDataReader rs, Int32 index)方法中(位于p:\nhibernate-core\src\NHibernate\Type\PersistentEnumType.cs的第189行), 在NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String name)方法中(位于p:\nhibernate-core\src\NHibernate\Type\NullableType.cs的第253行), 在NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String[] names, ISessionImplementor session, Object owner)方法中(位于p:\nhibernate-core\src\NHibernate\Type\NullableType.cs的第195行), 在NHibernate.Type.AbstractType.Hydrate(IDataReader rs, String[] names, ISessionImplementor session, Object owner)方法中(位于p:\nhibernate-core\src\NHibernate\Type\AbstractType.cs的第131行), 在NHibernate.Persister.Entity.AbstractEntityPersister.Hydrate(IDataReader rs, Object id, Object obj, ILoadable rootLoadable, String[][] suffixedPropertyColumns, Boolean allProperties, ISessionImplementor session)方法中(位于p:\nhibernate-core\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs的第2518行), 在NHibernate.Loader.Loader.LoadFromResultSet(IDataReader rs, Int32 i, Object obj, String instanceClass, EntityKey key, String rowIdAlias, LockMode lockMode, ILoadable rootPersister, ISessionImplementor session)方法中(位于p:\nhibernate-core\src\NHibernate\Loader\Loader.cs的第989行), 在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行), 在NHibernate.Loader.Loader.GetRow(IDataReader rs, ILoadable[] persisters, EntityKey[] keys, Object optionalObject, EntityKey optionalObjectKey, LockMode[] lockModes, IList hydratedObjects, ISessionImplementor session)方法中(位于p:\nhibernate-core\src\NHibernate\Loader\Loader.cs的第876行), 在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行), 在NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)方法中(位于p:\nhibernate-core\src\NHibernate\Loader\Loader.cs的第473行), 在NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)方法中(位于p:\nhibernate-core\src\NHibernate\Loader\Loader.cs的第251行), 在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行 在p:\ nhibernate-core \ src \ NHibernate \ Loader \ Loader.cs的NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session,QueryParameters queryParameters)中的第1472行 在p:\ nhibernate-core \ src \ NHibernate \ Loader \ Loader.cs的NHibernate.Loader.Loader.List(ISessionImplementor session,QueryParameters queryParameters,ISet`1 querySpaces,IType [] resultTypes)中的第1467行 在p:\ nhibernate-core \ src \ NHibernate \ Loader \ Custom \ CustomLoader.cs的NHibernate.Loader.Custom.CustomLoader.List(ISessionImplementor session,QueryParameters queryParameters)中的第276行 在p:\ nhibernate-core \ src \ NHibernate \ Impl \ SessionImpl.cs的NHibernate.Impl.SessionImpl.ListCustomQuery(ICustomQuery customQuery,QueryParameters queryParameters,IList results)中的第2108行 在p:\ nhibernate-core \ src \ NHibernate \ Impl \ SessionImpl.cs的NHibernate.Impl.SessionImpl.List(NativeSQLQuerySpecification spec,QueryParameters queryParameters,IList results)中的第2091行 在p:\ nhibernate-core \ src \ NHibernate \ Impl \ SessionImpl.cs的NHibernate.Impl.SessionImpl.List [T](NativeSQLQuerySpecification spec,QueryParameters queryParameters)中的第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 assembly,String [] args) 在System.AppDomain.ExecuteAssembly(String assemblyFile,Evidence assemblySecurity,String [] args) 在Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 在System.Threading.ThreadHelper.ThreadStart_Context(Object state) 在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback callback,Object state,Boolean ignoreSyncCtx) 在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback callback,Object state) 在System.Threading.ThreadHelper.ThreadStart()

我尝试过查看NHibernate的源代码,但没有从中找到任何信息。

非常感谢您提供帮助。


CreateSQLQuery的字符串最好是一个逐字字符串文字,因此请尝试:results = session.CreateSQLQuery(@"SELECT * FROM Stats_Table")。另一种方法是:results = session.CreateSQLQuery(@"select {st.*} from stats_table as st") - user1413338
1
似乎没有起作用,但还是值得一试。感谢帮助。 :) - Crabgor
1个回答

7

你的枚举类型 - TResult 可能被保存为字符串值并尝试解析为整数值(从错误消息中猜测)。

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

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

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

或者,将结果列更改为int :)


TResult 实际上在数据库中存储为枚举,但我会尝试一下!谢谢。 - Crabgor
那真的有效。惊喜万分。非常感激! - Crabgor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接