none
SQL Server 2005 - Procedures stockees - Problème d'accents dans un parametre RRS feed

  • Question

  • Bonjour,

    J'ai une procédure stockéee sous SQL Server 2005.
    Cette procédure prend deux paramétres :
        @K2ProcID int,
        @nomFichier varchar(150)

    Lorsque j'execute ma procédure, je passe au second paramètre une chaine avec des accents (par exemple "tété").
    Dans ma procédure, je fais en sorte d'afficher dans un fichier de log ce que je recois comme paramètre.
    Dans mon fichier de log, après execution de la procédure, je reçois "t,t," au lieu de "tété".
    Il y aurait donc un probléme avec les accents sur ce paramètre.

    Faut-il configurer un élément particulier dans SQL server, ou changer le type du paramètre ?
    Si vous avez une idée...

    Merci d'avance.

    Voici le code complet de ma procédure :

    PROCEDURE [dbo].[spWebSite_DeletePJFiles]
    (
        @K2ProcID int,
        @nomFichier varchar(150)
    )
    AS

    DECLARE  @v_Command  VARCHAR(512)

    BEGIN
    SET NOCOUNT ON
    SET @v_Command = 'echo ' + @nomFichier + '> c:\bcp.txt'
    exec master..xp_cmdshell @v_Command, NO_OUTPUT

        DELETE FROM [PJFacture]
        WHERE K2ProcID = @K2ProcID
        AND nomFichier = @nomFichier

    END
    lundi 18 février 2008 13:28

Toutes les réponses

  • Bonjour,

     

    Je suppose que c'est dû au grand classique Unicode/ANSI/DOS

     

    Les fichiers .txt sont en encoding DOS/ANSI par défaut sauf quand ils sont crées par le bloc-note , dans ce cas , vous pouvez choisir votre encodage UT8,UTF16...

     

    La solution serait peut-être de créer un fichier vide avec le même encodage que les fichiers .sql créés par Sql Server Management Studio

     

    Je vais regarder dans la documentation MSDN comment réagit echo

     

    Bonne journée

    lundi 18 février 2008 19:54
  • Bonjour,

    Effectivement, il s'agit bien d'un problème lié à "echo".

    Pour préciser mon problème. J'appel cette procédure dans un projet c#. Je lui passe donc en parametre une chaine.
    Voila mon code c# :

                commDelete.CommandType = CommandType.StoredProcedure;
                commDelete.CommandText = "spWebSite_DeletePJFiles";

                commDelete.Parameters.Add("@nomFichier", System.Data.SqlDbType.VarChar,150);
                commDelete.Parameters.Add("@K2ProcID", System.Data.SqlDbType.Int);
               
                commDelete.Parameters["@nomFichier"].Value = in_str_nameFile;
                commDelete.Parameters["@K2ProcID"].Value = in_int_procId;

    Lorsque j'appel ma procédure stockée via ce code c#, je donne au parametre @nomFichier la valeur "tést.text".
    La méthode echo de ma procédure stockée n'écrit rien dans mon fichier de log.
    Il semblerait donc que le parametre soit vide. Or, lorsque j'ajoute un parametre OUTPUT à ma procedure pour renvoyer la valeur de mon parametre @nomFichier, je retrouve bien "tést.text" au niveau c#.
    Le parametre @nomFichier n'est donc pas vide. Il s'agit peut etre d'un problème d'encodage au niveau c# qui fait que ma procedure sous sql server ne comprend pas la valeur du parametre.

    Avez-vous une idée ?
    Merci d'avance.
    mardi 19 février 2008 13:38
  • Bonjour,

     

    J'ai testé sur mon Sql Server 2005 Express.

    J'ai le même problème.

    Pourquoi ne pas écrire directement dans le fichier avant et après le delete de façon à savoir si tout se passe bien

    Par exemple, en écrivant dans le fichier le message d'erreur que vous pourriez avoir en cas de "plantage" ? ( en utilisant StreamWriter ). Je le fais pour mes applications, ainsi je peux me suivre ce que font les utilisateurs et surtout j'obtiens plus sûrement des données me permettant de réagir en cas de plantage )

     

    Je crois me rappeler que Microsoft recommande de ne pas autoriser l'utilisation de xp_cmdshell ( je donne le nom de tête ) car c'est une porte ouverte à beaucoup de problèmes.

     

    Bonne journée

     

     

     

    mardi 19 février 2008 15:14
  • Merci pour ces renseignements.
    En ce qui concerne xp_cmdshell, je ne compte pas l'utiliser au final, c'est juste pour tester mon parametre.

    En tout ca, la procédure stockée ne pose pas de problème, elle ne renvoi pas d'erreur. Le delete ne fonctionne pas (mais ne retourne pas d'erreur) car tout simplement la clause WHERE ne trouve rien, vu que le parametre n'est pas bon.

    Je tente de voir pour convertir en BINARY mais pour l'instant je n'arrive pas a convertir correctement mon string en byte[] au niveau c#.

    Si vous avez une idée dans ce sens....
    mardi 19 février 2008 16:32
  • Bonjour,

     

    La clause WHERE ne marche pas mais est-ce le Int ou le String qui n'est pas trouvé ?

     

    Si c'est le String, il faudrait tester avec un nom de fichier sans accent pour voir si c'est vraiment un problème d'accent.

     

    Par contre, il faudrait voir la façon dont l'INSERT a été fait et repartir de là.

     

    Comment a été créé le nom de fichier ? C'est peut-être bien là la clé du problème

     

    Bonne journée

     

     

    mardi 19 février 2008 18:35
  • Bonjour,

    Le problème est sur le parametre String.
    Il s'agit bien d'un problème d'accent car cela fonctionne pour des noms de fichiers sans accent.
    De plus, l'insert ne pose pas de problème puisque dans la base, les noms de fichiers avec accent sont bien présents.
    Lorsque j'execute la procédure directement via SQL Server, cela fonctionne sans problème.
    C'est donc bien lorsque je passe le parametre depuis mon application c# qu'il y a un problème.

    Bonne journée

    mercredi 20 février 2008 08:44
  • Bonjour,

     

    Il est normal que dans SSMS, l'insertion se fasse correctement puisque le string est passé avec l'encodage correct.

     

    Il faudrait voir si en utilisant le N' dans la procédure stockée tout se passe bien.

     

    Si vous avez Visual Studio ou VC# , je me souviens d'un article ( 26/12/2007 ) de Christian Robert à ce sujet .

    Comme je l'ai trouvé très interessant, je vous donne le lien :

    http://blogs.developpeur.org/christian/archive/2007/12/20/sql-server-a-quoi-sert-le-n-devant-une-cha-ne-de-caract-re.aspx

     

    Peut-être qu'il pourra consacrer un peu de temps pour vous aider à résoudre ce problème...

    l me semble que je l'ai vu aux TechDays

     

    Je vais faire quelques tests d'encodage

     

    Bonne journée

     

    mercredi 20 février 2008 13:02