2010-03-09 6 views
2

Est-ce une bonne façon de s'assurer que les champs ont des valeurs valides pour une base de données?Comment puis-je valider les champs de classe?

internal class Customer 
{ 

    private string _CustomerId; 
    internal string CustomerId 
    { 
     get 
     { 
      return (_CustomerId==null?string.Empty:(_CustomerId.Length>20?_CustomerId.Substring(0,20):_CustomerId)); 
     } 
     set 
     { 
      _CustomerId = value; 
     } 
    }} 

Cordialement Sven

+0

Pouvez-vous donner plus de détails sur ce que vous utilisez? De quelle technologie s'agit-il? Quelle technologie de base de données utilisez-vous et comment interagissez-vous avec elle? Est-ce la bibliothèque web/windows/WPF/class? –

+0

Désolé C'est dans un classlibray. Je construis une bibliothèque pour une application qui synchronise 2 bases de données. Mon problème est qu'ils permettent différentes longueurs pour les champs dans les tables. La vérification de null est parce que j'obtiens une erreur lors de l'ajout de paramètres à une requête sql lors de la fourniture d'une valeur nulle. – Zwempha

Répondre

3

Une technique plus propre serait d'annoter vos propriétés avec des attributs de validation et d'utiliser une bibliothèque pour valider les entités.

Voici quelques exemples:

Ensuite, en fonction de la bibliothèque sélectionnée, votre code ressemblerait à:

public class Customer 
{ 
    [StringLengthValidator(20)] 
    public virtual string CustomerId { get; set;} 
} 
+1

Lorsque vos validations sont simples, j'irais avec DataAnnotations. Lorsque les exigences sont plus complexes, utilisez le bloc Application Validation Application Library. Cela permet de nombreux scénarios complexes. – Steven

+0

+1 DataAnnotations est probablement la seule chose dont Sven a besoin. Avec les autres, il devrait s'inquiéter de licences potentiellement contradictoires quand il libère sa bibliothèque. Sidenote: une autre réponse était affichée pendant que je tapais ceci, et cela a en quelque sorte causé que mon commentaire devienne une réponse! –

+0

D'accord. J'ai récemment fait l'erreur de décorer WCF DataContracts avec les attributs de bloc de validation de bibliothèque d'entreprise, et maintenant tous les utilisateurs du service WCF doivent référencer cette version particulière des différentes DLL EntLib. Grrr. Rétrospectivement j'aurais dû aller avec DataAnnotations. –

2

Votre façon de valider l'entrée est très fragile. Vous excluez toute entrée possible (pour le CustomerId dans ce cas) et désinfectez-la quand elle est demandée. Cela peut fonctionner dans ce scénario de base, mais dans de nombreux cas, vous ne pouvez pas nettoyer l'entrée. Vous corrigez fondamentalement les erreurs de l'utilisateur et faites des suppositions de ce qu'il voulait. Comment allez-vous faire avec une adresse mail? Par exemple, l'adresse postale «stevenhotmail.com» doit-elle être convertie en «[email protected]» ou en «[email protected]»? En plus de cela, il y a aussi la possibilité d'une erreur de programmation. Souhaitez-vous que votre programme tente de corriger vos propres erreurs de programmation. Cela vous donnera mal à la tête. Ou que ferez-vous lorsque deux propriétés de la même entité doivent être comparées?

Une meilleure solution serait de permettre à l'entité de devenir dans un état invalide et de vérifier sa validité juste avant de l'enregistrer dans la base de données. Lorsque son état n'est pas valide, n'essayez pas de corriger automatiquement les modifications, mais lancez simplement une exception ou renvoyez les erreurs à l'utilisateur.

Il existe plusieurs approches pour ce faire. Vous pouvez par exemple implémenter une méthode IsValid() sur chaque entité ou utiliser un cadre de validation.

Questions connexes