Capacité de champs dans sql

papiona Messages postés 91 Date d'inscription samedi 18 novembre 2006 Statut Membre Dernière intervention 13 novembre 2009 - 12 nov. 2009 à 23:27
papiona Messages postés 91 Date d'inscription samedi 18 novembre 2006 Statut Membre Dernière intervention 13 novembre 2009 - 13 nov. 2009 à 18:45
Bonjour,
J'ai un formulaire dans visual studio 2005 me permet de saisir des informations et les enregistrer dans ma base de donnée(sql server 2000),mais le problème c'est que l'utilisateur peut saisir jusqu'à 3 pages dans une zone de texte ,et ca provoque des problemes au niveau de la table(BD) ,Parceque le type du champs ne peux pas supporter tt ce texte (j'ai essayer nvarcahr il est limité a 4000,varchar à 8000 mais ce n'es pas suffisant)alors que ce que je dois faire dans ce cas là,sachant que l'utilisateur va saisir le texte en Arabe
J'attends vos reponses et Merci d'avance

9 réponses

Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
12 nov. 2009 à 23:58
Salut,

Sers-toi de la propriété MaxLength du textbox qui limite le nombre de caractères saisis dans un champ.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
papiona Messages postés 91 Date d'inscription samedi 18 novembre 2006 Statut Membre Dernière intervention 13 novembre 2009
13 nov. 2009 à 00:06
Mais je crois que ca va donner toujours un probleme quand je veux enregistrer les données dans la table ,le type de champs ne peux pas supporter tout le text ?
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
13 nov. 2009 à 01:05
Salut
C'est à toi, dans ta DB, d'organiser la sauvegarde des données.
Si, supposons, un champ texte d'une table peut accueillir 255 caractères
ET que tu ne veuilles pas limiter la saisie comme te l'a proposé Mayzz, il faut stocker autant de champs texte qu'il y a de paquets de 255 caractères.

