2013-09-25 24 views
1

我在Oracle數據庫中有一個表,其列爲Long類型。在本專欄中,我們存儲了一個長文本,並且我們無法將其類型更改爲CLob,因爲有其他系統將其用作Long類型。我正在寫一個新的應用程序來讀取此列,並使用NHibernateFluent NHibernate來執行一些任務來進行映射。將一個長類型列從Oracle映射到Nhibernate

映射沒問題,除了這一列以外,一切正常。當我從該表中讀取一個實體時,long列出現一個空字符串,如""

我嘗試了這些:

Map(x => x.Query).Column("PNL_QUERY"); 

Map(x => x.Query).Column("PNL_QUERY").CustomType("StringClob"); 

Map(x => x.Query).Column("PNL_QUERY").CustomType("StringClob") 
            .CustomSqlType("Long"); 

Map(x => x.Query).Column("PNL_QUERY").CustomType("Long"); 

,沒有任何工作。當我從數據庫加載某個實體時,它們都會在查詢字段中返回""

如何在Oracle中映射這種類型的列?

謝謝。

+0

的解決方案作爲一個隨筆,也許你應該嘗試從Oracle方言在方言習俗申報這種長型重載RegisterLargeObjectTypeMappings()方法見:https://github.com /nhibernate/nhibernate-core/blob/master/src/NHibernate/Dialect/Oracle8iDialect.cs#L124 – jbl

回答

1

我找到了一個解決方案:

要獲得LONG列的工作中,我們必須將OracleCommand.InitialLONGFetchSize屬性設置爲-1的ado.net Oracle提供。所以我們必須從OracleDataClientDriver類中覆蓋Oracle驅動程序。像這樣:

使用NHibernate.Driver;使用Oracle.DataAccess.Client的 ;

namespace MyProject 
{ 
    public class OracleDriverExtended : OracleDataClientDriver 
    { 
     public override void AdjustCommand(System.Data.IDbCommand command) 
     { 
      OracleCommand cmd = command as OracleCommand; 
      if (cmd != null) 
       cmd.InitialLONGFetchSize = -1; 
     } 
    } 
} 

而且在設置此定製驅動程序的connection.driver_class屬性hibernate.cfg.xml

<property name="connection.driver_class"> 
    MyProject.Data.OracleDriverExtended, 
    MyProject 
</property> 

現在,NHibernate的可以閱讀從Oracle LONG類型。

我發現這裏http://sonyarouje.com/2012/11/07/nhibernate-and-oracle-long-varchar-field/

相關問題