无法使用Nhibernate检索数据

时间:2014-07-31 22:22:41

标签: c# wpf hibernate nhibernate

目标:
将包含三列的行中的数据检索到名为aaa

的类中

问题:
-I检索一条错误消息,告知它不起作用,因为它没有提供足够的错误说明。

- 我认为源代码不正确,无法将数据检索并粘贴到类中。

的信息:
*我正在使用Nhibernate,VS 2013和SQL Server 2012。

enter image description here

NHibernate.exceptions.GenericADOException > InnerException > StackTrace

at System.Data.ProviderBase.FieldNameLookup.GetOrdinal(String fieldName)
at System.Data.SqlClient.SqlDataReader.GetOrdinal(String name)
at NHibernate.Driver.NHybridDataReader.GetOrdinal(String name) in p:\nhibernate-core\src\NHibernate\Driver\NHybridDataReader.cs:line 363
at NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String name) in p:\nhibernate-core\src\NHibernate\Type\NullableType.cs:line 236
at NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String name, ISessionImplementor session, Object owner) in p:\nhibernate-core\src\NHibernate\Type\NullableType.cs:line 287
at NHibernate.Loader.Custom.CustomLoader.ScalarResultColumnProcessor.Extract(Object[] data, IDataReader resultSet, ISessionImplementor session) in p:\nhibernate-core\src\NHibernate\Loader\Custom\CustomLoader.cs:line 458
at NHibernate.Loader.Custom.CustomLoader.ResultRowProcessor.BuildResultRow(Object[] data, IDataReader resultSet, Boolean hasTransformer, ISessionImplementor session) in p:\nhibernate-core\src\NHibernate\Loader\Custom\CustomLoader.cs:line 395
at NHibernate.Loader.Custom.CustomLoader.GetResultColumnOrRow(Object[] row, IResultTransformer resultTransformer, IDataReader rs, ISessionImplementor session) in p:\nhibernate-core\src\NHibernate\Loader\Custom\CustomLoader.cs:line 284
at NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader resultSet, ISessionImplementor session, QueryParameters queryParameters, LockMode[] lockModeArray, EntityKey optionalObjectKey, IList hydratedObjects, EntityKey[] keys, Boolean returnProxies) in p:\nhibernate-core\src\NHibernate\Loader\Loader.cs:line 365
at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) in p:\nhibernate-core\src\NHibernate\Loader\Loader.cs:line 473
at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) in p:\nhibernate-core\src\NHibernate\Loader\Loader.cs:line 251
at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) in p:\nhibernate-core\src\NHibernate\Loader\Loader.cs:line 1564



