web-dev-qa-db-fra.com

Comment obtenir le dernier identifiant inséré?

J'ai ce code:

string insertSql = 
    "INSERT INTO aspnet_GameProfiles(UserId,GameId) VALUES(@UserId, @GameId)";

using (SqlConnection myConnection = new SqlConnection(myConnectionString))
{
   myConnection.Open();

   SqlCommand myCommand = new SqlCommand(insertSql, myConnection);

   myCommand.Parameters.AddWithValue("@UserId", newUserId);
   myCommand.Parameters.AddWithValue("@GameId", newGameId);

   myCommand.ExecuteNonQuery();

   myConnection.Close();
}

Lorsque j'insère dans cette table, j'ai une colonne de clé primaire auto_increment int appelée GamesProfileId, comment puis-je obtenir la dernière insérée après celle-ci pour pouvoir utiliser cet identifiant pour l'insérer dans une autre table?

160
anthonypliu

Pour SQL Server 2005+, s’il n’existe pas de déclencheur d’insertion, remplacez l’instruction d’insertion (toutes les lignes, scindée ici pour la clarté) en 

INSERT INTO aspnet_GameProfiles(UserId,GameId)
OUTPUT INSERTED.ID
VALUES(@UserId, @GameId)

Pour SQL Server 2000 ou s'il existe un déclencheur d'insertion:

INSERT INTO aspnet_GameProfiles(UserId,GameId) 
VALUES(@UserId, @GameId);
SELECT SCOPE_IDENTITY()

Et alors

 Int32 newId = (Int32) myCommand.ExecuteScalar();
240
gbn

Vous pouvez créer une commande avec CommandText égal à

INSERT INTO aspnet_GameProfiles(UserId, GameId) OUTPUT INSERTED.ID VALUES(@UserId, @GameId)

et exécutez int id = (int)command.ExecuteScalar.

Cet article MSDN vous donnera quelques techniques supplémentaires.

37
jason
string insertSql = 
    "INSERT INTO aspnet_GameProfiles(UserId,GameId) VALUES(@UserId, @GameId)SELECT SCOPE_IDENTITY()";

int primaryKey;

using (SqlConnection myConnection = new SqlConnection(myConnectionString))
{
   myConnection.Open();

   SqlCommand myCommand = new SqlCommand(insertSql, myConnection);

   myCommand.Parameters.AddWithValue("@UserId", newUserId);
   myCommand.Parameters.AddWithValue("@GameId", newGameId);

   primaryKey = Convert.ToInt32(myCommand.ExecuteScalar());

   myConnection.Close();
}

Ce vil travail :)

5
Jeba Ra

En SQL pur, l'instruction principale kool ressemble à ceci:

INSERT INTO [simbs] ([En]) OUTPUT INSERTED.[ID] VALUES ('en')

Les crochets définissent le tableau, puis les colonnes En et ID, les crochets définissent l'énumération des colonnes à initialiser, puis les valeurs des colonnes, dans mon cas une colonne et une valeur. Les apostrophes entourent une ficelle

Je vais vous expliquer mon approche:

Ce n'est peut-être pas facile à comprendre, mais j'espère utile d'avoir une vue d'ensemble en utilisant le dernier identifiant inséré. Bien sûr, il existe d'autres approches plus faciles. Mais j'ai des raisons de garder les miennes. Les fonctions associées ne sont pas incluses, mais uniquement leurs noms et noms de paramètres.

