2008-10-31 2 views
4

У меня возникли проблемы с получением именованных запросов для работы с nHibernate. Моя последняя проблема заключается в получении сообщения об ошибке «невозможно выполнить запрос» без дополнительной информации. Есть ли какие-либо полные примеры, которые я могу загрузить откуда-то, потому что все примеры учебников и документации предоставляют фрагменты кода, но рассказывают только половину истории о том, как заставить его работать.Именованные запросы с nHibernate

Вот код, который дает мне проблемы.

Класс

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
namespace Model.Entities 
{ 
    public class TableInfo 
    { 
     public string TABLENAME { get; set; } 
     public string COLUMNNAME { get; set; } 
     #region Overrides 
     public override int GetHashCode() 
     { 
      int result = TABLENAME.GetHashCode(); 
      result += COLUMNNAME.GetHashCode(); 
      return result; 
     } 
     public override bool Equals(object obj) 
     { 
      if (obj == null) return false; 
      TableInfo dict = (TableInfo)obj; 
      return 
       dict.TABLENAME.IsEqual(this.TABLENAME) && 
       dict.COLUMNNAME.IsEqual(this.COLUMNNAME); 
     } 
     #endregion 
    } 
} 

Mapping File

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Model.Entities" assembly="Model" default-lazy="false"> 

    <class name="Model.Entities.TableInfo, Model" table="UIM_TableColumnInfo"> 
    <composite-id> 
     <key-property name="TABLENAME" column="TABLENAME" type="string"></key-property> 
     <key-property name="COLUMNNAME" column="COLUMNNAME" type="string"></key-property> 
    </composite-id> 
    </class> 

    <sql-query name="GetTableInfo"> 
    <return alias="tableInfo" class="Model.Entities.TableInfo, Model"> 
     <return-property name="TABLENAME" column="TABLENAME"/> 
     <return-property name="COLUMNNAME" column="COLUMNNAME"/> 
    </return> 
    <![CDATA[ 
select 
     info.tci_table_name TABLENAME 
     , info.tci_column_name COLUMNNAME 
     from ALL_TAB_COLS c 
     ,(select 'DATE' TYPE_NAME, 'D' data_type_ind from dual 
      union select 'NUMBER','N' from dual 
      union select 'VARCHAR2','S' from dual 
     ) ct 
     , UIM_TableColumnInfo info 
     where c.DATA_TYPE   = ct.TYPE_NAME (+) 
       and c.column_id is not null 
     and UPPER(c.TABLE_NAME) = :TableName 
     and UPPER(c.COLUMN_NAME) = UPPER(info.tci_column_name (+)) 
     order by c.column_id 
    ]]> 
    </sql-query> 

</hibernate-mapping> 

телефонный код

public List<TableInfo> GetTableInfo(string tableName) 
{ 
    return m_TableInfoRepository 
     .NamedQuery("GetTableInfo") 
     .SetString("TableName", tableName) 
     .List<TableInfo>() as List<TableInfo>; 
} 

ответ

0

Может быть, я ошибаюсь, но мне кажется, т шляпа может быть конфликтом между таблицей «TABLENAME» и параметром «: TableName», что произойдет, если вы попытаетесь использовать другое имя параметра?

+0

Я пробовал это, но не имел никакого значения. – Craig 2008-10-31 03:43:19

2

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

  1. Named Query Error
  2. Using NHibernate and Log4Net in ASP.NET 2.0 applications
  3. How do I view the SQL that is generated by nHibernate?

Надеется, что это помогает.

0

Внутреннее исключение должно содержать фактический sql, который был сгенерирован и запущен. Вставьте это в запрос базы данных и запустите его непосредственно в базе данных. Это поможет вам. Это будет намного проще, если вы знаете, почему SQL не удалось выполнить.

Смежные вопросы