代码之家  ›  专栏  ›  技术社区  ›  Tom B.

通过nhibernate将列的值设置为大值,但对于oracle,在toad中可以

  •  0
  • Tom B.  · 技术社区  · 9 年前

    给定Oracle表中的此字段:

    ColumnName varchar(255 byte)
    

    给定此字符串:

    -- abcd abcdefghijkl mnokpqrstuvwxy abcd ab abcdefgh abc def abc
    abcdef ab.* abcd
    abcdefgh ij
    abcd abcdefghijkl mn ab ab.cd = ef.abcdefghijk ab ab.cd = ab.cdabe
    abcd abcdefghi.jklmnopqrstuvwxyzabc de ef ea.fd = ef.aezerfds
    azere
    fr.qsdfrtd = 1
    fds ad.dfdsq
    

    我们在toad for oracle的帮助下,使用一个简单的insert语句将此文本插入指定的列:这很好。

    但是:如果我们在nhibernate的帮助下插入此文本,我们将得到一个oracle错误:

    ORA-12899: value too large for column [**SNIP**] (actual: 262, maximum: 255)
    

    这个错误实际上是正确的,如果您对给定字符串进行字节计数,我们将得到262的计数。

    为什么nhibernate失败了,为什么蟾蜍为神谕成功了同样的行动?

    有没有人对此问题或与之相关的问题有任何经验?

    编辑

    这里值得一提的是,字符串已在html文本区域中提交。这里可能的问题是,返回在浏览器中被计算为1个字符,但它应该被计算为多于1个字符。因为在.net中,它由\r\n表示。

    所有这些都在asp中。net mvc场景。

    1 回复  |  直到 9 年前
        1
  •  1
  •   Tom B.    9 年前

    实际问题:

    它与nhibernate或oracle无关。 当带有换行符的文本区域被发布到asp的“后端”时。net mvc我们收到这些新行 \\r\n 。它计为2个字符,这将导致 2字节 用于数据库保存。

    然而,在我们的情况下,我们有一个maxlength=255html属性。浏览器将换行计数为 1个字符 。看到区别了吗?

    解决方案

    我们通过将\r\n替换为\n来解决这个问题。

    public class NewLineModelBinder : DefaultModelBinder
        {
            public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
            {
                var result = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
                if (result != null && !string.IsNullOrEmpty(result.AttemptedValue) &&
                    bindingContext.ModelType == typeof(string))
                {
                    var value = result.AttemptedValue;
                    var replacedValue = value.Replace("\r\n", "\n");
    
                    return replacedValue;
                }
                return base.BindModel(controllerContext, bindingContext);
            }
        }