我对这个问题已经苦思冥想了一段时间,但是我对出错的原因毫无头绪。
概述:我在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