2011-08-15 14 views
5

對SQL Server和Oracle DB使用NHibernate 3.1,我們需要存儲一個長度超過4000個字符的文本字符串。文本實際上是XML,但這並不重要 - 我們只是想將其作爲原始文本來處理。使用SQL Server,這很容易。我們聲明列NVARCHAR(MAX)正是如此它映射:在Oracle和NHibernate中映射長文本字符串

<property name="MyLongTextValue" length="100000"/> 

使用length屬性告訴NHibernate的期望,可能會超過4000個字符的字符串。

對於我的生活,我無法弄清楚如何在Oracle 11g上進行這項工作。我試過將這個列聲明爲XMLTYPE和LONG,但都沒有成功。在第一種情況下,我們以結束ORA-01461:只有在試圖插入行時才能將LONG值綁定到插入到LONG列中。在第二種情況下,數據插入正確,但在查詢時返回爲空字符串。

有誰知道如何使這項工作?答案必須與SQL Server和Oracle兼容。我寧願不必編寫自定義擴展,如用戶類型和驅動程序子類。謝謝。

+0

您應該使用NTEXT對於SQL Server,NVARCHAR(MAX)將可能不能處理超過4000個字符。 –

+0

@YavorShahpasov你爲什麼會認爲NVARCHAR(MAX)不能處理超過4000個字符?文檔中說「max」表示最大存儲大小爲2^31-1字節(2 GB)。「這應該足夠1073741823字符左右。 – phoog

+0

我被一個事實誤導了,它允許1-4000個字符。你是正確的,max將允許高達2GB。 –

回答

6

你應該使用這樣的

<property name="MyLongTextValue" length="100000" type="StringClob" 
not-null="false"/> 

這應該與Oracle CLOB類型和SQLServer NTEXT類型的工作。

確保在模型中的特性可爲空

public virtual string MyLongTextValue {get;set;} 

與CLOB的

0

打交道時,你應該總是使用Oracle.DataAccess你可能有興趣在這個article

<property column="`LARGE_STRING`" name="LargeString" type="StringClob" sql-type="NCLOB" /> 
2

給誰,這可能會感興趣,我解決我的問題如下步驟3 this article的:

3.使用正確的映射屬性:type="AnsiString"

通常情況下,我們可以使用默認type="String"爲CLOB/NCLOB。嘗試使用>type="AnsiString"如果上述兩個步驟不起作用。

<property name="SoNhaDuongPho" column="SO_NHA_DUONG_PHO" type="AnsiString"/>

在我來說,我FluentNHibernate設置:

.CustomType("AnsiString")