Come ottenere l’ultimo ID inserito?

Ho questo codice:

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

Quando inserisco in questa tabella, ho una colonna chiave primaria int auto_increment int denominata GamesProfileId , come posso ottenere l’ultima inserita dopo di ciò in modo da poter utilizzare quell’ID da inserire in un’altra tabella?

Per SQL Server 2005+, se non è presente alcun trigger di inserimento, modificare l’istruzione di inserimento (tutta una riga, divisa per chiarezza qui) in questo

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

Per SQL Server 2000 o se è presente un trigger di inserimento:

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

E poi

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

È ansible creare un comando con CommandText uguale a

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

ed esegui int id = (int)command.ExecuteScalar .

Questo articolo MSDN ti fornirà alcune tecniche aggiuntive.

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

Questo lavoro funziona 🙂

Ho avuto lo stesso bisogno e ho trovato questa risposta ..

Questo crea un record nella tabella della società (comp), prende l’ID automatico creato sulla tabella dell’azienda e lo fa cadere in una tabella Staff (personale) in modo che le 2 tabelle possano essere collegate, MOLTO personale a UNA azienda. Funziona sul mio DB SQL 2008, dovrebbe funzionare su SQL 2005 e versioni successive.

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

 CREATE PROCEDURE [dbo].[InsertNewCompanyAndStaffDetails] @comp_name varchar(55) = 'Big Company', @comp_regno nchar(8) = '12345678', @comp_email nvarchar(50) = '[email protected]', @recID INT OUTPUT 

– Il ‘ @recID’ viene utilizzato per contenere il numero ID generato automaticamente dalla società che stiamo per prendere

 AS Begin SET NOCOUNT ON DECLARE @tableVar TABLE (tempID INT) 

– La riga precedente viene utilizzata per creare una tabella temporanea per contenere il numero ID generato automaticamente per un uso successivo. Ha solo un campo ‘tempID’ e il suo tipo INT è lo stesso di ‘@recID’ .

  INSERT INTO comp(comp_name, comp_regno, comp_email) OUTPUT inserted.comp_id INTO @tableVar 

– L’ OUTPUT inserito. La riga precedente viene utilizzata per estrarre i dati da qualsiasi campo nel record che sta creando in questo momento. Questo dato che vogliamo è l’autonumber ID. Quindi assicurati di aver indicato il nome del campo corretto per il tuo tavolo, il mio è ‘comp_id’ . Questo viene quindi lasciato cadere nella tabella temporanea creata in precedenza.

  VALUES (@comp_name, @comp_regno, @comp_email) SET @recID = (SELECT tempID FROM @tableVar) 

– La riga sopra è usata per cercare la tabella temporanea che abbiamo creato in precedenza, dove l’ID di cui abbiamo bisogno è stato salvato. Poiché esiste un solo record in questa tabella temporanea e solo un campo, selezionerà solo il numero ID necessario e lo inserirà in ” @recID “. ‘ @recID ‘ ora ha il numero identificativo che vuoi e puoi usarlo come vuoi che io abbia usato in seguito.

  INSERT INTO staff(Staff_comp_id) VALUES (@recID) End 

– Quindi eccoti. Puoi effettivamente afferrare ciò che vuoi nella riga ‘OUTPUT inserted.WhatEverFieldNameYouWant’ e creare i campi che vuoi nella tabella temporanea e accedervi per utilizzare come vuoi.

Stavo cercando qualcosa di simile per anni, con questa suddivisione dettagliata, spero che questo aiuti.

In puro SQL l’istruzione principale kools piace:

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

Le parentesi quadre definiscono i simboli di tabella e quindi le colonne En e ID, parentesi tonde definisce l’enumerazione di colonne da avviare e quindi i valori per le colonne, nel mio caso una colonna e un valore. Gli apostrofi racchiudono una stringa

Ti spiegherò il mio approccio:

Potrebbe non essere facile da capire ma spero utile per ottenere il quadro generale utilizzando l’ultimo ID inserito. Ovviamente ci sono approcci alternativi più semplici. Ma ho dei motivi per mantenere il mio. Le funzioni associate non sono incluse, solo i loro nomi e nomi dei parametri.

Io uso questo metodo per l’intelligenza artificiale medica. Il metodo controlla se la stringa desiderata esiste nella tabella centrale (1). Se la stringa desiderata non si trova nella tabella centrale “simboli”, o se sono consentiti duplicati, la stringa desiderata viene aggiunta alla tabella centrale “simbs” (2). L’ultimo ID inseerito viene utilizzato per creare la tabella associata (3).

  public List CreateSymbolByName(string SymbolName, bool AcceptDuplicates) { if (! AcceptDuplicates) // check if "AcceptDuplicates" flag is set { List 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 ResultedSymbols = new List(); // 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 informsd 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 } 

Ho provato quanto sopra ma non hanno funzionato, ho trovato questo pensiero, che funziona bene per me.

 var ContactID = db.GetLastInsertId(); 

È meno codice e io facile da inserire.

Spero che questo aiuti qualcuno.

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

Esistono molti modi per ottenere l’ultimo ID inserito, ma il modo più semplice che ho trovato è semplicemente recuperarlo dal TableAdapter nel DataSet in questo modo:

  tblData = new ();  tblAdpt = new (); /*** Initialize and update Table Data Here ***/ /*** Make sure to call the EndEdit() method ***/ /*** of any Binding Sources before update ***/ .EndEdit(); //Update the Dataset tblAdpt.Update(tblData); //Get the New ID from the Table Adapter long newID = tblAdpt.Adapter.InsertCommand.LastInsertedId; 

Spero che questo ti aiuti …

È inoltre ansible utilizzare una chiamata a SCOPE_IDENTITY in SQL Server.

Dopodichè:

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

Esegui questo

 int id = (int)command.ExecuteScalar; 

Funzionerà

Dopo aver inserito una riga puoi ottenere l’ultimo ID inserito dalla riga di query sottostante.

INSERISCI IN VALORI aspnet_GameProfiles (UserId, GameId) (@UserId, @GameId); SELEZIONA @@ IDENTITY

se il tuo ID int digita e impostato su incremento automatico, prova questo

 SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE) 

Usa SELECT SCOPE_IDENTITY () nella query

 set ANSI_NULLS ON set QUOTED_IDENTIFIER ON GO CREATE PROC [dbo].[spCountNewLastIDAnyTableRows] ( @PassedTableName as NVarchar(255), @PassedColumnName as NVarchar(225) ) AS BEGIN DECLARE @ActualTableName AS NVarchar(255) DECLARE @ActualColumnName as NVarchar(225) SELECT @ActualTableName = QUOTENAME( TABLE_NAME ) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @PassedTableName SELECT @ActualColumnName = QUOTENAME( COLUMN_NAME ) FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = @PassedColumnName DECLARE @sql AS NVARCHAR(MAX) SELECT @sql = 'select MAX('+ @ActualColumnName + ') + 1 as LASTID' + ' FROM ' + @ActualTableName EXEC(@SQL) END