Il te faudra donc une table "MesDocuments" avec, par exemple
.idDocument (index unique)
.Titre
.Auteur ... tout ce que tu veux (sauf le texte)
puis une autre table "MesTextes" avec :
.idTexte (index unique)
.idDocument
.NoBloc (numéro permettant de remettre le texte dans l'ordre)
.monTexte (les 255 caractères)

et quand tu veux sauver ton long-long-long texte, tu le découpes en tranches de 255 char et tu crées autant d'enregistrement dans "MesTextes" en insérant le idDocument auquel se rapporte ce texte et un NoBloc que tu génèreras dans l'ordre croissant du découpage.

Quand tu voudras relire ton texte, il te suffira de faire un truc du genre :
  Select T1.monTexte
    From MesTextes T1, MesDocuments T2
   Where T2.Titre = 'Le grand livre de Papiona'
     And T1.idDocument = T2.idDocument
   Order by NoBloc

Tu n'auras plus qu'à recoller les morceaux pour récupérer la totalité du texte.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
13 nov. 2009 à 09:57
Ah effectivement j'ai pris le problème dans le sens inverse ^^

Oui pour avoir un champ plus grand que 4000 caractères, une concaténation avec une relation de table de 1 à N.

De cette façon tu récupère tes champs via une requete 'SELECT monTexte FROM MesTextes WHERE idDocument = @idDoc ORDER BY NoBloc' pour reprendre l'idée de Jack.

Je te conseille même de faire une relation 1 à N au sein de ta base avec une règle de suppression par cascade, de cette manière si le document avec l'id 1 est effacé, les textes dans la table 'MesTextes' en rapport avec ce document seront également supprimés.

En .Net cela peut se faire au niveau de ta base SQL ou simplement via un DataSet fortement typé.

++ Mayzz.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
papiona Messages postés 91 Date d'inscription samedi 18 novembre 2006 Statut Membre Dernière intervention 13 novembre 2009
13 nov. 2009 à 12:08
Bonjour,
Je vous remercie pour vos réponses
mais pouvez vous m'expliquer encore ,le Nobloc un champs auto-incrémente ?
et le type de texte ?
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
13 nov. 2009 à 12:53
En y réfléchissant bien, et je pense que Jack qui a nettement plus d'expérience que moi me corrigera si je dis des bêtises :

Tu n'est pas forcément obligé de mettre un NoBloc, en effet SQL Server, à défaut de clause ORDER BY, te retourne les lignes dans l'ordre ou celle-ci ont été insérés.

Du coup seule l'ID unique de la table est nécessaire (quoi que, pas de relation 1 à N avec une autre table donc...) pour supprimer les textes correspondants.

Lors ce que tu vas charger un texte, tu va concaténer plusieurs champs texte, de la table 'DocumentsText' et permettre à la personne de les modifier, ainsi, lors de la mise à jour, il serait préférable pour toi d'effacer les ancien textes puis de recréer plusieurs champs via le nouveau texte scindé en paquet de 4000 caractères.

Tu aura donc par exemple:

DELETE * FROM DocumentsText WHERE idDocument = @idDoc

Puis tu devra inséré à nouveau le texte...

Du coup les champs seront toujours dans l'ordre.


Tu peux donc, je pense suivre le schéma suivant :

"MesDocuments" :
idDocument (uniqidentifier ou int auto-incrémenté)
Titre [cahr(255) par exemple]
Auteur [cahr(255) par exemple]

puis une autre table "MesTextes" avec :
idDocument (uniqidentifier ou int auto-incrémenté selon le type dans MesDocuments + Contrainte de suppresion en cascade)
monTexte [nChar, nVarChar etc...]

Je ne suis pas très calé en SQL mais il me semble que le champ 'Text' peut accueillir plus de caractères. Peut importe en SQL la longueur d'une ligne de table est limité donc peut importe le type de donnée si ca dépasse, ca dépasse scinder reste obligatoire pour un long texte.


Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
papiona Messages postés 91 Date d'inscription samedi 18 novembre 2006 Statut Membre Dernière intervention 13 novembre 2009
13 nov. 2009 à 13:36
Dans mon cas l'utilisateur n'a pas le droit de supprimer ni modifier ces informations donc j 'ai pas besoin de créer les règles de suppression en cascade.Ce que je veux savoir c'est le fait de scinder le texte comment le faire?,je rempli les zones de texte puis un button enregistrer dans les 2 tables,une contient le (id,..) et l'autre (l'id+le texte ).
donc comment découper le texte au moment de sa creation
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
13 nov. 2009 à 15:35
Dans mon cas l'utilisateur n'a pas le droit de supprimer ni modifier ces informations donc j 'ai pas besoin de créer les règles de suppression en cascade.


Ta base ne sera donc jamais mise à jour ? Même par tes soins ? Et si tu fais une erreur de saisie ? Comment vas-tu faire ?

Pour le texte en vb c'est simple :

        Dim Text As String = TextBox1.Text
        Dim ListText As List(Of String)

        While Text.Length > 4000
            Dim tmpTxt As String = Text.Substring(0, 4000)
            ListText.Add(tmpTxt)
            Text = Text.Substring(4000, Text.Length - 4000)
        End While

        If Text.Length > 0 Then
            ListText.Add(Text)
        End If

        For Each Item As String In ListText
            '[Ta requête SQL]
        Next

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
papiona Messages postés 91 Date d'inscription samedi 18 novembre 2006 Statut Membre Dernière intervention 13 novembre 2009
13 nov. 2009 à 18:45
J'ai encore un probléme :(
les données sont enregistrés dans la base mais quand je viens de les afficher dans un etat crystalreport ca ne depasse pas 3 pages si j'essayer d'ajouter des ligne s'affiche un message le voila :
"impossible d'activer les contraintes,une ou plusieur lignes contiennent des valeurs qui voilent les contraintes de type non null unique ou de clé externe"
0
Rejoignez-nous