none
DataTable et Longeur de chaine RRS feed

  • Question

  • Bonjour,

    J'ai une base de donnée sous Sql server 2008 avec une connexion en sqlclient (avant sous sql server 2000 en oldeb)

    le probleme est que maintenant si je charge des données d'une table, lorsque je recupere la valeur il complete la fin de la chaine avec des espaces (pour completer jusqu'a la capacité de la colonne) le type de donner dans sql serveur 2008 est varchar

    Est ce que qq voie d'ou cela peu provenir ? une options dans la chaine de connexion ?

    Merci,


    Cordialement Sébastien DataBase2Code
    mardi 14 décembre 2010 17:41

Réponses

  • Bonjour,

    Assurez vous que les données présentes dans la base de données ne contiennent pas des espaces à la fin de la chaîne. Pour informations, le passage d'une colonne de type char en varchar ne supprime pas les espaces automatiquement (il faudra faire une mise à jour des colonnes concernées).

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    • Marqué comme réponse Aserf jeudi 16 décembre 2010 10:03
    mardi 14 décembre 2010 19:43
    Modérateur

Toutes les réponses

  • Bonjour,

    Assurez vous que les données présentes dans la base de données ne contiennent pas des espaces à la fin de la chaîne. Pour informations, le passage d'une colonne de type char en varchar ne supprime pas les espaces automatiquement (il faudra faire une mise à jour des colonnes concernées).

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    • Marqué comme réponse Aserf jeudi 16 décembre 2010 10:03
    mardi 14 décembre 2010 19:43
    Modérateur
  • Bonjour, le probleme ne peu pas provenir de la, j'ai fait une requette sql manuel et j'ai rechecher la ligne, la requette est exactement sa : INSERT INTO [TBl_DONNE_Bulk] ( [ID], [TEXT255_1], [TEXT255_2], [DATE_1], [ENTIERLONG_1], [BOOLEAN_1] ) VALUES ( '10121518-3756-9360-01ed-2023ce08474b', 'text', Null, '19000101', 0, 0 ) et lorsque je recharge la ligne depuis un dataset la colonne "text255_1" contient "text " avec des espace derriere pour une longeur total de 255 (la longeur du varchar) je ne comprend plus rien, je me demande si ce ne serai pas un parametage coté serveur ? est ce que cela et possible ? meci,
    Cordialement Sébastien DataBase2Code
    mercredi 15 décembre 2010 17:42
  • > Bonjour, le probleme ne peu pas provenir de la, j'ai fait une requette sql
    > manuel et j'ai rechecher la ligne, la requette est exactement sa : INSERT
    > INTO [TBl_DONNE_Bulk] ( [ID], [TEXT255_1], [TEXT255_2], [DATE_1],
    > [ENTIERLONG_1], [BOOLEAN_1] ) VALUES (
    > '10121518-3756-9360-01ed-2023ce08474b', 'text', Null, '19000101', 0, 0 ) et
    > lorsque je recharge la ligne depuis un dataset la colonne "text255_1"
    > contient "text " avec des espace derriere pour une longeur total de 255 (la
    > longeur du varchar) je ne comprend plus rien, je me demande si ce ne serai
    > pas un parametage coté serveur ? est ce que cela et possible ? meci,
     
    Que donne la requête suivante ?
    SELECT LEN(TEXT255_1)
    FROM   TBL_DONNE_Bulk
    WHERE  ID = '10121518-3756-9360-01ed-2023ce08474b'
     
    Quelle est la requête / procédure qui peuple le DataSet ?
     
    --
    Fred
    foleide@free.fr
     
    mercredi 15 décembre 2010 17:56
  • Bonjour,

    Petite nouvelle information,

    j'ai executer ce script sur le serveur directement

    use

     

    [DB2C_Structure]

    DELETE

     

    FROM [DB2C_Structure].[dbo].[TBl_DONNE_Bulk];

    insert

     

    into [dbo].[TBl_DONNE_Bulk](ID,TEXT255_1 ) Values ('1','test');

    select

     

    * from [TBl_DONNE_Bulk]

    et lorsque j'edite la ligne depuis management studio elle contient les caractere, est ce que qq vois ou ce parametre ce trouve sur le serveur ?

    merci,

     


    Cordialement Sébastien DataBase2Code
    mercredi 15 décembre 2010 18:04
  • Bonjour,

    Petite nouvelle information,

    j'ai executer ce script sur le serveur directement

    use

     

    [DB2C_Structure]

    DELETE

     

    FROM [DB2C_Structure].[dbo].[TBl_DONNE_Bulk];

    insert

     

    into [dbo].[TBl_DONNE_Bulk](ID,TEXT255_1 ) Values ('1','test');

    select

     

    * from [TBl_DONNE_Bulk]

    et lorsque j'edite la ligne depuis management studio elle contient les caractere, est ce que qq vois ou ce parametre ce trouve sur le serveur ?

    merci,

     


    Cordialement Sébastien DataBase2Code
    mercredi 15 décembre 2010 18:05
  • Bonjour,

    un article qui traite du probleme, apparement c'est la collation qui n'est pas bonne,

    http://blogs.developpeur.org/coq/archive/2009/12/08/sql-server-et-la-gestion-des-espaces-en-fin-de-cha-ne-ou-test-test.aspx

    est ce que qq pourrai me dir laquelle utiliser pour que je n'es pas d'espace derriere les chaine ?

    Merci,


    Cordialement Sébastien DataBase2Code
    mercredi 15 décembre 2010 18:20
  • Bonjour Aserf,

    Vous devriez trouver une explication de ce phénomène dans le lien:

    http://msdn.microsoft.com/fr-fr/library/ms187403(v=SQL.100).aspx

    et notamment :

    "La valeur de SET ANSI_PADDING n'a aucun impact sur les valeurs de type nchar, nvarchar, ntext, text, image et sur les grandes valeurs. Le comportement par défaut est toujours celui de l'option SET ANSI_PADDING ON. Les espaces et les zéros à droite ne sont donc pas tronqués"

    "La valeur par défaut de SET ANSI_PADDING est ON. Le pilote ODBC SQL Server Native Client et le fournisseur OLE DB SQL Server Native Client pour SQL Server affectent automatiquement la valeur ON à ANSI_PADDING lors de la connexion. Cette option peut être configurée dans les sources de données et les attributs de connexion ODBC, ou encore dans les propriétés de connexion OLE DB définies dans l'application avant la connexion. Dans le cas d'applications DB-Library, SET ANSI_PADDING prend par défaut la valeur OFF"

    La seule possibilité que je connaisse est d'utiliser la methode TrimEnd() de la classe String sur votre chaine de caractères

    http://msdn.microsoft.com/fr-fr/library/system.string.trimend(v=VS.90).aspx

    Bonne journée

    PS : cette partie est plutot destinée à Gilles ou Alex qui sont surement de plus grands spécialistes de SQL Server que moi.

    Je suis surpris par ce comportement de nvarchar(n) car jusqu'à présent, je me basais sur ce que j'ai lu dans l'excellent livre de Kalen Delaney Inside Microsoft SQL Server 2005 : the storage engine. D'après ce que j'ai lu , les données de type nvarchar(n) sont stockées avec seulement le nombre de caractères effectivement envoyés lors de l'insertion( donc si la chaine ne comporte que 12 caractères alors que n= 3000 , seuls 12 caractères seront stockés et la longueur réelle de la colonne est indirectement stockée dans ce que Kalen appelle "column offset array" ( voir pages 222/223 de son livre ). Ce qui explique la recommendation générale d'utiliser nvarchar(3000) au lieu de nchar(3000) quand la longueur réelle de la chaine est aléatoire ( je ne tiens pas compte des 2 octets nécessaires perdus pour stocker l'offset de fin de chaine ) 

    Il est fort possible que je fasse une confusion entre le stockage des données et la manipulation du contenu des nvarchar(n). Serait-il possible que ce soit TRANSACT-SQL  ( ou le fournisseur OLEDB,ODBC ) qui complète automatiquement les chaines à leur longueur maximale lors du SELECT ?.Celà pourrait expliquer ce petit problème , surtout que le BOL indique

    "Dans une future version de MicrosoftSQL Server ANSI_PADDING sera toujours ON et toute application qui définira explicitement l'option à OFF produira une erreur. Pour cette raison, évitez de l'utiliser dans les nouveaux travaux de développement et prévoyez de modifier les applications qui l'utilisent actuellement"

    Merci d'avance pour toute explication sur ce sujet


    Mark Post as helpful if it provides any help.Otherwise,leave it as it is.
    jeudi 16 décembre 2010 11:04