2011-10-07 148 views
-1

查看更多:MySQLStore 大家好。c#nhibernate fluent mysql

我用C#+ NHibernate的流利+ + mysql的一个proyect

我不明白为什么我要在HBM XML文件的映射表,当这些信息在数据库中,而这是其他讨论。

我proyect包含存储过程这个文件HBM

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="PigCsharp.Entities" assembly="PigCsharp"> 
    <sql-query name="getparametersbyparameter"> 
    <query-param name="iParameter" type="string" /> 
    <return class="mntparameters"> 
     <return-property column="mntparameters.ident" name="ident" /> 
     <return-property column="mntparameters.User" name="User" /> 
     <return-property column="mntparameters.Role" name="Role" /> 
     <return-property column="mntparameters.Parameter" name="Parameter" /> 
     <return-property column="mntparameters.value" name="value" /> 
     <return-property column="mntparameters.Module" name="Module" /> 
    </return> 
    exec getparametersbyparameter @iParameter = :iParameter 
    <!--{ call getparametersbyparameter(:iParameter) }--> 
    </sql-query> 
</hibernate-mapping> 

当我运行我的代码在C#

string param = "getDefaultDatabase"; 
       var query = session.GetNamedQuery("getparametersbyparameter") 
       .SetParameter<string>("iParameter", param).List<mntparameters>(); 

我有这样的例外

No se controló NHibernate.Exceptions.GenericADOException 
    Message=could not execute query 
[ exec getparametersbyparameter @iParameter = ?p0 ] 
    Name:iParameter - Value:getDefaultDatabase 
[SQL: exec getparametersbyparameter @iParameter = ?p0] 
    Source=NHibernate 
    SqlString=exec getparametersbyparameter @iParameter = ?p0 
    StackTrace: 
     en NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs:línea 1703 
     en NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters) en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs:línea 1601 
     en NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet`1 querySpaces, IType[] resultTypes) en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs:línea 1595 
     en NHibernate.Loader.Custom.CustomLoader.List(ISessionImplementor session, QueryParameters queryParameters) en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Custom\CustomLoader.cs:línea 272 
     en NHibernate.Impl.SessionImpl.ListCustomQuery(ICustomQuery customQuery, QueryParameters queryParameters, IList results) en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\SessionImpl.cs:línea 2052 
     en NHibernate.Impl.SessionImpl.List(NativeSQLQuerySpecification spec, QueryParameters queryParameters, IList results) en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\SessionImpl.cs:línea 2035 
     en NHibernate.Impl.SessionImpl.List[T](NativeSQLQuerySpecification spec, QueryParameters queryParameters) en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\SessionImpl.cs:línea 2021 
     en NHibernate.Impl.SqlQueryImpl.List[T]() en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\SqlQueryImpl.cs:línea 163 
     en PigCsharp.forms.FrmMDIExpedientacion.FrmMDIExpedientacion_Load(Object sender, EventArgs e) en C:\Code\PigCsharp\PigCsharp\forms\frmMDIExpedientacion.cs:línea 778 
     en System.Windows.Forms.Form.OnLoad(EventArgs e) 
     en System.Windows.Forms.Form.OnCreateControl() 
     en System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible) 
     en System.Windows.Forms.Control.CreateControl() 
     en System.Windows.Forms.Control.WmShowWindow(Message& m) 
     en System.Windows.Forms.Control.WndProc(Message& m) 
     en System.Windows.Forms.ScrollableControl.WndProc(Message& m) 
     en System.Windows.Forms.Form.WmShowWindow(Message& m) 
     en System.Windows.Forms.Form.WndProc(Message& m) 
     en System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
     en System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
     en System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
     en System.Windows.Forms.UnsafeNativeMethods.SendMessage(HandleRef hWnd, Int32 msg, Int32 wParam, Int32 lParam) 
     en System.Windows.Forms.Form.SetVisibleCore(Boolean value) 
     en System.Windows.Forms.Control.set_Visible(Boolean value) 
     en System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
     en System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
     en System.Windows.Forms.Application.Run(Form mainForm) 
     en PigCsharp.forms.submain.Main() en C:\Code\PigCsharp\PigCsharp\main\submail.cs:línea 29 
     en System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     en System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     en Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     en System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     en System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
     en System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     en System.Threading.ThreadHelper.ThreadStart() 
    InnerException: MySql.Data.MySqlClient.MySqlException 
     Message=Fatal error encountered during command execution. 
     Source=MySql.Data 
     ErrorCode=-2147467259 
     Number=0 
     StackTrace: 
      en MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) 
      en MySql.Data.MySqlClient.MySqlCommand.ExecuteDbDataReader(CommandBehavior behavior) 
      en System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader() 
      en NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd) en d:\CSharp\NH\NH\nhibernate\src\NHibernate\AdoNet\AbstractBatcher.cs:línea 247 
      en NHibernate.Loader.Loader.GetResultSet(IDbCommand st, Boolean autoDiscoverTypes, Boolean callable, RowSelection selection, ISessionImplementor session) en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs:línea 1349 
      en NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs:línea 413 
      en NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs:línea 243 
      en NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) en d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs:línea 1694 
     InnerException: MySql.Data.MySqlClient.MySqlException 
      Message=Parameter '@iParameter' must be defined. 
      Source=MySql.Data 
      ErrorCode=-2147467259 
      Number=0 
      StackTrace: 
       en MySql.Data.MySqlClient.Statement.SerializeParameter(MySqlParameterCollection parameters, MySqlPacket packet, String parmName) 
       en MySql.Data.MySqlClient.Statement.InternalBindParameters(String sql, MySqlParameterCollection parameters, MySqlPacket packet) 
       en MySql.Data.MySqlClient.Statement.BindParameters() 
       en MySql.Data.MySqlClient.PreparableStatement.Execute() 
       en MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) 
      InnerException: 

请你能帮助我。

Regards

+1

如果您使用的是流利NHibernate,您应该使用Mappings来创建表和类之间的关系,而不是hbm文件... – Marco

回答

1

首先,马可的权利;如果你有Fluent,你应该使用派生自ClassMap的类而不是HBM来获取绝大多数的域映射。但是,指定一个命名查询是Fluent不会执行的,因此HBM就是您所需要的。至于为什么当数据库已经知道模式并被消费者发现时,为什么NHibernate需要这些信息,首先,使用诸如systables/sysobjects/syscolumns之类的视图以编程方式生成模式模型的过程可能非常耗时,其次,它只是方程的一半;当指定映射时,您告诉NHibernate您感兴趣的模式的哪一部分以及您的域的每个字段或属性如何转换为模式字段。这并不总是一个明显的转换。

无论如何,你的问题。该错误基本上表明该参数并未将其放入SQL字符串中;而是使用了占位符,这是数据库无法理解的。我会很好地看看你如何指定参数,但不幸的是我没有看到任何明显的错误。