NHibernate.exceptions.GenericADOException > TargetSite

 at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) in p:\nhibernate-core\src\NHibernate\Loader\Loader.cs:line 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) in p:\nhibernate-core\src\NHibernate\Loader\Custom\CustomLoader.cs:line 276
 at NHibernate.Impl.SessionImpl.ListCustomQuery(ICustomQuery customQuery, QueryParameters queryParameters, IList results) in p:\nhibernate-core\src\NHibernate\Impl\SessionImpl.cs:line 2108
 at NHibernate.Impl.SessionImpl.List(NativeSQLQuerySpecification spec, QueryParameters queryParameters, IList results) in p:\nhibernate-core\src\NHibernate\Impl\SessionImpl.cs:line 2091
 at NHibernate.Impl.SessionImpl.List(NativeSQLQuerySpecification spec, QueryParameters queryParameters) in p:\nhibernate-core\src\NHibernate\Impl\SessionImpl.cs:line 2067
 at NHibernate.Impl.SqlQueryImpl.List() in p:\nhibernate-core\src\NHibernate\Impl\SqlQueryImpl.cs:line 127
 at NHibernate.Impl.AbstractQueryImpl.UniqueResult() in p:\nhibernate-core\src\NHibernate\Impl\AbstractQueryImpl.cs:line 960
 at NHibernate.Impl.AbstractQueryImpl.UniqueResult[T]() in p:\nhibernate-core\src\NHibernate\Impl\AbstractQueryImpl.cs:line 947
 at data_layer.NhibernateDataProvider.RetrieveSpecificContactInfoAboutAPerson(Int32 pPK_kund) in c:\arbete\main_system\data_layer\NhibernateDataProvider.cs:line 260
 at usercontrol_kund.UserControl1.txtbox_sok_KeyDown(Object sender, KeyEventArgs e) in c:\arbete\main_system\usercontrol_kund\usercontrol_kund.xaml.cs:line 108
 at System.Windows.Input.KeyEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
 at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
 at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
 at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
 at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
 at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
 at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
 at System.Windows.Input.InputManager.ProcessStagingArea()
 at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
 at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
 at System.Windows.Interop.HwndKeyboardInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawKeyboardActions actions, Int32 scanCode, Boolean isExtendedKey, Boolean isSystemKey, Int32 virtualKey)
 at System.Windows.Interop.HwndKeyboardInputProvider.ProcessKeyAction(MSG& msg, Boolean& handled)
 at System.Windows.Interop.HwndSource.CriticalTranslateAccelerator(MSG& msg, ModifierKeys modifiers)
 at System.Windows.Interop.HwndSource.OnPreprocessMessage(Object param)
 at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
 at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
 at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
 at System.Windows.Threading.Dispatcher.Invoke(DispatcherPriority priority, Delegate method, Object arg)
 at System.Windows.Interop.HwndSource.OnPreprocessMessageThunk(MSG& msg, Boolean& handled)
 at System.Windows.Interop.HwndSource.WeakEventPreprocessMessage.OnPreprocessMessage(MSG& msg, Boolean& handled)
 at System.Windows.Interop.ComponentDispatcherThread.RaiseThreadMessage(MSG& msg)
 at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
 at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
 at System.Windows.Threading.Dispatcher.Run()
 at System.Windows.Application.RunDispatcher(Object ignore)
 at System.Windows.Application.RunInternal(Window window)
 at System.Windows.Application.Run(Window window)
 at System.Windows.Application.Run()
 at main_system.App.Main() in c:\arbete\main_system\main_system\obj\Debug\App.g.cs:line 0
 at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
 at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
 at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
 at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
 at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
 at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
 at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
 at System.Threading.ThreadHelper.ThreadStart()





<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="data_layer" namespace="data_layer">
  <sql-query name="ddd">
    <return-scalar column="a" type="int" />
    <return-scalar column="b" type="string" />
    <return-scalar column="c" type="string" />
    exec ddd :Data
  </sql-query>
</hibernate-mapping>


public class aaa
{
    public int a { get; set; }
    public string b { get; set; }
    public string c { get; set; }

}


public ContactInfo RetrieveSpecificContactInfoAboutAPerson(int a)
{
    return _session.GetNamedQuery("ddd").SetInt32("Data", a).UniqueResult<aaa>();       

}

EXTEND:显示更新前的原始部分

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="data_layer" namespace="data_layer">
  <sql-query name="ddd">
    <return-scalar column="a" type="int" />
    <return-scalar column="b" type="string" />
    <return-scalar column="c" type="string" />
    exec ddd :Data
  </sql-query>
</hibernate-mapping>


public class aaa
{
    public int a { get; set; }
    public string b { get; set; }
    public string c { get; set; }

}


public ContactInfo RetrieveSpecificContactInfoAboutAPerson(int a)
{
    return _session.GetNamedQuery("ddd").SetInt32("Data", a).UniqueResult<aaa>();       

}

1 个答案:

答案 0 :(得分:0)

需要进行调整以使其正常运行......

映射应包含传递的参数定义
(检查第一个元素:<query-param name="Data" type="int"/>

<sql-query name="ddd">
    <query-param name="Data" type="int"/>
    <return-scalar column="a" type="int" />
    <return-scalar column="b" type="string" />
    <return-scalar column="c" type="string" />
    exec [dbo].[ddd] :Data
</sql-query>

那应该是NHibernate调用:

var a = 1;
var result = session.GetNamedQuery("ddd")
            .SetInt32("Data", a)
            .SetResultTransformer(Transformers.AliasToBean<aaa>())
            .UniqueResult<aaa>();  

必要的是转换,在NHiernate中称为转换:

 .SetResultTransformer(Transformers.AliasToBean<aaa>())

所有人都像这样击中了SP:

CREATE PROCEDURE ddd    
    @Data int
AS
BEGIN
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT 1 as A, 'B' as b, 'c' as c
END
GO