IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Accès aux données Discussion :

[C#] [ADO.NET] Récupérer une contrainte de vérification


Sujet :

Accès aux données

  1. #1
    Membre habitué
    Avatar de crjo
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Octobre 2004
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 81
    Points : 132
    Points
    132
    Par défaut [C#] [ADO.NET] Récupérer une contrainte de vérification
    Salut à tous,

    Y a-t-il un spécialiste ADO.NET dans la salle ? J'ai une base de donnée sous MSDE, et j'ai créé une table grâce au Visual Database Tools de Visual Studion 2003. A la création de la table, j'ai ajouté une "contrainte CHECK" pour qu'un champ nommé Ref soit obligatoirement composé de 3 caractères alphabétiques :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ([Ref] like '[A-Z][A-Z][A-Z]')
    J'ai une application WinForm, qui charge un dataset typé correspondant pour éditer la table via un DataGrid. Quand j'ajoute/modifie une ligne via l'application, si le champ Ref ne fait pas exactement 3 caractères, j'ai une exception au moment de l'Update. Jusque là, c'est normal.

    Mon problème est le suivant : je voudrais pouvoir détecter la violation de contrainte avant l'appel à Update. Je veux que ce soit l'application qui vérifie cela préalablement (pour éviter des connexions inutiles avec la source de données).

    Mais je ne veux pas coder manuellement la vérification de la contrainte, car je voudrais ajouter d'autres contraintes, et j'aimerais une validation générique dans mes formulaires d'édition. Existe-t-il un moyen de récupérer la contrainte depuis la source de données ?

    Je pensais pouvoir trouver quelque chose dans DataTable.Constraints, mais ça ne parle que de ForeignKeyConstraint ou UniqueConstraint, et ça ne semble pas correspondre à ce que je recherche pour mon type de contrainte...

    Merci de m'éclairer

  2. #2
    Membre chevronné
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Points : 1 904
    Points
    1 904
    Par défaut
    Mais je ne veux pas coder manuellement la vérification de la contrainte
    Tu devra agir sur le code quoiqu'il arrive... si tu souhaite avoie un systeme souple de validation de regle, il faudra le creer

    j'aimerais une validation générique dans mes formulaires d'édition
    Il existe une methode semi-generique mais qui malheuremement ne fonctionne pas avec le framework 1.1
    Il va falloir attendre le framework 2 avec ses generics (pour une fois qu'un nom d'innovation n'est pas fortuit ) pour pouvoir faire ceci avec un dataset:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnadvnet/html/vbnet02252003.asp
    (la partie sur IDataErrorInfo tout a la fin)
    Pourquoi semi-generique? car pour modifier/ajouter une regle tu devra tout de meme modifier le code
    Il existe cependant des debuts de reponse pour sortir les regles metier du code:
    http://sourceforge.net/projects/nxbre/

    Donc sans remettre en cause tout ce que tu as deja fait t'as ces options possibles:
    La validation de la regle dans la couche interface utilisateur:
    - Avec le controle activeX MaskedEditBox
    - En codant qq chose dans l'evenement Validate du controle bindé a la source de donnees
    - En creant ta propre DatagridColumnStyle
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwinforms/html/wnf_CustDataGrid.asp
    - Utiliser l'evenement FORMAT pour forcer les trois lettres majuscules
    http://www.thecodeproject.com/vb/net/databindingconcepts.asp

    Existe-t-il un moyen de récupérer la contrainte depuis la source de données ?
    Oui avec SQL-DMO t'as acces a presque tout :
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sqldmo/dmoref_ob_3tlx.asp
    http://www.aspfree.com/c/a/Database%20Code/Getting-A-List-of-Tables-From-SQL-Server

  3. #3
    Membre habitué
    Avatar de crjo
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Octobre 2004
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 81
    Points : 132
    Points
    132
    Par défaut
    Merci Piotrek pour ta longue réponse et pour les liens proposés. Ca va me faire de la lecture

    D'après tes propositions, j'aimerais bien arriver à quelque chose du genre :

    • récupérer la contrainte (sql-dmo) dynamiquement
    • pouvoir faire une vérification générique de contrainte : on peut imaginer une classe ConstraintCheck à qui on pourrait passer la syntaxe d'une contrainte récupérée, et qui serait capable de vérifier une entrée en fonction de cela. Le tout est de voir si je peux transformer facilement la syntaxe de la contrainte


    Je vais un peu me renseigner, expérimenter, et je vous tiens au courant. A plus.

  4. #4
    Membre habitué
    Avatar de crjo
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Octobre 2004
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 81
    Points : 132
    Points
    132
    Par défaut
    Après m'être un peu débattu avec SQLDMO, je suis parvenu à récupérer ma contrainte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    SQLDMO.SQLServer server = new SQLDMO.SQLServerClass();
     
    server.LoginSecure = true;
    server.Connect(serverName, null, null);
     
    SQLDMO._Database db = null;
     
    db = server.Databases.Item(dbName, null);
    if (db == null)
        throw new Exception(string.Format("la database {0} n'existe pas sur le serveur {1}", dbName, serverName));
     
    SQLDMO._Table tbl = db.Tables.Item(tblName, null);
    if (tbl == null)
        throw new Exception(string.Format("la table {0} n'existe pas dans la database {1}", tblName, dbName));
     
    SQLDMO.Check check = tbl.Checks.Item(1);
     
    string msg = string.Format("Contrainte [{0}] : {1}", check.Name, check.Text);
    MessageBox.Show(msg);
     
    server.DisConnect();
    En espérant que ça servira à d'autres...

    Bien sûr, pour l'instant, je ne suis pas plus avancé : il faudrait encore que je transforme la contrainte en Regex, mais j'ai pas trop envie d'écrire un parseur pour faire cela...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [ADO.NET] Récupérer le résultat d'une requête dans une variable
    Par developppez dans le forum Accès aux données
    Réponses: 2
    Dernier message: 14/03/2009, 21h34
  2. [VB.NET] Récupérer une dataTable dans le cache
    Par nine93 dans le forum ASP.NET
    Réponses: 3
    Dernier message: 12/03/2007, 14h07
  3. [C++.NET]Récupérer une form
    Par Asiany dans le forum VC++ .NET
    Réponses: 2
    Dernier message: 07/01/2007, 12h55
  4. [ADO.NET] récupérer la valeur de la clé d'une ligne insérée
    Par colombero dans le forum Accès aux données
    Réponses: 2
    Dernier message: 07/12/2006, 23h56
  5. [VB.NET] [ADO.NET] Récupérer id après insertion
    Par nashouille dans le forum Accès aux données
    Réponses: 9
    Dernier message: 09/01/2005, 15h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo