2010-01-19 3 views
1

Donc, nous utilisons SubSonic comme DAL/ORM pour l'un de nos projets. Tout s'est bien déroulé (la base de données existait déjà, donc nous avons utilisé SubSonic par-dessus), cependant, nous rencontrons parfois une exception qui dit que l'entier dépasse la longueur maximale. Dans cet exemple, notre champ MySql est un int (4) signé. Ce qui, d'après la documentation MySql permettra une gamme des éléments suivants:SubSonic: MaxLength de TableColumn (excédant)

-2147483647 à 2147483647.

Maintenant, ma question, comment est-MaxLength dictée en subsonique? Est-ce le nombre de chiffres? Parce que cela signifie qu'il ne permettrait que de -9999 à 9999, n'est-ce pas? Cela semble être un écart assez important, et j'espère que ce n'est pas le cas, sinon nous aurons beaucoup d'autres problèmes.

Merci, -Steve

+0

Eh bien, si int (4) est -2147483647 à 2147483647, alors le 4 se rapporte au nombre d'octets, pas le nombre de chiffres. –

+0

Voir aussi http://stackoverflow.com/questions/947406/subsonic-sqlite-float-datatype-cant-save-xxx-exceeds-the-maximum-length –

+0

Plus d'infos: Impossible d'enregistrer: -field name- dépasse la longueur maximale de 4 – StephenPAdams

Répondre

0

utilisant réflecteur, et le forage vers le bas pour la fonction Save ActiveRecord (qui appelle 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)); 
     } 

drapeau est défini sur true si la variable est nulle. Donc, oui, ça va du nombre de chiffres (voir: ToString(). Length). Cela ne semble pas logique car MySql n'utilise pas la propriété length du type de données pour déterminer le nombre de chiffres pour les valeurs basées sur des entiers.

Ceci est SubSonic 2.2.

+0

Dans le cas où quelqu'un se demande, cette validation peut être désactivée en désactivant la propriété ValidateWhenSaving (définissez-la sur false). Il est activé par défaut dans le constructeur de RecordBase. Cela résout notre problème. Ce serait bien si cela pouvait être généré pour nous via la configuration de SubSonic, donc nous pouvons l'activer/désactiver comme bon nous semble. – StephenPAdams

Questions connexes