Eviter redondance des données pendant un INSERT

issousam Messages postés 17 Date d'inscription mardi 4 mars 2008 Statut Membre Dernière intervention 3 septembre 2008 - 29 août 2008 à 11:04
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 - 3 sept. 2008 à 15:14
Bonjour,

je voudrais savoir comment eviter la redondance de données dans ma table lors d'INSERT.
J'ai essayé en definissant une contrainte d'unicité UNIQUE sur le champ mais le problème est que dés qu'il veut inserer une données qui existe déjà -> il ne le fait pas (jusque là TOUT VA BIEN) mais le problème est qu'il arrete l'instruction et donc arrete d'inserer la suite des données.

Voila le code :
if not exists (select * from dbo.sysobjects where id object_id(N'[dbo].[LOGICIEL]') and OBJECTPROPERTY(id, N'IsUserTable') 1)
 BEGIN
CREATE TABLE [dbo].[LOGICIEL] (
 [id_logiciel] [int] IDENTITY (1, 1) NOT NULL ,
 [nom_logiciel] [text] NOT NULL UNIQUE,
 [is_os] [text] NOT NULL,
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
END



GO



ALTER TABLE [dbo].[LOGICIEL] WITH NOCHECK ADD
 CONSTRAINT [PK_LOGICIEL] PRIMARY KEY  CLUSTERED
 (
  [id_logiciel]
 )  ON [PRIMARY]



et le code permettant de me connecter à la base de données (fichier .cs)

using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectString"].ToString())) { 
      SqlCommand cmd; string maRequete;
      maRequete = "INSERT INTO dbo.LOGICIEL(nom_logiciel,is_os) VALUES (@BDD_newL,'"+BDD_os+"')";
      cmd = new SqlCommand(maRequete,cn);
      cmd.Parameters.Add(new SqlParameter("@BDD_newL", SqlDbType.VarChar, 512));
      cmd.Parameters["@BDD_newL"].Value = BDD_newL;
      cn.Open();
      SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
}

Voila !!!

L'erreur que j'obtiens est : Violation de la contrainte UNIQUE KEY 'UQ_LOGICIEL_4119A21D' Impossible d'inserer une cle en double dans l'objet 'dbo.LOGICIEL'.
L'instruction a été arrété

SI vous avez une idée, Merci de me repondre !!!

3 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
31 août 2008 à 22:20
Salut,

Il faut utiliser un bloc try catch  autour de ton insertion.

Et dans le catch, tu geres ton cas d'erreur, log fichier, log IHM autre corrections des donnees (pour supprimer l'unicité)

Voila
0
issousam Messages postés 17 Date d'inscription mardi 4 mars 2008 Statut Membre Dernière intervention 3 septembre 2008
3 sept. 2008 à 14:43
merci de ta reponse,

On m'en a parlé... mais etant nouveau en programmation et SQL je voudrais savoir si tu pouvais me donner un petit exemple de cette facon de faire:

Ma fonction de connexion est de la forme :

using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectString"].ToString())) { 
            SqlCommand cmd; string maRequete; maRequete = "INSERT INTO dbo.LOGICIEL(nom_logiciel,is_os) VALUES (@BDD_newL,'"+BDD_os+"')";
             cmd = new SqlCommand(maRequete,cn);
            cmd.Parameters.Add(new SqlParameter("@BDD_newL", SqlDbType.VarChar, 512));
            cmd.Parameters["@BDD_newL"].Value = BDD_newL;
            cn.Open();
            SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
}

MAis je vois pas où mettre le try catch

Je pensais à mettre le try avant le INSERT mais je ne sais pas quoi mettre dans le catch

Desolé de poser des questions comme ça mais j'apprends...

MERCI d 'avance
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
3 sept. 2008 à 15:14
Voici une proposition non testée

using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectString"].


ConnectionString


))

            SqlCommand
cmd; string maRequete; maRequete = "INSERT INTO
dbo.LOGICIEL(nom_logiciel,is_os) VALUES (@BDD_newL,@
BDD_o
)";

             cmd = new SqlCommand(maRequete,cn);
            cmd.Parameters.Add(new SqlParameter("@BDD_newL", SqlDbType.VarChar, 512));
            cmd.Parameters["@BDD_newL"].Value = BDD_newL;

            cmd.Parameters["
@BDD_o
"].Value =
BDD_o
;
             try{

            cn.Open();

long lastID = Convert.ToInt64(cmd.ExecuteScalar()); --> Renvoie l'id inserer - exemple insertion
ou
           cmd.ExecuteNonQuery(); --> Execution exemple suppression et mise a jour
}
catch{Exception e)
{
---> Traitement de l'erreur exemple cle en double ....
}
finally
{

if (cmd != null)
 
{cmd.CloseConnection();}


}
}
0
Rejoignez-nous