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

Posted

技术标签:

【中文标题】NHibernate - 无法执行查询 - 输入字符串的格式不正确【英文标题】:NHibernate - Could not execute query - Input string was not in a correct format 【发布时间】:2014-05-08 09:18:37 【问题描述】:

我一直在为这个问题摸不着头脑,但我不知道出了什么问题。

概述:我在 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: "could not execute query\r\n[ SELECT * FROM Stats_Table ]\r\n[SQL: SELECT * FROM Stats_Table]"

出现 InnerException:“输入字符串的格式不正确。”


堆栈跟踪:

at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) 在 System.Number.ParseInt32(String s,NumberStyles 样式,NumberFormatInfo 信息) 在 System.String.System.IConvertible.ToInt32(IFormatProvider 提供程序) 在 System.Convert.ToInt32(对象值) 在 NHibernate.Type.PersistentEnumType.SystemInt32EnumConverter.Convert(Object input) 在 p:\nhibernate-core\src\NHibernate\Type\PersistentEnumType.cs:line 88 在 NHibernate.Type.PersistentEnumType.AbstractEnumConverter`1.ToObject(Type enumClass, Object code) 在 p:\nhibernate-core\src\NHibernate\Type\PersistentEnumType.cs:line 33 在 NHibernate.Type.PersistentEnumType.GetInstance(Object code) 在 p:\nhibernate-core\src\NHibernate\Type\PersistentEnumType.cs:line 203 在 NHibernate.Type.PersistentEnumType.Get(IDataReader rs, Int32 index) 在 p:\nhibernate-core\src\NHibernate\Type\PersistentEnumType.cs:line 189 在 NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String name) 在 p:\nhibernate-core\src\NHibernate\Type\NullableType.cs:line 253 在 NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String[] names, ISessionImplementor session, Object owner) 在 p:\nhibernate-core\src\NHibernate\Type\NullableType.cs:line 195 在 NHibernate.Type.AbstractType.Hydrate(IDataReader rs, String[] names, ISessionImplementor session, Object owner) in p:\nhibernate-core\src\NHibernate\Type\AbstractType.cs:line 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\实体\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 持久化器,EntityKey 键,LockMode lockMode,字符串 rowIdAlias,EntityKey optionalObjectKey,对象 optionalObject,IList hydradObjects,ISessionImplementor 会话)在 p:\nhibernate-core\src\NHibernate \Loader\Loader.cs:第 944 行 在 NHibernate.Loader.Loader.GetRow(IDataReader rs, ILoadable[] 持久化器, EntityKey[] 键, Object optionalObject, EntityKey optionalObjectKey, LockMode[] lockModes, IList hydradObjects, 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 hydradObjects, EntityKey[] 键, 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:line 473 在 NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) 在 p:\nhibernate-core\src\NHibernate\Loader\Loader.cs:line 251 在 NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) 在 p:\nhibernate-core\src\NHibernate\Loader\Loader.cs:line 1564


来自 NHibernate:

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

我已经尝试过浏览 NHibernate 的源代码,但我没有从中找到任何东西。

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

【问题讨论】:

CreateSQLQuery 的字符串最好是逐字字符串文字,因此请尝试:results = session.CreateSQLQuery(@"SELECT * FROM Stats_Table")。另一种方法是:results = session.CreateSQLQuery(@"select st.* from stats_table as st") 似乎不起作用,但值得一试。感谢帮助。 :) 【参考方案1】:

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

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

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

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

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

【讨论】:

TResult 实际上作为枚举存储在数据库中,但我会尝试一下!谢谢 这确实有效。惊喜。非常感谢!

以上是关于NHibernate - 无法执行查询 - 输入字符串的格式不正确的主要内容,如果未能解决你的问题,请参考以下文章

使用 NHibernate 的 Web 服务中的“无法执行查询错误”

使用 NHibernate 作为带有输入参数的命名查询调用存储过程

通过 nhibernate 对数据库查询进行单元测试

NHibernate 多次执行相同的查询

NHibernate 执行简单查询需要更长的时间

无法使用 Nhibernate 的 Linq 检索 Group By 实体或复合键