2

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

我们使用的是 Sybase ASE 15 和 NHibernate 3.3.1.4000。

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

这是传递参数的位置:

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:执行 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>
4

2 回答 2

0

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

这里

用于处理 null 或可选参数。

于 2013-11-06T21:02:01.643 回答
0

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

于 2016-04-25T15:10:17.970 回答