2014-07-31 3 views
1

Цель:
Получить данные из строки, содержащей три столбца в класс с именем аааНе удается получить данные с NHibernate

Проблема:
-I получить сообщение об ошибке, что он не работает, потому что она не обеспечивает достаточно с объяснением ошибки.

-I считаю, что исходный код неверен для извлечения и вставки данных в класс.

Информация:
* Я использую NHibernate, VS 2013 и SQL сервер 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>();  

} 

ПРОДЛИТЕ: показывая оригинальную часть перед обновлением

<?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>();  

} 
+0

'я получить сообщение об ошибке, что он не work' - удивительный. Можете ли вы вставить трассировку стека и сообщение здесь для нас? –

+0

Саймон, я обновил свежую информацию. –

ответ

0

Там являются коррективы, необходимые для выполнения этого ...

Mapping должен содержать проходящее определение паров
(проверьте первый элемент: <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 
Смежные вопросы