2011-10-07 5 views
-1

더보기 : MySQLStored 안녕하세요.C# nhibernate 유창한 mysql

난 내가이 정보가 데이터베이스에있을 때, HBM XML 파일의 테이블을 매핑해야하는 이유

가 이해가 안 C#을 + NHibernate에 + 유창 + mysql을 가진 proyect을 가지고 있지만, 이것은 다른 토론입니다 .

내 proyect는

<?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> 

가 나는이 예외가

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

C#에서 내 코드를 실행하면

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: 

당신이 나를 도울 수 바랍니다 저장 프로 시저의이 파일 HBM을 포함 .

감사합니다.

+1

Fluent NHibernate를 사용하는 경우 매핑을 사용하여 hbm 파일이 아닌 테이블과 클래스 간의 관계를 만들어야합니다. – Marco

답변

1

우선, Marco 's right; Fluent를 사용하는 경우, 대부분의 도메인 매핑을 위해 HBM 대신 ClassMap에서 파생 된 클래스를 사용해야합니다. 그러나 명명 된 쿼리를 지정하는 것은 Fluent가하지 않기 때문에 HBM이 필요로하는 것입니다.

DB가 스키마를 이미 알고 있고 소비자가 검색 할 수있을 때 NHibernate가이 정보를 필요로하는 이유는 첫째, 스키마 모델을 프로그래밍 방식으로 생성하기 위해 systables/sysobjects/syscolumns와 같은 뷰를 사용하는 프로세스가 시간 소모적 일 수 있으며, 둘째, 방정식의 절반 밖에되지 않습니다. 매핑을 지정할 때 NHibernate에게 당신이 관심있는 스키마의 부분과 도메인의 각 필드 나 속성이 어떻게 스키마 필드로 변환되는지를 알려줍니다. 그것은 항상 명백한 전환이 아닙니다.

어쨌든, 문제. 오류는 기본적으로 매개 변수가 SQL 문자열에 들어 가지 않았 음을 나타냅니다. 대신 DB가 이해할 수없는 자리 표시자가 사용되었습니다. 어떻게 매개 변수를 지정하는지 잘 살펴 보았지만 불행히도 분명히 잘못된 것은 없습니다.

관련 문제