2016-01-20 68 views
0

鑑於Oracle表這一領域的確定:的價值大,通過NHibernate的列,但在蟾蜍爲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 

我們插入這個文本插入到指定的列用一個簡單的插入語句在forad for oracle的幫助下:工作正常。

不過:如果我們插入這個文本與NHibernate的幫助下,我們將得到一個Oracle錯誤:

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

如果你給定的字符串的字節數此錯誤實際上是正確的,我們將得到一個計數爲262.

爲什麼nhibernate會失敗,爲什麼蟾蜍for oracle會成功執行相同的操作?

有沒有人有任何這個問題或有關它的經驗嗎?

編輯

值得在此一提的是,該字符串已在HTML textarea的提交。這裏可能存在的問題是,在瀏覽器中將返回值計爲1個字符,但在.net中它應該被計爲多於1個字符,它表示爲\ r \ n。

所有這一切都在一個asp.net mvc場景中。

+0

部分類似:http://stackoverflow.com/questions/11241076/new-line-characters-in-text-area-increases-text-length-in-c-sharp –

+0

HTTP:// ashleyglee .com/maxlength-on-html-textarea-form-element/ –

+0

http://stackoverflow.com/questions/10030921/chrome-counts-characters-wrong-in-textarea-with-maxlength-attribute –

回答

1

實際的問題:

它無關,與NHibernate的或Oracle。 當一個帶有換行符的textarea被髮布到asp.net mvc的「後端」時,我們將這些換行符接收爲\ r \ n。它計爲2個字符,導致2字節用於數據庫保存。

但是在我們的情況下,我們有一個maxlength = 255的html屬性。瀏覽器將換行符計爲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); 
     } 
    }