4

名前付きクエリを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
    }
}

マッピングファイル

<?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>;
}
4

3 に答える 3

2

クライアント データベースで SQL をテストする前にテストしたと思いますので、内部で何が起こっているかを確認する必要があると思います。このリンクをお勧めします。

  1. 名前付きクエリ エラー
  2. ASP.NET 2.0 アプリケーションで NHibernate と Log4Net を使用する
  3. nHibernate によって生成された SQL を表示するにはどうすればよいですか?

それが役に立てば幸い。

于 2008-10-31T15:01:20.047 に答える
0

私が間違っているかもしれませんが、テーブル "TABLENAME" とパラメーター ":TableName" の間で競合が発生する可能性があるようです。別のパラメーター名を使用しようとするとどうなりますか?

于 2008-10-31T03:40:31.547 に答える
0

内部例外は、生成されて実行しようとした実際の sql を提供する必要があります。これをデータベース クエリに貼り付けて、データベースで直接実行します。これはあなたを導くのに役立ちます。SQL を実行できなかった理由がわかれば、はるかに簡単になります。

于 2011-04-25T13:02:35.777 に答える