【问题标题】:Mapping a long text string in Oracle and NHibernate在 Oracle 和 NHibernate 中映射长文本字符串
【发布时间】:2011-10-27 15:11:02
【问题描述】:

将 NHibernate 3.1 与 SQL Server 和 Oracle DB 一起使用,我们需要存储一个长度超过 4000 个字符的文本字符串。文本实际上是 XML,但这并不重要——我们只想将其视为原始文本。使用 SQL Server,这很容易。我们将该列声明为 NVARCHAR(MAX) 并对其进行映射:

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

长度属性的使用告诉 NHibernate 期望一个可能超过 4000 个字符的字符串。

在我的一生中,我无法弄清楚如何在 Oracle 11g 上进行这项工作。我尝试将列声明为 XMLTYPE 和 LONG 均未成功。在第一种情况下,我们最终得到ORA-01461:在尝试插入行时,只能绑定 LONG 值以插入到 LONG 列中。在第二种情况下,数据被正确插入,但在查询时返回为空字符串。

有谁知道如何进行这项工作?答案必须与 SQL Server 和 Oracle 兼容。我宁愿不必编写自定义扩展,例如用户类型和驱动程序子类。谢谢。

【问题讨论】:

  • SQL server 应该使用 NTEXT,NVARCHAR(MAX) 可能无法处理超过 4000 个字符。
  • @YavorShahpasov 为什么您认为 NVARCHAR(MAX) 不能处理超过 4000 个字符?文档说“max 表示最大存储大小为 2^31-1 字节(2 GB)。”这对于 1073741823 个字符左右应该足够了。
  • 我被它允许 1-4000 个字符的事实误导了。你是对的,最大允许 2GB。

标签: oracle nhibernate text clob lob


【解决方案1】:

你应该使用这样的东西

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

这应该适用于 Oracle CLOB 类型和 SqlServer NTEXT 类型。

确保模型上的属性可以为空

public virtual string MyLongTextValue {get;set;}

在处理 CLOB 时,您应该始终使用 Oracle.DataAccess

【讨论】:

    【解决方案2】:

    对于可能感兴趣的人,我按照this article 的第 3 步解决了我的问题:

    3.使用正确的映射属性:type="AnsiString"

    通常我们可以为 CLOB/NCLOB 使用type="String" 默认值。如果以上两个步骤不起作用,请尝试使用 > type="AnsiString"

    &lt;property name="SoNhaDuongPho" column="SO_NHA_DUONG_PHO" type="AnsiString"/&gt;

    就我而言,我使用 FluentNHibernate 进行设置:

    .CustomType("AnsiString")
    

    【讨论】:

      【解决方案3】:

      您可能对此article 感兴趣。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-11
        • 1970-01-01
        • 1970-01-01
        • 2010-09-19
        • 1970-01-01
        • 1970-01-01
        • 2011-08-07
        • 1970-01-01
        相关资源
        最近更新 更多