2011-01-07 49 views
4

我正在使用c#.net 4.0並使用NHibernate與Oracle數據庫進行通信。 你會認爲這件事很簡單,因爲這已經在某個地方解決了,但可悲的是它沒有。 我需要Oracle序列中的NextVal。 我不需要將它作爲Id或主鍵的一部分插入數據庫。 我只需要在c#端使用下一個val。我如何從一個oracle序列通過NHibernate獲得NextVal

有人可以幫我用XML映射和C#文件(或鏈接)來實現這一點。

謝謝。

喜歡的東西

int NextValueOfSequence = GetNextValueofSequence(); 

public int GetNextValueOfSequence() 
{ 

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

} 
+0

你不能只在Id屬性上運行一個max,然後給它添加1? – Baz1nga 2011-01-07 19:03:03

+0

否。假設數據庫沒有表,沒有SP,除了oracle序列外沒有任何東西。我需要獲得nextval並在c#端使用它。 – trainer 2011-01-07 19:26:53

回答

7

映射:

<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>(); 
4

這也做的伎倆。

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

有在映射小校正由@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> 
4

隨着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>(); 
} 
相關問題