2011-10-07 158 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字符串中;而是使用了佔位符,這是數據庫無法理解的。我會很好地看看你如何指定參數,但不幸的是我沒有看到任何明顯的錯誤。