nhibernate с Sybase asa9 с именованными параметрами - PullRequest
1 голос
/ 23 декабря 2011

Попытка заставить NHibernate работать с Sybase ASA9 и иметь проблемы с именованными параметрами, выдавая ошибку:

Invalid index 0 for this AsaParameterCollection with Count=0.

Я пробовал с драйвером NHibernate ODBC и в настоящее время драйвером ASA.Я могу сделать прямой запрос без параметров, поэтому я знаю, что соединение происходит.Похоже, что параметр не передается в ASA правильно, но я застрял в выяснении, если я делаю что-то не так или это просто проблема с NH и ASA.Потребовалось немного почесать голову, чтобы зайти так далеко, так что, возможно, это также поможет кому-то в будущем.Это правильное значение, которое видно в последнем фрагменте сгенерированного sql, и запрос заканчивается знаком вопроса «равно», который выглядит как действительный 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>

отображение

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
               assembly="Label3700"
               namespace="Label3700.Domain">

<class name="menu_item" table="micros.mi_def">
     <id name="mi_seq">
       <column name="mi_seq" sql-type="integer" not-null="true"/>
       <generator class="identity" />
     </id>
     <property name="obj_num" />
     <property name="name_1" />
     <property name="fam_grp_seq" />
   </class>
</hibernate-mapping>

класс

public class menu_item
{
    public virtual int mi_seq { get; set; }
    public virtual int obj_num { get; set; }
    public virtual string name_1 { get; set; }
    public virtual int fam_grp_seq { get; set; }
}

запрос

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=?]

1 Ответ

0 голосов
/ 08 декабря 2015

Необходимо создать пользовательский драйвер подключения, поскольку драйвер подключения по умолчанию использует неправильные настройки. обновление до более новых версий 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 ":"; }
    }
}
...