C# 带有Sybase asa9和命名参数的nhibernate

C# 带有Sybase asa9和命名参数的nhibernate,c#,nhibernate,sybase-asa,C#,Nhibernate,Sybase Asa,试图让NHibernate尽快使用Sybase 9,但命名参数出错: Invalid index 0 for this AsaParameterCollection with Count=0. 我试过使用NHibernate ODBC驱动程序,目前使用ASA驱动程序。我可以不带参数直接查询,所以我知道连接正在发生。似乎参数没有正确地传递给ASA,但我一直在弄清楚我是否做错了什么,或者这只是NH和ASA的问题。我费了点劲才走到这一步,也许这对将来的人也有帮助。该值是正确的,并且在生成的sql中的

试图让NHibernate尽快使用Sybase 9,但命名参数出错:

Invalid index 0 for this AsaParameterCollection with Count=0.
我试过使用NHibernate ODBC驱动程序,目前使用ASA驱动程序。我可以不带参数直接查询,所以我知道连接正在发生。似乎参数没有正确地传递给ASA,但我一直在弄清楚我是否做错了什么,或者这只是NH和ASA的问题。我费了点劲才走到这一步,也许这对将来的人也有帮助。该值是正确的,并且在生成的sql中的最后一个代码段中可见,查询以equals问号结束,该问号似乎是有效的Sybase,只是不清楚在何处出现故障

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="dialect">NHibernate.Dialect.SybaseASA9Dialect</property>
    <property name="connection.driver_class">NHibernate.Driver.SybaseAsaClientDriver</property>
    <property name="connection.connection_string">Uid=;Pwd=;Dsn=</property>
    <property name="hbm2ddl.keywords">none</property><!--could cause problems? update needed when going to sybase driver instead of odbc-->
    <property name="show_sql">true</property>
    <!-- mapping files -->
    <mapping resource="domain.table.hbm.xml" assembly="Label3700" />-->
  </session-factory>
</hibernate-configuration>
质疑

IList<menu_item> mi = session.CreateQuery("FROM menu_item m where m.fam_grp_seq = :famGrpSeq")
.SetParameter("famGrpSeq", familyGroupSeq)
.List<menu_item>();

您需要创建自定义connectiondriver,因为默认连接驱动程序使用了错误的设置。升级到NHibernate的更新版本可能会消除此问题

在sybase的连接驱动程序中,我已覆盖以下属性:

public class SqlAnywhereConnectionDriver : ReflectionBasedDriver
{
    //other code removed…
    public override bool UseNamedPrefixInSql
    {
        get { return true; }
    }

    public override bool UseNamedPrefixInParameter
    {
        get { return true; }
    }

    public override string NamedPrefix
    {
        get { return ":"; }
    }
}
IList<menu_item> mi = session.CreateQuery("FROM menu_item m where m.fam_grp_seq = :famGrpSeq")
.SetParameter("famGrpSeq", familyGroupSeq)
.List<menu_item>();
could not execute query
[ select menu_item0_.mi_seq as mi1_1_, menu_item0_.obj_num as obj2_1_,menu_item0_.name_1 as name3_1_, menu_item0_.fam_grp_seq as fam4_1_ from micros.mi_def menu_item0_ where menu_item0_.fam_grp_seq=? ]
Name:famGrpSeq - Value:44
[SQL: select menu_item0_.mi_seq as mi1_1_, menu_item0_.obj_num as obj2_1_,menu_item0_.name_1 as name3_1_, menu_item0_.fam_grp_seq as fam4_1_ from micros.mi_def menu_item0_ where menu_item0_.fam_grp_seq=?]
public class SqlAnywhereConnectionDriver : ReflectionBasedDriver
{
    //other code removed…
    public override bool UseNamedPrefixInSql
    {
        get { return true; }
    }

    public override bool UseNamedPrefixInParameter
    {
        get { return true; }
    }

    public override string NamedPrefix
    {
        get { return ":"; }
    }
}