【问题标题】:Cant query sybase with Nhibernate无法使用 Nhibernate 查询 sybase
【发布时间】:2011-08-03 05:20:25
【问题描述】:

已经开始在 sybase ASE 数据上使用 NHibernate,面临的问题是当我加载实体时出现以下错误

“System.IndexOutOfRangeException : 此 OdbcParameterCollection 的索引 0 无效,Count=0。”

这就是我配置会话的方式

properties["connection.provider"] = "NHibernate.Connection.DriverConnectionProvider";
properties["connection.driver_class"] = "NHibernate.Driver.OdbcDriver";
properties["connection.connection_string"] = @"Driver={Adaptive Server Enterprise};server=;port=; db=;uid=;pwd=";
properties["dialect"] = "NHibernate.Dialect.SybaseASE15Dialect";  

和对象映射

  <class name="MenuGroup" table="MENU_GROUP">
    <id name="Id" column="id" type="Int32">
      <generator class="identity" />
    </id>    
    <property name="Name" column="name" type="String" length="100" not-null="true" />
    <property name="Position" column="position" type="Int32" />  
  </class>

如果我这样做了

 var menuGroup = _session.Get<Menu.MenuGroup>(1);

我收到错误

NHibernate.Exceptions.GenericADOException : 无法加载实体: [DomainModel.Menu.MenuGroup#1][SQL: SELECT menugroup0_.id as id1_0_, menugroup0_.name as name1_0_, menugroup0_.position as position1_0_ FROM MENU_GROUP menugroup0_ WHERE menugroup0_ .id=?] ----> System.IndexOutOfRangeException : 此 OdbcParameterCollection 的索引 0 无效,Count=0。

【问题讨论】:

  • 我在自动取款机上遇到了同样的问题。我正在尝试让我的解决方案与 NHibernate 3.2 一起使用。你用的是什么版本?
  • 3.2.0.4,任何想法如果更改为旧版本会有所帮助
  • 嗯,我们的解决方案曾经与 SQL Anywhere 10 一起使用,但我们昨天迁移到了 12。我使用基于 .net framework 2.0 的 NHibernate 2.1.2 GA 运行它。今天我已经开始实施 NHibernate 3.2.0.4000 (3.2 GA),但现在我所有的查询单元测试都因您描述的错误而失败。
  • 试试 NHibernate.Driver.SybaseSQLAnywhereDriver,应该会有帮助

标签: nhibernate


【解决方案1】:

我通过创建自己的连接驱动程序解决了这个问题

using NHibernate.Driver;

namespace Framework.Persistency
{
    public sealed class MySybaseSQLAnywhereDriver : SybaseSQLAnywhereDriver
    {
        public override bool UseNamedPrefixInSql
        {
            //default is false
            get { return true; }
        }

        public override bool UseNamedPrefixInParameter
        {
            //default is false
            get { return true; }
        }

        public override string NamedPrefix
        {
            //default is string.Empty
            get { return ":"; }
        }
    }
}

并在 NHibernate 配置中使用它:

configDictionary.Add(Environment.ConnectionDriver, typeof(MySybaseSQLAnywhereDriver).AssemblyQualifiedName);

【讨论】:

    【解决方案2】:

    摆脱 odbc 有帮助,将配置更改为

    properties["connection.provider"] = "NHibernate.Connection.DriverConnectionProvider"; 属性["connection.driver_class"] = "NHibernate.Driver.SybaseAseClientDriver"; properties["connection.connection_string"] = @"server=*;port=5000; db=;user id=*;password=;"; properties["dialect"] = "NHibernate.Dialect.SybaseASE15Dialect";

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-20
      相关资源
      最近更新 更多