2010-01-19 74 views
1

因此,我们将SubSonic用作我们的DAL/ORM中的一个项目。一切都运行平稳(数据库已经存在,所以我们在其上面使用了SubSonic),但是,有时我们会遇到一个例外情况,表明像整数这样的东西超过了最大长度。在这个例子中,我们的MySql字段是一个int(4)签名。其中,根据MySQL文档将允许范围如下:SubSonic:TableColumn的MaxLength(超出)

-2147483647到2147483647

现在,我的问题,是如何的MaxLength亚音速决定?它是数字的数量吗?因为这意味着它只会允许-9999到9999,对吗?这似乎是一个相当大的差异,我希望情况并非如此,否则我们会遇到很多其他问题。

感谢, 史蒂夫

+0

那么,如果int(4)是-2147483647到2147483647,那么4指的是字节数,而不是数位数。 – 2010-01-19 22:44:26

+0

另请参阅http://stackoverflow.com/questions/947406/subsonic-sqlite-float-datatype-cant-save-xxx-exceeds-the-maximum-length – 2010-01-19 22:45:58

+0

更多信息: 无法保存:-field name-超过罗伯特的最大长度4 – StephenPAdams 2010-01-19 22:49:24

回答

0

使用反射器,然后向下钻取到的ActiveRecord的保存功能(它调用ValidateColumnSettings):

if ((!flag && (column.MaxLength > 0)) && ((column.DataType != DbType.Boolean) && (currentValue.ToString().Length > column.MaxLength))) 
     { 
      Utility.WriteTrace(string.Format("Max Length Exceeded {0} (can't exceed {1}); current value is set to {2}", column.ColumnName, column.MaxLength, currentValue.ToString().Length)); 
      this.errorList.Add(string.Format(this.LengthExceptionMessage, str, column.MaxLength)); 
     } 

标志设置为true,如果该变量为空。所以,是的,这是数字的数字(见:ToString()。长度)。这似乎没有任何意义,因为MySql不使用数据类型的长度属性来确定基于整数的值的位数。

这是SubSonic 2.2。

+0

如果有人想知道,可以通过关闭ValidateWhenSaving属性来禁用此验证(将其设置为false )。它在RecordBase的构造函数中默认启用。这解决了我们的问题。 如果可以通过SubSonic的配置为我们生成,那就好了,所以我们可以在我们认为合适的时候启用/禁用它。 – StephenPAdams 2010-01-21 16:17:09