Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在NHibernate中调用命名查询并将参数传递给Sybase服务器_C#_.net_Sql Server_Nhibernate_Sybase - Fatal编程技术网

C# 在NHibernate中调用命名查询并将参数传递给Sybase服务器

C# 在NHibernate中调用命名查询并将参数传递给Sybase服务器,c#,.net,sql-server,nhibernate,sybase,C#,.net,Sql Server,Nhibernate,Sybase,我试图使用NHibernate调用命名查询,执行时收到错误。 这仅在连接到Sybase server并在Microsoft SQL server上正常工作时发生 我们使用的是Sybase ASE 15和NHibernate 3.3.1.4000 我们没有访问Sybase探查器的权限。我的猜测是NHibernate在发送到Sybase时没有正确地翻译查询 此处是传递参数的位置: NHibernate.IQuery query; query = NHibernateDataContext.GetN

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

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

我们没有访问Sybase探查器的权限。我的猜测是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.IQuery查询;
query=NHibernateDataContext.GetNamedQuery(“更新投资者目标”);
SetParameter(“pTargetId”,target.Id.TargetId<1?null:(int?)target.Id.TargetId,NHibernate.NHibernateUtil.Int32);
SetParameter(“pInvestorId”,target.InvestorId,NHibernate.NHibernateUtil.String);
query.SetParameter(“pReleaseStatus”,新TargetReleaseStatusEnumerationStringType().GetValue(target.ReleaseStatus),NHibernate.NHibernateUtil.String);
SetParameter(“pEventId”,target.Id.EventId,NHibernate.NHibernateUtil.Int32);
SetParameter(“pAccountName”,target.InvestorName.Value,NHibernate.NHibernateUtil.String);
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>

执行sUDI_COMPS
@pSelectReturnYN='Y',
@pAccountNo=:pInvestorId,
@pReleaseStatus=:pReleaseStatus,
@pAccountName=:pAccountName,
@pLastChangedBy=:pLastChangedBy,
@pDealNo=:pEventId,
@pCompsNo=:pTargetId
执行query.UniqueResult()时收到错误

这就是错误:

无法执行查询[执行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-Value:jmacri[SQL:executesudi_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 server时,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>

Dealogic.DataAccess.Driver.DealogicSybaseClientDriver,Dealogic.DataAccess
Dealogic.DataAccess.dialent.ExtendedSybaseASE15dialent,Dealogic.DataAccess
违约
10
假的
真的
假的
60
真1,假0,是“Y”,否“N”

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


用于处理空参数或可选参数。

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

不发送空值。上面发布的错误消息显示了正在发送的值。您使用的是MSSQLS2008方言吗?我更新了原始帖子以添加NHibernate设置。当连接到Sybase服务器时,我们正在使用ExtendedSybaseASE15方言。使用参数前缀可能会出现方言问题,请尝试按位置使用参数,如下所示:我尝试使用位置,但仍然收到相同的错误“必须声明变量'@p0')。您找到解决方法了吗?我刚刚遇到了同样的问题。