NHibernate.Exceptions.GenericADOException: не удалось выполнить запрос - PullRequest
4 голосов
/ 08 января 2012

У меня есть устаревшее приложение (vfp 8), из которого мне нужно получить данные (без вставок). Я использую поле Accnum в качестве первичного ключа, оно определено в таблице как символ 11.

Заводская конфигурация:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<reflection-optimizer use="false" />
<session-factory>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="dialect">NHibernate.Dialect.GenericDialect</property>
<property name="connection.driver_class">NHibernate.Driver.OleDbDriver</property>
<property name="connection.connection_string">Provider=VFPOLEDB.1;Data Source=C:\Analysis\Quantium\development\RD warehouse\_RDAUWH\Data;Collating Sequence=MACHINE</property>
<property name="show_sql">false</property>
</session-factory>
</hibernate-configuration>

Это мой файл сопоставления:

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

  <class name="CustMast">
    <id name="Accnum" column="Accnum" type="string">
    <generator class="assigned"/>
    </id>
    <property name="Fullname" />
    <property name="Add" />
    <property name="State" />
  </class>  
</hibernate-mapping>

Класс:

public class CustMast
{
    private string _accnum;
    public virtual string Accnum
    {
        get { return _accnum; }
        set { _accnum = value; }
    }
    private string _fullname;
    public virtual string Fullname
    {
        get { return _fullname; }
        set { _fullname = value; }
    }
    private string _add;
    public virtual string Add
    {
        get { return _add; }
        set { _add = value; }
    }
    private string _state;
    public virtual string State
    {
        get { return _state; }
        set { _state = value; }
    }
}

Вот код, который получает запись:

public CustMast GetByAccnum(String accnum)
{
        using (ISession session = NHibernateHelper.OpenSession())
        {
            CustMast custMast = session
                                .CreateCriteria(typeof(CustMast))
                                .Add(Restrictions.Eq("Accnum", accnum))
                                .UniqueResult<CustMast>();
            return custMast;
        }
}

Полная ошибка:

NHibernate.Exceptions.GenericADOException : could not execute query
[ SELECT this_.Accnum as Accnum0_0_, this_.Fullname as Fullname0_0_, this_.Add as Add0_0_, this_.State as State0_0_ FROM CustMast this_ WHERE this_.Accnum = ? ]
Name:cp0 - Value:00059337444
[SQL: SELECT this_.Accnum as Accnum0_0_, this_.Fullname as Fullname0_0_, this_.Add as Add0_0_, this_.State as State0_0_ FROM CustMast this_ WHERE this_.Accnum = ?]
----> System.IndexOutOfRangeException : Invalid index 0 for this OleDbParameterCollection with Count=0. - d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs:1590

Запустив NHibernate Profiler, он показывает:

WARN: 
reflection-optimizer property is ignored out of application configuration file.


WARN: 
System.IndexOutOfRangeException: Invalid index 0 for this OleDbParameterCollection with Count=0.
at System.Data.OleDb.OleDbParameterCollection.RangeCheck(Int32 index)
at System.Data.OleDb.OleDbParameterCollection.GetParameter(Int32 index)
at System.Data.Common.DbParameterCollection.System.Collections.IList.get_Item(Int32 index)
at NHibernate.Driver.DriverBase.ExpandQueryParameters(IDbCommand cmd, SqlString sqlString) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Driver\DriverBase.cs:line 235
at NHibernate.AdoNet.AbstractBatcher.ExpandQueryParameters(IDbCommand cmd, SqlString sqlString) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\AdoNet\AbstractBatcher.cs:line 232
at NHibernate.Loader.Loader.PrepareQueryCommand(QueryParameters queryParameters, Boolean scroll, ISessionImplementor session) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs:line 1152

ERROR: 
Invalid index 0 for this OleDbParameterCollection with Count=0.

Ответы [ 2 ]

2 голосов
/ 03 марта 2012

Я боролся с тем, чтобы мои запросы linq выдавали одну и ту же ошибку всякий раз, когда я передавал им параметр. Если бы я не передал никаких параметров и сделал сеанс. Query (), они бы работали нормально.

Я боролся с этим в течение нескольких дней, но нашел этот билет Джираберта Nhibernate здесь . Это объясняет очевидную проблему с SQLParameters и поставщиком Iseries Db2.

Я понимаю, что вы используете другого провайдера, но вам может быть полезно просто загрузить последнюю версию исходного кода ядра Nhibernate, собрать ее и сослаться на последнюю версию в своем проекте. Это исправило мою проблему.

0 голосов
/ 08 января 2012

Первое, что я бы попробовал, это запустить это в SQL и посмотреть, что произойдет, поскольку это может быть проблема с данными.

ВЫБЕРИТЕ this_.Accnum как Accnum0_0_, this_.Fullname как Fullname0_0_, this_.Добавить как Add0_0_, this_.State как State0_0_ ОТ CustMast this_ ГДЕ this_.Accnum = '00059337444'

Определяется ли в вашей базе данных столбец Accnum как строковый тип (varchar, nvarchar и т. Д.)?

Редактировать ОК, следующий шаг - фактически подтвердить отправку SQL в FoxPro. Вам нужно будет настроить ведение журнала (или загрузить пробную копию NHProf ), чтобы узнать, верен ли SQL. Ваши настройки и код выглядят правильно, однако я не уверен на 100% в выборе диалекта, так как это может вызвать у вас проблемы.

Я так понимаю, вы видели это и это .

Edit2 Мне кажется, что ошибка NHProf говорит о том, что ваш Id должен быть Int32, поскольку выглядит так, будто он вызывает at System.Data.OleDb.OleDbParameterCollection.GetParameter(Int32 index).

Я думаю, вам нужно добавить это в ваши отображения: -

<id name="Accnum" column="Accnum" type="string" >

Обратите внимание на дополнительные type="string"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...