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

ASP.NET Discussion :

problème SQL et id_auto


Sujet :

ASP.NET

  1. #1
    Membre éprouvé
    Inscrit en
    Septembre 2007
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 137
    Par défaut problème SQL et id_auto
    Bonjour, j'ai un petit souci.
    J'ai une requete qui va insérer des données dans une table A qui comprend un id_auto.
    Suivant un paramètre de ma page, si le paramètre est activé, il faut insérer des données dans une Table B, notamment l'id_auto de la Table A.
    C'est là que j'ai un problème, comment je récupère cette idée (faire une requete), mais surtout comment être sur de récupérer le bon id de la tableA.

    Si vous avez des idées, je suis preneur?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 54
    Par défaut
    Bonjour, peux tu nous donner la structure de tes deux tables?

    j'ai oublié ma boule de cristal chez ma grand-tante irma

    Et il faut qu'on connaisse leur structure pour pouvoir t'aider

  3. #3
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    string sql = "INSERT INTO MATABLE(..., ...) VALUES (...,...) SELECT @@IDENTITY

    Tu récupères la valeur de l'id avec un ExecuteScalar

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 54
    Par défaut
    Citation Envoyé par lutecefalco Voir le message
    string sql = "INSERT INTO MATABLE(..., ...) VALUES (...,...) SELECT @@IDENTITY

    Tu récupères la valeur de l'id avec un ExecuteScalar
    Tortuegénie ne sera pas seul a te dire merci lutecefalco, j'avais oublié cette méthode, j'ai honte

  5. #5
    Membre éprouvé
    Inscrit en
    Septembre 2007
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 137
    Par défaut
    Est ce que l'on peut le mettre dans 2 requetes distinctes??
    Et aussi est ce que le select @@Identity fonctionne sous Oracle??

    Je vais essayer, faut il faire une transaction??

  6. #6
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    Je dirais:
    non
    ché pas
    non


  7. #7
    Expert confirmé

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Par défaut
    Citation Envoyé par tortuegenie Voir le message
    Et aussi est ce que le select @@Identity fonctionne sous Oracle??
    Niet, utilise une sequence

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

  8. #8
    Membre éprouvé
    Inscrit en
    Septembre 2007
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 137
    Par défaut
    Ca m'arrange pas, il faudrait que cela puisse fonctionner sous Oracle et SQLServer, y'a t'il un autre moyen de faire??

  9. #9
    Membre éprouvé
    Inscrit en
    Septembre 2007
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 137
    Par défaut
    voilà la structure de mes 2 tables.
    Table A:
    A_id id auto(int)
    Lib_A varchar
    Multisite bool

    et la Table B:
    b_id id_auto
    siteid varchar
    A_id int

    Voilà, j'insére dans la Table A et je dois également insérer dans la table B en connaissant la valeur de l'id de A.

  10. #10
    Expert confirmé

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Par défaut
    Citation Envoyé par tortuegenie Voir le message
    Ca m'arrange pas, il faudrait que cela puisse fonctionner sous Oracle et SQLServer, y'a t'il un autre moyen de faire??
    Tu peux faire des procedures stockees...

    En gardant la meme signature pour les procedures oracle et sql server, ca devrait passer

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

  11. #11
    Membre éprouvé
    Inscrit en
    Septembre 2007
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 137
    Par défaut
    Le problème c'est que l'on me demande de ne pas utiliser les procédures stockées.

    Une autre idée??

  12. #12
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    Bah t'as la solution crado:

    INSERT INTO TABLEA(Lib_A, Multisite) VALUES (Lib_A_value, Multisite_value)
    SELECT MAX(A_id) FROM TABLEA WHERE Lib_A = Lib_A_value AND Multisite = Multisite_value

  13. #13
    Expert confirmé

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Par défaut
    Mouais...

    avec un lock autour pour etre sur que personne ne vienne mettre a jour la table entre temps

    Par contre, j'espere qu'on te laisse utiliser les triggers, sinon, pour Oracle, c'et mort pour l'auto-incrementation...

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

  14. #14
    Membre éprouvé
    Inscrit en
    Septembre 2007
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 137
    Par défaut
    Si j'ai le droit aux triggers, j'en ai déjà quelqu'uns.
    Par contre le lock me parait méchant ou cas où l'appli plante.
    C'est pour cela que je parlais des transitions, elles ne permettent pas d'insérer quand tout est ok et de bloquer la table non???

    Oui Lutecefalco j'y ai aussi pensé, c'est pas ce qu'il y a de mieux mais bon je ne sais pas si y'a beaucoup d'autre solution

  15. #15
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    Citation Envoyé par pvialatte Voir le message
    Mouais...

    avec un lock autour pour etre sur que personne ne vienne mettre a jour la table entre temps
    Y a peu de chance qu'une autre personne insère une ligne avec le même Lib_A qd même

  16. #16
    Membre éprouvé
    Inscrit en
    Septembre 2007
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 137
    Par défaut
    Entièrement d'accord Lutecefalcon mais y'a qd meme 1 possiblité où cela peut arriver

  17. #17
    Membre éprouvé
    Inscrit en
    Septembre 2007
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 137
    Par défaut
    Lutecefalco, qd tu dis de faire ça
    string sql = "INSERT INTO MATABLE(..., ...) VALUES (...,...) SELECT @@IDENTITY

    Tu récupères la valeur de l'id avec un ExecuteScalar
    ou bien l'autre méthode avec le select max, tu le fais avec transaction ou pas??? parce que si j'ai 2 personnes qui font le insert, le @@identity ne sera pas forcement le bon.???

  18. #18
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    Normalement, le SGBD fait ça à l'intérieur d'une transaction tout seul comme un grand

  19. #19
    Membre éprouvé
    Inscrit en
    Septembre 2007
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 137
    Par défaut
    Ah bon, admettons.

    Je continue dans ma démarche, parce qu'une fois que j'ai récupérer mon id_auto, suivant un cas je dois effectuer d'autre insert dans ma seconde table et l'idéal serait que justement tout se fasse ou rien ne se fasse.
    En gros je pense qu'il s'agit de transaction imbriqué.

    Sais-tu comment faire cela en asp.net
    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
     
     DbCommand cmdInsert = myFac.CreateCommand("INSERT INTO [EQUIPE]" +
                           "(EquipeID,Lib_EQ,multisite) " +
                           "VALUES (@EquipeID,@lib_eq,@multisite)", myFac.GetConnection(), CommandType.Text);
     
                        DbParameter EquipeParam = myFac.CreateParameter("@EquipeID", DbType.String, ParameterDirection.Input, "4");
                        DbParameter LibParam = myFac.CreateParameter("@lib_eq", DbType.String, ParameterDirection.Input, txbEquipe.Text);
                        DbParameter MultisiteParam = myFac.CreateParameter("@multisite", DbType.Boolean, ParameterDirection.Input, MS1.GlobalChecked());
     
                        cmdInsert.Parameters.Add(EquipeParam);
                        cmdInsert.Parameters.Add(LibParam);
                        cmdInsert.Parameters.Add(MultisiteParam);
     
                        myFac.ExecuteNonQuery(cmdInsert);
     
                        SessionUtilsCommun.IdAuto = ProcedureMax.getMaxEquipeID(LibParam.Value.ToString());
                        //myFac.CommitTransaction(trans1);
     
     
                        if (MS1.GlobalChecked() == false)
                        {
                            myFac.GetConnection().Open();
                            DbTransaction trans1 = myFac.BeginTransaction(myFac.GetConnection());
                            try
                            {
                                for (int i = 0; i < sites.Count; i++)
                                {
                                    DbCommand cmdInsert2 = myFac.CreateCommand("INSERT INTO [EQUIPE_SITE]" +
                                        "([siteid],equipeid) " +
                                        "VALUES (@siteid,@equipeid)", myFac.GetConnection(), CommandType.Text, trans1);
     
                                    DbParameter siteParam = myFac.CreateParameter("@siteid", DbType.String, ParameterDirection.Input, sites[i].ToString());
                                    DbParameter equipeParam = myFac.CreateParameter("@equipeid", DbType.String, ParameterDirection.Input, SessionUtilsCommun.IdAuto);
     
                                    cmdInsert2.Parameters.Add(siteParam);
                                    cmdInsert2.Parameters.Add(equipeParam);
     
                                    cmdInsert2.ExecuteNonQuery();
                                }
                                myFac.CommitTransaction(trans1);
                            }
                            catch (Exception ex)
                            {
                                myFac.RollbackTransaction(trans1);
                                SessionUtilsCommun.MessageAlerte = Resources.Dictionnaire.EnregistrementEchoue + " : " + ex.Message;
                            }
                            finally
                            {
                                myFac.GetConnection().Close();
                            }
                        }
                        btnAjouter.Visible = false;
                        SessionUtilsCommun.MessageAlerte = txbEquipe.Text + " a bien été ajouté";
                        Response.Redirect(SessionUtilsSelection.UrlPrecedente);
    voilà le bout de code que j'ai pour l'instant.

    Si tu as une idée??

  20. #20
    Expert confirmé

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Par défaut
    Perso, je spliterais un peu tout ca

    genre :
    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
    public void CreateSiteAndEquipe(){
     
    	myFac.GetConnection().Open();
    	DbTransaction trans1 = myFac.BeginTransaction(myFac.GetConnection());
     
    	try{
    		int newEquipeId = CreateEquipe(txbEquipe.Text, trans1);
     
    		if (MS1.GlobalChecked() == false){
    			if (newEquipeId != -1){
    				foreach (string site in sites){
    					CreateEquipeForSite(site, newEquipeId, trans1);
    				}
    			}
    		}		
    		myFac.CommitTransaction(trans1);
    		SessionUtilsCommun.MessageAlerte = txbEquipe.Text + " a bien été ajouté";
    	}catch (Exception ex){
    		myFac.RollbackTransaction(trans1);
    		SessionUtilsCommun.MessageAlerte = Resources.Dictionnaire.EnregistrementEchoue + " : " + ex.Message;
    	}finally{
    		myFac.GetConnection().Close();
    	}
     
    }
     
    public int CreateEquipe(string equipeName, DbTransaction transaction){
     
    	DbCommand cmdInsert = myFac.CreateCommand("INSERT INTO [EQUIPE]" +
    					   "(EquipeID,Lib_EQ,multisite) " +
    					   "VALUES (@EquipeID,@lib_eq,@multisite)", myFac.GetConnection(), CommandType.Text, trans1);
     
    	DbParameter EquipeParam = myFac.CreateParameter("@EquipeID", DbType.String, ParameterDirection.Input, "4");
    	DbParameter LibParam = myFac.CreateParameter("@lib_eq", DbType.String, ParameterDirection.Input, equipeName);
    	DbParameter MultisiteParam = myFac.CreateParameter("@multisite", DbType.Boolean, ParameterDirection.Input, MS1.GlobalChecked());
     
    	cmdInsert.Parameters.Add(EquipeParam);
    	cmdInsert.Parameters.Add(LibParam);
    	cmdInsert.Parameters.Add(MultisiteParam);
     
    	myFac.ExecuteNonQuery(cmdInsert);
     
        return ProcedureMax.getMaxEquipeID(LibParam.Value.ToString());
    }
     
     
    public void CreateEquipeForSite(string site, int eEquipeId, DbTransaction transaction){
     
    	DbCommand cmdInsert2 = myFac.CreateCommand("INSERT INTO [EQUIPE_SITE]" +
    		"([siteid],equipeid) " +
    		"VALUES (@siteid,@equipeid)", myFac.GetConnection(), CommandType.Text, trans1);
     
    	DbParameter siteParam = myFac.CreateParameter("@siteid", DbType.String, ParameterDirection.Input, sites[i].ToString());
    	DbParameter equipeParam = myFac.CreateParameter("@equipeid", DbType.String, ParameterDirection.Input, SessionUtilsCommun.IdAuto);
     
    	cmdInsert2.Parameters.Add(siteParam);
    	cmdInsert2.Parameters.Add(equipeParam);
     
    	cmdInsert2.ExecuteNonQuery();
    }
    Apres, quelque chose de maaaal, c'est qu'a priori, c'est ta page web qui a la responsabilite des mises a jour de bases de donnees-> paaas bien

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

Discussions similaires

  1. problème SQL avec le tutoriel recherche multi critère
    Par qbihlmaier dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 05/12/2005, 19h33
  2. SQL : résoudre ce type de problème sql.
    Par LESOLEIL dans le forum Langage SQL
    Réponses: 4
    Dernier message: 07/10/2005, 13h48
  3. Problème SQL vb5
    Par mpat dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 03/08/2005, 16h49
  4. Problème SQL
    Par Florent0001 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 10/11/2004, 17h07
  5. Problèmes SQL
    Par stampe dans le forum Bases de données
    Réponses: 2
    Dernier message: 06/07/2004, 21h02

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