web 2.0

Longueur trop grande : les procédures stockées tronquent au lieu de retourner une erreur

Une petite question qui a été soulevée par Matthieu MEZIL sur son blog. Lorsque l'ont fait appel a une procédure stockée pour faire un Insert ou un Update sur un champ avec une taille définie ie : NVARCHAR(10) mais qu'on lui envoie plus de 10 charactères, Sql Server Tronque cette valeur et aucune Exception n'est levée..

Prenons un exemple simple.

Considérons la définition d'une table Customer suivante

image

Le champ Email a volontairement été defini avec une longeur de 10 .

Ensuite la procédure stockée d'Insertion correspondante

CREATE Procedure Customer_Insert
(
    @FirstName    NVARCHAR(50),
    @LastName    NVARCHAR(50),
    @Email        NVARCHAR(10)
)
AS

INSERT INTO [Customers]
           ([FirstName]
           ,[LastName]
           ,[Email])
     VALUES
           (@FirstName
           ,@LastName
           ,@Email)
GO

 

Du coté de notre code C# de notre application nous tentons tout d'abord de faire une insertion avec une adresse email avec une longueur de moins de 10 charactères.

public class Customer
{
    public String FirstName { get; set; }
    public String LastName { get; set; }
    public String Email { get; set; }
}

class Program
{
    static String SqlCnx = @"DataSourceSqlConnectionString";
    static void Main(string[] args)
    {
        Customer cus = new Customer()
        {
            FirstName = "Scott",
            LastName = "Dummy",
            Email = "sd@mail.to"
        };

        SqlConnection _cn = new SqlConnection(SqlCnx);
        _cn.Open();
        SqlCommand _cmd = new SqlCommand();

        _cmd.Connection = _cn;
        _cmd.CommandType = System.Data.CommandType.StoredProcedure;
        _cmd.CommandText = "Customer_Insert";

        _cmd.Parameters.Add(new SqlParameter("FirstName", cus.FirstName));
        _cmd.Parameters.Add(new SqlParameter("LastName", cus.LastName));
        _cmd.Parameters.Add(new SqlParameter("Email", cus.Email));

        try
        {
            _cmd.ExecuteNonQuery();
            Console.WriteLine("Tout c'est bien passé");
        }
        catch (SqlException ex)
        {
            Console.WriteLine(ex.Message);
        }
        finally
        {
            _cn.Close();
        }
    }
}

 

A l'execution nous obtenons le résultat suivant

image 

image

Aucun problème, Impecable !! Mais ...
 

Maintenant essayons avec une adresse email de plus de 10 charactères ...

image

Tout ce passe bien coté applicatif, pas d'Exception, mais coté SQL nous remarquons que l'adresse email a été tronquée et sans Exception levée du coté de notre application. C'est quelque peu génant :(

image

 

La solution est donc de faire en sorte qu'une Exception soit levée avant de faire appel a la procédure stockée d'Insertion.
Vous me direz que vous pouvez faire un test au niveau de la méthode d'Insertion pour vérifier la longueur de l'adresse Email, cependant ce test ne sera valide que sur cette méthode d'Insertion en particulier de votre couche d'accès aux données et l'erreur se représentera si vous faites d'autres Insertions dans d'autres méthodes de votre DAL pour cet Objet Customer.

La meilleure solution est donc de faire la vérification directement dans votre Objet Customer.

public class Customer
{
    public String FirstName { get; set; }
    public String LastName { get; set; }

    private String _Email;
    public String Email
    {
        get
        {
            return _Email;
        }
        set
        {
            if (value.Length > 10)
                throw new ArgumentOutOfRangeException("Email ne doit pas dépasser 10 charactères");
            _Email = value;
        }
    }
}

 

Maintenant voyons l'éxecution avec notre adresse email trop longue.

image

l'Exception a bien été levée ! et vous permet donc de gérer cela en amont dans votre application plutot que de se retrouver avec des données tronquées dans la base de donnée.

Et voila,

 

A Bientôt !



Views(776)

kick it on DotNetKicks.com

Share/Save/Bookmark Subscribe

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , ,

C# | Sql Server

Comments

Technorati Profile