J'utilise cette méthode pour l'intelligence artificielle médicale La méthode vérifie si la chaîne souhaitée existe dans la table centrale (1). Si la chaîne désirée ne se trouve pas dans la table centrale "simbs" ou si les doublons sont autorisés, la chaîne recherchée est ajoutée à la table centrale "simbs" (2). Le dernier identifiant inséré sert à créer la table associée (3). 

    public List<int[]> CreateSymbolByName(string SymbolName, bool AcceptDuplicates)
    {
        if (! AcceptDuplicates)  // check if "AcceptDuplicates" flag is set
        {
            List<int[]> ExistentSymbols = GetSymbolsByName(SymbolName, 0, 10); // create a list of int arrays with existent records
            if (ExistentSymbols.Count > 0) return ExistentSymbols; //(1) return existent records because creation of duplicates is not allowed
        }
        List<int[]> ResultedSymbols = new List<int[]>();  // prepare a empty list
        int[] symbolPosition = { 0, 0, 0, 0 }; // prepare a neutral position for the new symbol
        try // If SQL will fail, the code will continue with catch statement
        {
            //DEFAULT und NULL sind nicht als explizite Identitätswerte zulässig
            string commandString = "INSERT INTO [simbs] ([En]) OUTPUT INSERTED.ID VALUES ('" + SymbolName + "') "; // Insert in table "simbs" on column "En" the value stored by variable "SymbolName"
            SqlCommand mySqlCommand = new SqlCommand(commandString, SqlServerConnection); // initialize the query environment
                SqlDataReader myReader = mySqlCommand.ExecuteReader(); // last inserted ID is recieved as any resultset on the first column of the first row
                int LastInsertedId = 0; // this value will be changed if insertion suceede
                while (myReader.Read()) // read from resultset
                {
                    if (myReader.GetInt32(0) > -1) 
                    {
                        int[] symbolID = new int[] { 0, 0, 0, 0 };
                        LastInsertedId = myReader.GetInt32(0); // (2) GET LAST INSERTED ID
                        symbolID[0] = LastInsertedId ; // Use of last inserted id
                        if (symbolID[0] != 0 || symbolID[1] != 0) // if last inserted id succeded
                        {
                            ResultedSymbols.Add(symbolID);
                        }
                    }
                }
                myReader.Close();
            if (SqlTrace) SQLView.Log(mySqlCommand.CommandText); // Log the text of the command
            if (LastInsertedId > 0) // if insertion of the new row in the table was successful
            {
                string commandString2 = "UPDATE [simbs] SET [IR] = [ID] WHERE [ID] = " + LastInsertedId + " ;"; // update the table by giving to another row the value of the last inserted id
                SqlCommand mySqlCommand2 = new SqlCommand(commandString2, SqlServerConnection); 
                mySqlCommand2.ExecuteNonQuery();
                symbolPosition[0] = LastInsertedId; // mark the position of the new inserted symbol
                ResultedSymbols.Add(symbolPosition); // add the new record to the results collection
            }
        }
        catch (SqlException retrieveSymbolIndexException) // this is executed only if there were errors in the try block
        {
            Console.WriteLine("Error: {0}", retrieveSymbolIndexException.ToString()); // user is informed about the error
        }

        CreateSymbolTable(LastInsertedId); //(3) // Create new table based on the last inserted id
        if (MyResultsTrace) SQLView.LogResult(LastInsertedId); // log the action
        return ResultedSymbols; // return the list containing this new record
    }
3
profimedica

J'ai eu le même besoin et trouvé cette réponse ..

Cela crée un enregistrement dans la table de l'entreprise (comp), il saisit l'ID automatique créé dans la table de l'entreprise et le dépose dans une table d'effectifs (personnel) afin que les 2 tables puissent être liées, BEAUCOUP d'employés à UNE entreprise. Cela fonctionne sur ma base de données SQL 2008, devrait fonctionner sur SQL 2005 et supérieur.

===========================

CREATE PROCEDURE [dbo].[InsertNewCompanyAndStaffDetails]

 @comp_name varchar(55) = 'Big Company',

 @comp_regno nchar(8) = '12345678',

 @comp_email nvarchar(50) = '[email protected]',

 @recID INT OUTPUT

- "@recID" est utilisé pour contenir le numéro d'identification généré automatiquement par la société que nous sommes sur le point de saisir

AS
 Begin

  SET NOCOUNT ON

  DECLARE @tableVar TABLE (tempID INT)

- La ligne ci-dessus est utilisée pour créer une table temporaire contenant le numéro d'identification généré automatiquement pour une utilisation ultérieure. Il n'a qu'un seul champ 'tempID' et son type INT est identique à '@recID'.

  INSERT INTO comp(comp_name, comp_regno, comp_email) 

  OUTPUT inserted.comp_id INTO @tableVar

- Le 'OUTPUT inséré. La ligne ci-dessus est utilisée pour extraire des données de n’importe quel champ de l’enregistrement qu’il est en train de créer. Cette donnée que nous voulons est le numéro automatique ID. Assurez-vous donc qu’il indique le nom de champ correct pour votre table, le mien est 'comp_id'. Ceci est ensuite déposé dans la table temporaire que nous avons créée précédemment.

  VALUES (@comp_name, @comp_regno, @comp_email)

  SET @recID = (SELECT tempID FROM @tableVar)

- La ligne ci-dessus est utilisée pour rechercher dans la table temporaire créée précédemment où l'ID dont nous avons besoin est enregistré. Puisqu'il n'y a qu'un seul enregistrement dans cette table temporaire et un seul champ, il ne sélectionnera que le numéro d'identification dont vous avez besoin et le déposera dans '@recID'. '@recID' a maintenant le numéro d'identification que vous voulez et vous pouvez l'utiliser comme vous voulez, comme je l'ai utilisé ci-dessous.

  INSERT INTO staff(Staff_comp_id) 
  VALUES (@recID)

 End

