2009-03-26 10 views
1

A l'une des extrémités de mon application Web, j'ai une table de base de données qui stocke un chargement de morceaux de texte.Validation des longueurs de chaîne en fonction des colonnes de base de données associées

Au milieu, j'ai une API qui sépare mes niveaux d'application.

À l'autre extrémité, j'ai une interface utilisateur composée de nombreux TextBox es (ou input type=text éléments de formulaire, si vous préférez).

J'ai besoin que les propriétés maxlength des TextBox es soient les mêmes que les longueurs de chaîne maximales dans les différentes colonnes de table de base de données associées. Je voudrais également faire une validation de longueur de chaîne sur mon API.

Bien sûr, je peux y parvenir manuellement, mais est-ce que quelqu'un connaît une technique sur n'importe quelle plate-forme qui peut aider à configurer une partie de cette automatiquement?

Dans mon scénario j'utilise ASP.NET 3.5 WebForms, LINQ to SQL Server et SQL 2005.

Répondre

1

Au risque de ne pas répondre à la question du tout ...

Vous semblez avoir une règle métier qui dit « ce domaine particulier devrait contenir un maximum de N caractères. »

Je dirais que la taille de la colonne de la base de données et la longueur maximale de la zone de texte sont des conséquences distinctes de cette règle métier. Fixer l'un de l'autre confond la corrélation avec la causalité.

En outre, l'application de cette règle d'affaires en examinant la longueur maximale de la colonne de base de données a d'autres effets:

  • vous frapperont la base de données à chaque fois pour ce qui pourrait autrement être une opération de validation en mémoire ; Si votre règle de gestion change légèrement (par exemple: N va de 100 à 80 caractères), alors vous avez besoin d'une modification au niveau du schéma; Certaines bases de données fonctionnant avec un codage de caractères de longueur variable comme UTF8 ne définissent que de façon approximative combien de caractères peuvent même tenir dans une colonne donnée; Plus généralement, vous associez la règle de gestion à un artefact d'implémentation. Que se passe-t-il si vous décidez ultérieurement d'utiliser une base de données d'objets?

Je ne suggère pas que vous modifiez la taille pas sensiblement vos colonnes de base de données (vous devriez), seulement que vous découpler la règle de gestion de la mise en œuvre de la base de données. Si vous pouvez vous en sortir avec une simple vérification de longueur fixe dans le code de l'application, je le suggérerais.

Modifier Après avoir lu votre question un peu plus attentivement, pour les longueurs maximales de votre champ de texte, vous avez besoin de N avant la validation. Néanmoins, c'est toujours une règle de gestion - pouvez-vous écrire un attribut MaximumLength pour vos accesseurs de champ et interroger cela?

0

Il y a schéma général d'info que vous pouvez demander à la base de données pour connaître la longueur maximale d'une colonne donnée.

Jetez un coup d'œil à SqlDataReader.GetSchemaTable(). Il va retourner la taille de la colonne (et beaucoup d'autres données) pour chaque colonne. Make ExecuteReader() a été appelé avec le paramètre de comportement défini sur KeyInfo.

Une autre approche consiste à interroger directement le dictionnaire de données dans le serveur SQL. Cela fait un moment mais je pense que quelque chose dans sys (sys.columns peut-être) aura l'information que vous cherchez.

Ensuite, vous pouvez mettre à jour la propriété textbox.

1

Je sais que vous vous demandez SQL Server, mais MYSQL, vous pouvez chercher votre colonne de

SELECT * FROM information_schema.`COLUMNS` C; 

Là, vous pouvez voir un champ de CHARACTER_MAXIMUM_LENGTH que vous donner exactement ce que vous voulez. Je suis sûr que vous pouvez trouver quelque chose comme ça pour SQL Server.

+0

fonctionne de la même dans MS SQL. – leppie

0

Dans SQL Server 2005 (et probablement 2000 & 2008, bien que je ne l'ai pas testé), vous pouvez utiliser la requête suivante pour trouver la longueur d'un champ varchar donné le nom de la table et le nom de la colonne:

select 
    t.name TableName, 
    c.name ColumnName, 
    c.max_length ColumnSize 
from sys.columns c 
inner join sys.tables t on (c.object_id = t.object_id) 
where t.name = 'MyTableName' 
    and c.name = 'MyFieldName' 

Le champ max_length dans sys.columns vous donnera ce dont vous avez besoin pour les champs de saisie de texte.

Je me rends compte que cela ne répond pas à votre question en termes de mise en œuvre par le biais de votre API, il devrait vous mettre sur votre chemin.

+0

Comme la réponse précédente, je vous suggère d'utiliser les vues du schéma d'information à la place, car elles seront plus cohérentes entre les différentes versions de SQL, etc. – leppie

0

Je ne pense pas qu'il existe une solution prête à l'emploi pour cela. Cependant ce que vous pouvez facilement faire est d'ajouter un commentaire spécialement formaté dans votre attribut MaxLength de la zone de texte tels que

<asp:TextBox runat="server" MaxLength="<%--<TABLENAME>.<COLUMNNAME>--%>" /> 

Ensuite, vous pouvez écrire un autre programme ou VS macro pour passer par vos fichiers ASPX et définissez le MaxLength à la longueur de cette colonne pour qu'elle devienne.

<asp:TextBox runat="server" MaxLength="20<%--<TABLENAME>.<COLUMNNAME>--%>" /> 

Vous pouvez exécuter ce programme lorsque vous ajoutez de nouveaux champs ou lorsque vous modifiez la taille des colonnes, etc.