【问题标题】:How do I get the NextVal from an oracle Sequence thru NHibernate如何通过 NHibernate 从 Oracle 序列中获取 NextVal
【发布时间】:2011-01-07 18:41:29
【问题描述】:

我正在使用 c# .net 4.0 并使用 NHibernate 与 Oracle DB 对话。 你会认为像这样简单的事情已经在某个地方解决了,但遗憾的是它没有。 我需要 Oracle 序列中的 NextVal。 我不需要将它作为 Id 或主键的一部分插入数据库。 我只需要在 c# 端使用下一个 val。

谁能帮我解决一下 xml 映射和 C# 文件(或链接)的问题。

谢谢。

类似

int NextValueOfSequence = GetNextValueofSequence();

public int GetNextValueOfSequence()
{

// Access NHibernate to return the next value of the sequence.

}

【问题讨论】:

  • 你不能在 Id 属性上运行一个最大值然后加 1 吗?
  • 没有。假设数据库没有表,没有 SP,除了一个 oracle 序列什么都没有。我需要获取 nextval 并在 c# 端使用它。

标签: oracle nhibernate sequence nextval


【解决方案1】:

对于 NH4,我使用这种 DB 无关的 ISession 扩展方法(显然 DB 必须支持序列)

public static T GetSequenceNextValue<T>(this ISession session, string sequenceName) where T : struct
{
    var dialect = session.GetSessionImplementation().Factory.Dialect;
    var sqlQuery = dialect.GetSequenceNextValString(sequenceName);
    return session.CreateSQLQuery(sqlQuery).UniqueResult<T>();
}

【讨论】:

    【解决方案2】:

    这也可以解决问题。

     <your session variable>.CreateSQLQuery("select <your sequence>.NEXTVAL from dual").UniqueResult<Int64>();
    

    【讨论】:

      【解决方案3】:

      映射:

        <sql-query name="GetSequence" read-only="true">
          <return-scalar type="Int64"/>
          <![CDATA[
          SELECT SeqName.NEXTVAL from DUAL;
          ]]>
        </sql-query>
      

      代码:

      Int64 nextValue = session.GetNamedQuery("GetSequence").UniqueResult<System.Int64>();
      

      【讨论】:

      • 谢谢,我确实在映射中遇到了一些语法错误。由于时间限制,我无法着手调查/修复它们。我最终使用了.......CreateSQLQuery("select .NEXTVAL from dual").UniqueResult();
      • 但感谢您的意见,它帮助我将课程改为 SQL,而不是到处搜索标准的 nhibernate 映射/域类解决方案。
      • 对不起,我编辑了答案。映射中应该有“return-scalar”。
      【解决方案4】:

      @Petr Kozelek 给出的映射有一个小的修正

      <sql-query name="GetSequence" read-only="true">
          <return-scalar column="NextNo" type="Int64"/>
          <![CDATA[
              SELECT SeqName.NEXTVAL as NextNo from DUAL
          ]]>
      </sql-query>
      

      【讨论】:

        猜你喜欢
        • 2019-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-22
        • 1970-01-01
        • 2018-12-11
        • 1970-01-01
        • 2019-07-27
        相关资源
        最近更新 更多