none
[SQL]Insertion multiple en base RRS feed

  • Discussion générale

  • 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

    Extrait de code

    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 :
    Extrait de code

      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.
    lundi 7 janvier 2008 08:42

Toutes les réponses

  • Bonjour,

    Le code à l'air correct et devrait fonctionner. Avez-vous vérifier l'id retourné par la première requête ? Est-il correct ?

    Sinon, quel message d'erreur avez vous précisement ?

     

    Guillaume

    lundi 7 janvier 2008 09:49
  • 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 :x
    apparement l'erreur serait plutot dans la définition de la table

    je continue de chercher
    lundi 7 janvier 2008 09:58
  • En enlevant la définition de ma clé étrangère ça marche!

    je comprend pas pourquoi ça ne marche pas avec :x
    lundi 7 janvier 2008 10:20
  • Pouvez vous me fournir le script de création de ces 2 tables ? Je regarderai ce soir si vous n'avez pas trouvez la solution d'ici là. (Je n'ai pas de SQL server sour la main pour faire des tests)

     

    Guillaume

    lundi 7 janvier 2008 10:53
  • le voici :
    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]
     

    lundi 7 janvier 2008 10:55
  • Et bien je ne sais pas ce que j'ai fait de spécial, mais ça marche Big Smile

    j'ai juste supprimé et recréé ma clé étrangère :X

    peut etre que je l'avais mal recrée au départ XD

    mistère :x
    mardi 8 janvier 2008 09:50