IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[SQL & C#]Insertion multiple en base


Sujet :

C#

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 103
    Par défaut [SQL & C#]Insertion multiple en base
    Bonjour,

    je cherche a inserer en base plusieurs lignes dans le schema suivant :
    j'ai 2 tables
    la 1ere est une table de demande de modification (clé primaire)
    la 2e pour la liste des champs à modifier (clé primaire + clé etrangere de la 1ere table)

    Actuellement j'arrive a inserer ma ligne dans ma 1ere table, mais le probleme est dans l'insertion des lignes dans la 2e table; je pense que l'erreur est du au fait que la clé étrangère ne soit pas "physiquement" sur la table!

    pourtant j'utilise une transaction!

    voici le code d'insertion de la 1ere table

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
     
    protected void btnModifierAgent_Click(object sender, EventArgs e)
        {
            bool error = false;
            String connectionString = ConfigurationManager.ConnectionStrings["csIntranetSpecifique"].ConnectionString;
     
            SqlTransaction transaction = null;
            SqlConnection connection = new SqlConnection(connectionString);
     
            try
            {
                //Requete insertion
                string commandInsert = "INSERT INTO [Intranet_Specifique].[dbo].[ANNUAIRE_DEMANDE]"
                    + "([ADE_Date],[ADE_Utilisateur]) VALUES (@ADE_Date, @ADE_Utilisateur); SELECT @@IDENTITY";
     
                connection.Open();
                transaction = connection.BeginTransaction();
                SqlCommand sqlCommand = new SqlCommand(commandInsert, connection);
     
                //Création et décalartion des paramètres
                sqlCommand.Parameters.Add(new SqlParameter("@ADE_Date", SqlDbType.DateTime));
                sqlCommand.Parameters.Add(new SqlParameter("@ADE_Utilisateur", SqlDbType.NVarChar, 50));
     
                //Attribution des valeurs aux paramètres
                sqlCommand.Parameters["@ADE_Date"].Value = DateTime.Now;
                sqlCommand.Parameters["@ADE_Utilisateur"].Value = this.Login;
     
                sqlCommand.Transaction = transaction;
                int id = Convert.ToInt16(sqlCommand.ExecuteScalar());
     
                //Enregistrement des demandes de modifications
                //pour le nom
                if (this.ViewState[this.txtNom.ID].ToString() != this.txtNom.Text)
                {
                    this.insertAnnuaireLigne(connection, transaction, id, "", this.ViewState[this.txtNom.ID], this.txtNom.Text);
                }
            }
            catch(Exception ex)
            {
                error = true;
            }
            finally
            {
                // Validation de la transaction
                if (transaction != null)
                {
                    if (error)
                    {
                        transaction.Rollback();
                    }
                    else
                    {
                        try
                        {
                            transaction.Commit();
                        }
                        catch
                        {
                            transaction.Rollback();
                        }
                    }
                }
                // Fermeture de la connexion
                if (connection.State == ConnectionState.Open)
                {
                    connection.Close();
                }
            }
        }
    Voici le code d'insertion des lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
     
      private void insertAnnuaireLigne(SqlConnection pConnection, SqlTransaction pTransaction
            , int pIdAnnuaire, string pType, object pAncienneValeur, object pNouvelleValeur)
        {
            string CommantInsertLigne = "INSERT INTO [Intranet_Specifique].[dbo].[ANNUAIRE_DEMANDE_LISTE] "
                + "([ADL_IdAnnuaireDemande],[ADL_Type],[ADL_Etat]"
                //+ ",[ADL_Utilisateur],[ADL_AncienneImage],[ADL_NouvelleImage]) VALUES (@ADL_IdAnnuaireDemande"
                + ",[ADL_Utilisateur]) VALUES (@ADL_IdAnnuaireDemande"
                //+ ",@ADL_Type,@ADL_Etat,@ADL_AncienneValeur,@ADL_NouvelleValeur,@ADL_Utilisateur,@ADL_AncienneImage,@ADL_NouvelleImage)";
                + ",@ADL_Type,@ADL_Etat,@ADL_Utilisateur)";
            SqlCommand sqlCommandLigne = new SqlCommand(CommantInsertLigne, pConnection);
     
            //Création et décalartion des paramètres
            sqlCommandLigne.Parameters.Add(new SqlParameter("@ADL_IdAnnuaireDemande", SqlDbType.Int));
            sqlCommandLigne.Parameters.Add(new SqlParameter("@ADL_Type", SqlDbType.NVarChar, 50));
            sqlCommandLigne.Parameters.Add(new SqlParameter("@ADL_Etat", SqlDbType.NVarChar, 50));
            sqlCommandLigne.Parameters.Add(new SqlParameter("@ADL_Utilisateur", SqlDbType.NVarChar, 50));
            //sqlCommandLigne.Parameters.Add(new SqlParameter("@ADL_AncienneValeur", SqlDbType.NVarChar, 50));
            //sqlCommandLigne.Parameters.Add(new SqlParameter("@ADL_NouvelleValeur", SqlDbType.NVarChar, 50));
            //sqlCommandLigne.Parameters.Add(new SqlParameter("@ADL_AncienneImage", SqlDbType.Image));
            //sqlCommandLigne.Parameters.Add(new SqlParameter("@ADL_NouvelleImage", SqlDbType.Image));
     
            //Attribution des valeurs aux paramètres
            sqlCommandLigne.Parameters["@ADL_IdAnnuaireDemande"].Value = pIdAnnuaire;
            sqlCommandLigne.Parameters["@ADL_Type"].Value = "En attente";
            sqlCommandLigne.Parameters["@ADL_Etat"].Value = pType;
            sqlCommandLigne.Parameters["@ADL_Utilisateur"].Value = this.Login;
            //if (pType.Equals("Image"))
            //{
            //    sqlCommandLigne.Parameters["@ADL_AncienneImage"].Value = (byte[]) pAncienneValeur;
            //    sqlCommandLigne.Parameters["@ADL_NouvelleImage"].Value = (byte[]) pNouvelleValeur;
            //    sqlCommandLigne.Parameters["@ADL_AncienneValeur"].Value = null;
            //    sqlCommandLigne.Parameters["@ADL_NouvelleValeur"].Value = null;
            //}
            //else
            //{
            //    sqlCommandLigne.Parameters["@ADL_AncienneImage"].Value = null;
            //    sqlCommandLigne.Parameters["@ADL_NouvelleImage"].Value = null;
            //    sqlCommandLigne.Parameters["@ADL_AncienneValeur"].Value = Convert.ToString(pAncienneValeur);
            //    sqlCommandLigne.Parameters["@ADL_NouvelleValeur"].Value = Convert.ToString(pNouvelleValeur);
            //}
            sqlCommandLigne.Transaction = pTransaction;
            sqlCommandLigne.ExecuteNonQuery();
        }
    PS ne fait pas attention au code en commentaire, j'effectuais des tests!

    merki d'avance.

  2. #2
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Mes facultés de divination étant limitées, pourrais tu donner l'erreur en question ?
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 103
    Par défaut
    Voici l'erreur :

    L'instruction INSERT est en conflit avec la contrainte FOREIGN KEY "FK_ANNUAIRE_DEMANDE_LISTE_ANNUAIRE_DEMANDE". Le conflit s'est produit dans la base de données "Intranet_Specifique", table "dbo.ANNUAIRE_DEMANDE", column 'ADE_Id'.
    L'instruction a été arrêtée.

    je viens de tester une insertion directe dans la table, et j'ai eu la meme erreur
    apparement l'erreur serait plutot dans la définition de la table

    je continue de chercher

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 103
    Par défaut
    En enlevant la définition de ma clé étrangère ça marche!

    je comprend pas pourquoi ça ne marche pas avec

  5. #5
    Membre Expert
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Par défaut
    Il semblerait que tu essayes d'insérer une valeur qui n'existe pas dans ta table ou que tu n'insères pas une valeur obligatoire.
    Vérifie les données que tu enregistres

  6. #6
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Tu es sur que ta clé était écrite correctement ? Qu'elle référençait la bonne table ? Que la clé était bien définie sur la table fille et pas sur la table parent ?
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 103
    Par défaut
    Voici les scripts de mes tables avec la clé étrangère!

    pour ce qui est du test du code, cela fonctionne sans la clé étrangère, donc je pense que mon code est correct!
    ça doit etre la configuration niveau sql serverqui coince

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    USE [Intranet_Specifique]
    GO
    /****** Objet :  Table [dbo].[ANNUAIRE_DEMANDE]    Date de génération du script : 01/07/2008 11:45:25 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[ANNUAIRE_DEMANDE](
    	[ADE_Id] [int] IDENTITY(1,1) NOT NULL,
    	[ADE_Date] [datetime] NOT NULL,
    	[ADE_Utilisateur] [nvarchar](50) NOT NULL,
     CONSTRAINT [PK_ANNUAIRE_DEMANDE] PRIMARY KEY CLUSTERED 
    (
    	[ADE_Id] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     
     
     
     
     
     
     
    USE [Intranet_Specifique]
    GO
    /****** Objet :  Table [dbo].[ANNUAIRE_DEMANDE_LISTE]    Date de génération du script : 01/07/2008 11:45:05 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[ANNUAIRE_DEMANDE_LISTE](
    	[ADL_Id] [int] IDENTITY(1,1) NOT NULL,
    	[ADL_IdAnnuaireDemande] [int] NOT NULL,
    	[ADL_Type] [nvarchar](50) NOT NULL,
    	[ADL_Etat] [nvarchar](50) NOT NULL,
    	[ADL_Utilisateur] [nvarchar](50) NOT NULL,
    	[ADL_AncienneValeur] [nvarchar](50) NULL,
    	[ADL_NouvelleValeur] [nvarchar](50) NULL,
    	[ADL_AncienneImage] [image] NULL,
    	[ADL_NouvelleImage] [image] NULL,
     CONSTRAINT [PK_ANNUAIRE_DEMANDE_LISTE] PRIMARY KEY CLUSTERED 
    (
    	[ADL_Id] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
     
    GO
    ALTER TABLE [dbo].[ANNUAIRE_DEMANDE_LISTE]  WITH CHECK ADD  CONSTRAINT [FK_ANNUAIRE_DEMANDE_LISTE_ANNUAIRE_DEMANDE] FOREIGN KEY([ADL_IdAnnuaireDemande])
    REFERENCES [dbo].[ANNUAIRE_DEMANDE] ([ADE_Id])
    GO
    ALTER TABLE [dbo].[ANNUAIRE_DEMANDE_LISTE] CHECK CONSTRAINT [FK_ANNUAIRE_DEMANDE_LISTE_ANNUAIRE_DEMANDE]

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    le fait que ton code passe sans la contrainte de clé étrangère n'induit pas qu'il est correct...
    bien au contraire, si je peux me permettre cette remarque... c'est justemement parce qu'il est incorrect que tu dois flechir cette contrainte... Là c'est plus juste. Où alors tu as très mal défini ta clé...

    Quoi quil en soit je n'ai pas regardé, mais je tenais juste à préciser ceci.

  9. #9
    Membre Expert
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Par défaut
    As-tu vérifié que la donnée que tu enregistres dans ton champ clé étrangère est bien présnete dans la table référencée par ce champ?

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/01/2010, 23h06
  2. Réponses: 4
    Dernier message: 21/10/2008, 20h29
  3. Réponses: 2
    Dernier message: 25/09/2008, 10h15
  4. [SQL] Insertion multiple dans base de donnée
    Par leroidje dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 03/08/2007, 13h24
  5. [SQL] problème d'insertion dans ma base ou problème de requête sql
    Par maroco31 informatik dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 06/06/2007, 08h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo