2

NHibernate を使用して名前付きクエリを呼び出そうとしていますが、実行時にエラーが発生します。これは、Sybase サーバーに接続している場合にのみ発生し、Microsoft SQL Server で正常に動作します。

Sybase ASE 15 と NHibernate 3.3.1.4000 を使用しています。

Sybase プロファイラーにはアクセスできません。私の推測では、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>
4

2 に答える 2

0

参考までに、ODBC ドライバーでは動作しますが、SybaseASE ドライバーでは動作しません。

于 2016-04-25T15:10:17.970 に答える
0

最初のパラメーターで null を送信してかどうかを確認します。

ここ

null またはオプションのパラメーターを処理する場合。

于 2013-11-06T21:02:01.643 に答える