在NHibernate中调用命名查询并将参数传递给Sybase Server

时间:2013-11-06 19:57:47

标签: c# .net sql-server nhibernate sybase

我正在尝试使用NHibernate调用命名查询,并在执行时收到错误。 这仅在连接到Sybase服务器时发生,并且在Microsoft SQL Server上正常工作。

我们正在使用Sybase ASE 15和NHibernate 3.3.1.4000。

我们无权访问Sybase Profiler。我的猜测是,在发送给Sybase时,NHibernate没有正确地翻译查询。

以下是传递参数的位置:

NHibernate.IQuery query;

query = NHibernateDataContext.GetNamedQuery("UPDATE_INVESTOR_TARGET");

query.SetParameter("pTargetId", target.Id.TargetId < 1 ? null :(int?) target.Id.TargetId, NHibernate.NHibernateUtil.Int32);
query.SetParameter("pInvestorId", target.InvestorId, NHibernate.NHibernateUtil.String);
query.SetParameter("pReleaseStatus", new TargetReleaseStatusEnumerationStringType().GetValue(target.ReleaseStatus), NHibernate.NHibernateUtil.String);
query.SetParameter("pEventId", target.Id.EventId, NHibernate.NHibernateUtil.Int32);
query.SetParameter("pAccountName", target.InvestorName.Value, NHibernate.NHibernateUtil.String);
query.SetParameter("pLastChangedBy", lastChangedBy, NHibernate.NHibernateUtil.String);

target.Id.TargetId = (int)query.UniqueResult();

trans.CommitChanges();

这是NHibernate映射:

<sql-query name="UPDATE_INVESTOR_TARGET" cacheable="false" >
    <return-scalar column="Returned Value" type="int" />
    EXECUTE sUDI_COMPS
    @pSelectReturnYN = 'Y',
    @pAccountNo = :pInvestorId,
    @pReleaseStatus = :pReleaseStatus,
    @pAccountName = :pAccountName,
    @pLastChangedBy = :pLastChangedBy,
    @pDealNo = :pEventId,
    @pCompsNo = :pTargetId
</sql-query>

执行query.UniqueResult()。

时收到错误

这是错误:

  

无法执行查询[EXECUTE sUDI_COMPS @pSelectReturnYN ='Y',@ pAccountNo = @ p0,@ pReleaseStatus = @ p1,@ pAccountName =   @ p2,@ pLastChangedBy = @ p3,@ pDealNo = @ p4,@ pCompsNo = @ p5]
  名称:pTargetId - 值:1名称:pInvestorId - 值:1   名称:pReleaseStatus - 值:R名称:pEventId - 值:1   名称:pAccountName - 值:45cda18d-f4da-4342-909b-491918fb4032   名称:pLastChangedBy - 值:jmacri [SQL:EXECUTE sUDI_COMPS         @pSelectReturnYN ='Y',@ pAccountNo = @ p0,@ pReleaseStatus =   @ p1,@ pAccountName = @ p2,@ pLastChangedBy = @ p3,@ pDealNo = @ p4,         @pCompsNo = @ p5]

内在例外:

  

{“必须声明变量'@ p0'。\ n”}

很明显NHibernate没有声明变量。

有没有人在此之前经历过这种情况可能知道为什么会这样?

这是NHibernate问题还是配置/设置问题?

非常感谢任何帮助。

谢谢, 乔

更新:

以下是配置设置。请注意,Microsoft SQL设置已注释掉。连接到Microsoft SQL数据库时,Microsoft SQL设置有效。连接到Sybase SQL服务器时,Sybase设置不起作用。

 <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory name="ICM">

      <!-- MS SQL 2008 Server -->
      <!--<property name="connection.driver_class">
        Dealogic.DataAccess.Driver.DealogicSqlClientDriver,Dealogic.DataAccess
      </property>
      <property name="dialect">
        NHibernate.Dialect.MsSql2008Dialect
      </property>
      <property name="connection.connection_string_name">default</property>-->

      <!-- Sybase ASE 15 Server -->
      <property name="connection.driver_class">
          Dealogic.DataAccess.Driver.DealogicSybaseAseClientDriver,Dealogic.DataAccess
      </property>
      <property name="dialect">
          Dealogic.DataAccess.Dialect.ExtendedSybaseAse15Dialect,Dealogic.DataAccess
      </property>
      <property name="connection.connection_string_name">default</property>

      <property name="adonet.batch_size">10</property>
      <property name="show_sql">false</property>
      <property name="format_sql">true</property>
      <property name="generate_statistics">false</property>
      <property name="command_timeout">60</property>
      <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
    </session-factory>
  </hibernate-configuration>

2 个答案:

答案 0 :(得分:0)

检查是否通过在第一个参数上发送null:

Here

用于处理null或可选参数。

答案 1 :(得分:0)

仅供参考,它适用于ODBC驱动程序,但不适用于SybaseASE驱动程序。