- Alors voilà. Vous pouvez réellement récupérer ce que vous voulez dans la ligne 'OUTPUT insérée.WhatEverFieldNameYouWant' et créer les champs que vous voulez dans votre table temporaire et y accéder pour utiliser ce que vous voulez.

Je cherchais quelque chose comme ça depuis des lustres, avec cette ventilation détaillée, j'espère que cela aide. 

3
Sim2K

J'ai essayé ce qui précède mais ils n'ont pas fonctionné, j'ai trouvé cette idée, cela fonctionne très bien pour moi. 

var ContactID = db.GetLastInsertId();

Son moins de code et je facile à mettre en po 

J'espère que ça aide quelqu'un. 

2
Matthew Mccall

Il y a toutes sortes de façons d'obtenir le dernier ID inséré, mais le moyen le plus simple que j'ai trouvé est simplement de le récupérer à partir de TableAdapter dans le DataSet, comme suit:

<Your DataTable Class> tblData = new <Your DataTable Class>();
<Your Table Adapter Class> tblAdpt = new <Your Table Adapter Class>();

/*** Initialize and update Table Data Here ***/

/*** Make sure to call the EndEdit() method ***/
/*** of any Binding Sources before update ***/
<YourBindingSource>.EndEdit();

//Update the Dataset
tblAdpt.Update(tblData);

//Get the New ID from the Table Adapter
long newID = tblAdpt.Adapter.InsertCommand.LastInsertedId;

J'espère que cela t'aides ...

1
Andy Braham
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace DBDemo2
{
    public partial class Form1 : Form
    {
        string connectionString = "Database=company;Uid=sa;Pwd=mypassword";
        System.Data.SqlClient.SqlConnection connection;
        System.Data.SqlClient.SqlCommand command;

        SqlParameter idparam = new SqlParameter("@eid", SqlDbType.Int, 0);
        SqlParameter nameparam = new SqlParameter("@name", SqlDbType.NChar, 20);
        SqlParameter addrparam = new SqlParameter("@addr", SqlDbType.NChar, 10);

        public Form1()
        {
            InitializeComponent();

            connection = new System.Data.SqlClient.SqlConnection(connectionString);
            connection.Open();
            command = new System.Data.SqlClient.SqlCommand(null, connection);
            command.CommandText = "insert into employee(ename, city) values(@name, @addr);select SCOPE_IDENTITY();";

            command.Parameters.Add(nameparam);
            command.Parameters.Add(addrparam);
            command.Prepare();

        }

        private void Form1_Load(object sender, EventArgs e)
        {
        }

        private void buttonSave_Click(object sender, EventArgs e)
        {


            try
            {
                int id = Int32.Parse(textBoxID.Text);
                String name = textBoxName.Text;
                String address = textBoxAddress.Text;

                command.Parameters[0].Value = name;
                command.Parameters[1].Value = address;

                SqlDataReader reader = command.ExecuteReader();
                if (reader.HasRows)
                {
                    reader.Read();
                    int nid = Convert.ToInt32(reader[0]);
                    MessageBox.Show("ID : " + nid);
                }
                /*int af = command.ExecuteNonQuery();
                MessageBox.Show(command.Parameters["ID"].Value.ToString());
                */
            }
            catch (NullReferenceException ne)
            {
                MessageBox.Show("Error is : " + ne.StackTrace);
            }
            catch (Exception ee)
            {
                MessageBox.Show("Error is : " + ee.StackTrace);
            }
        }

        private void buttonSave_Leave(object sender, EventArgs e)
        {

        }

        private void Form1_Leave(object sender, EventArgs e)
        {
            connection.Close();
        }
    }
}
1
pgp

Après ça:

INSERT INTO aspnet_GameProfiles(UserId, GameId) OUTPUT INSERTED.ID VALUES(@UserId, @GameId)

Exécuter ceci

int id = (int)command.ExecuteScalar;

Ça va marcher

0
M.Alaghemand

Vous pouvez également utiliser un appel à SCOPE_IDENTITY dans SQL Server.

0
Tim

si votre identifiant est de type int et réglé pour une incrémentation automatique, essayez celui-ci.

SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE)
0
Usman Ali

Après avoir inséré une ligne, vous pouvez obtenir le dernier identifiant inséré en dessous de la ligne de requête.

INSERT INTO aspnet_GameProfiles (UserId, GameId) VALEURS (@UserId, @GameId); SELECT @@ IDENTITY

0

INSERT INTO aspnet_GameProfiles (UserId, GameId) VALEURS (@UserId, @GameId) "; Vous pouvez simplement accéder au dernier ID en commandant la table par ordre décroissant. 

SELECT TOP 1 UserId FROM aspnet_GameProfiles ORDER BY UserId DESC. 

0
Aleks