it-swarm.com.de

Wie bekomme ich die letzte eingefügte ID?

Ich habe diesen 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();
}

Wenn ich in diese Tabelle einfüge, habe ich eine auto_increment int-Primärschlüsselspalte mit dem Namen GamesProfileId. Wie bekomme ich die letzte eingefügte Spalte, damit ich diese ID verwenden kann, um sie in eine andere Tabelle einzufügen?

160
anthonypliu

Wenn für SQL Server 2005+ kein Einfüge-Auslöser vorhanden ist, ändern Sie die Einfügeanweisung (alle einzeilig, hier aus Gründen der Klarheit aufgeteilt) darauf 

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

Für SQL Server 2000 oder wenn ein Einfügungsauslöser vorhanden ist:

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

Und dann

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

Sie können einen Befehl mit CommandText erstellen

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

und führen Sie int id = (int)command.ExecuteScalar aus.

Dieser MSDN-Artikel enthält einige zusätzliche Techniken.

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();
}

Diese vil Arbeit :)

5
Jeba Ra

Im reinen SQL-Modus sieht die Hauptanweisung wie folgt aus:

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

Die eckigen Klammern definieren die Tabellenkürzel und dann die Spalten En und ID, die runden Klammern definieren die Aufzählung der zu initiierenden Spalten und dann die Werte für die Spalten, in meinem Fall eine Spalte und einen Wert. Die Apostrophe schließen eine Zeichenfolge ein

Ich erkläre Ihnen meine Vorgehensweise:

Es ist vielleicht nicht leicht zu verstehen, aber ich hoffe, es ist nützlich, mit der zuletzt eingefügten ID ein gutes Bild zu erhalten. Natürlich gibt es alternative leichtere Ansätze. Aber ich habe Gründe, meine zu behalten. Zugehörige Funktionen sind nicht enthalten, nur deren Namen und Parameternamen.

Ich verwende diese Methode für medizinische künstliche Intelligenz. Die Methode prüft, ob die gewünschte Zeichenfolge in der zentralen Tabelle vorhanden ist (1). Wenn sich der gewünschte String nicht in der zentralen Tabelle "simbs" befindet oder wenn Duplikate zulässig sind, wird der gewünschte String der zentralen Tabelle "simbs" (2) hinzugefügt. Die letzte inseertierte ID wird zum Erstellen der zugehörigen Tabelle (3) verwendet. 

    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

Ich hatte das gleiche Bedürfnis und fand diese Antwort ..

Dadurch wird ein Datensatz in der Firmentabelle (comp) erstellt, der die in der Firmentabelle erstellte Auto-ID abruft und diese in eine Staff-Tabelle (Staff) ablegt, sodass die beiden Tabellen (MANY staff) zu EINEM Unternehmen verknüpft werden können. Es funktioniert auf meiner SQL 2008-Datenbank, sollte auf SQL 2005 und höher funktionieren.

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

CREATE PROCEDURE [dbo].[InsertNewCompanyAndStaffDetails]

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

 @comp_regno nchar(8) = '12345678',

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

 @recID INT OUTPUT

- Die ' @recID' wird verwendet, um die vom Unternehmen automatisch generierte ID-Nummer zu speichern, die wir gerade abholen möchten

AS
 Begin

  SET NOCOUNT ON

  DECLARE @tableVar TABLE (tempID INT)

- In der obigen Zeile wird eine temporäre Tabelle erstellt, in der die automatisch generierte ID-Nummer zur späteren Verwendung gespeichert wird. Es hat nur ein Feld 'tempID' und sein TypINTentspricht dem '@recID' .

  INSERT INTO comp(comp_name, comp_regno, comp_email) 

  OUTPUT inserted.comp_id INTO @tableVar

- Der ' OUTPUT eingefügt. 'Zeile oben wird verwendet, um Daten aus einem Feld in dem Datensatz abzurufen, den er gerade erstellt. Diese Daten, die wir benötigen, sind die ID-Autonummer. Stellen Sie also sicher, dass der richtige Feldname für Ihre Tabelle angegeben ist. Mein Name ist 'comp_id' . Dies wird dann in die temporäre Tabelle, die wir zuvor erstellt haben, abgelegt.

  VALUES (@comp_name, @comp_regno, @comp_email)

  SET @recID = (SELECT tempID FROM @tableVar)

- Die Zeile oben wird verwendet, um die temporäre Tabelle zu durchsuchen, in der die von uns benötigte ID gespeichert ist. Da sich in dieser temporären Tabelle nur ein Datensatz und nur ein Feld befindet, wird nur die ID-Nummer ausgewählt, die Sie benötigen, und in ' @recID ' abgelegt. ' @recID ' hat jetzt die ID-Nummer, die Sie möchten, und Sie können sie so verwenden, wie Sie möchten, wie ich sie unten verwendet habe.

  INSERT INTO staff(Staff_comp_id) 
  VALUES (@recID)

 End

-- Hier bitteschön. Sie können sich in der 'OUTPUT insert.WhatEverFieldNameYouWant' - Zeile alles was Sie möchten abrufen und die gewünschten Felder in Ihrer temporären Tabelle erstellen und darauf zugreifen, um sie wie gewünscht zu verwenden.

Ich habe schon lange nach so etwas gesucht, mit dieser detaillierten Aufschlüsselung hoffe ich, dass dies hilft. 

3
Sim2K

Ich habe es ausprobiert, aber es hat nicht funktioniert. Ich fand diesen Gedanken, der für mich gut funktioniert. 

var ContactID = db.GetLastInsertId();

Es ist weniger Code und ich bin einfach einzubauen. 

Hoffe das hilft jemandem. 

2
Matthew Mccall

Es gibt viele Möglichkeiten, die letzte eingefügte ID zu erhalten. Die einfachste Möglichkeit, die ich gefunden habe, ist, sie einfach aus dem TableAdapter im DataSet abzurufen:

<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;

Hoffe das hilft ...

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

Danach:

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

Führen Sie das aus

int id = (int)command.ExecuteScalar;

Es wird klappen

0
M.Alaghemand

Sie können auch einen Aufruf von SCOPE_IDENTITY in SQL Server verwenden.

0
Tim

wenn Ihre ID vom Typ int ist und auf auto inkrement gesetzt ist, versuchen Sie es mit diesem

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

Nach dem Einfügen einer beliebigen Zeile können Sie die letzte eingefügte ID in der unteren Abfragezeile erhalten.

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

0

INSERT INTO aspnet_GameProfiles (UserId, GameId) VALUES (@UserId, @GameId) "; Dann können Sie einfach auf die letzte ID zugreifen, indem Sie die Tabelle absteigend sortieren. 

SELECT TOP 1 UserId FROM aspnet_GameProfiles ORDER BY UserId DESC. 

0
Aleks