如何获得最后插入的ID?

我有这个代码:

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

当我插入到这个表中时,我有一个名为GamesProfileId的auto_increment int主键列,我怎样才能得到最后一个插入一个之后,所以我可以使用该ID插入到另一个表?

对于SQL Server 2005+,如果没有插入触发器,则更改插入语句(全部一行,为了清晰起见在此分开)

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

对于SQL Server 2000,或者是否存在插入触发器:

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

接着

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

你可以用CommandText创build一个等于的命令

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

并执行int id = (int)command.ExecuteScalar

这个MSDN文章会给你一些额外的技巧。

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

这个工作:)

我有同样的需要,并find了这个答案..

这会在公司表(comp)中创build一个logging,它抓取在公司表上创build的自动ID并将其放到员工表(员工)中,这样就可以将两个表连接起来,将许多员工连接到一个公司。 它适用于我的SQL 2008数据库,应该在SQL 2005及更高版本上工作。

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

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

– “ @recID”用于保存我们即将抓取的公司自动生成的ID号码

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

– 上面的行用于创build一个临时表来保存自动生成的ID号码供以后使用。 它只有一个字段“tempID”,其typesINT“@recID”相同。

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

– “ 输出插入。 '上面的行用于抓取正在创build的logging中的任何字段的数据。 我们需要的这个数据是ID自动编号。 所以确保它说你的表正确的字段名称,我的是'comp_id' 。 然后放入我们之前创build的临时表中。

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

– 上面的行用于search我们之前创build的临时表,我们需要保存的ID。 由于在这个临时表中只有一条logging,只有一个字段,所以只会select你需要的ID号码并放到' @recID '中。 ' @recID '现在有你想要的ID号码,你可以像下面这样使用它。

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

– 所以你去了。 你可以在'OUTPUT inserted.WhatEverFieldNameYouWant'这一行中实际获取你想要的内容,并在你的临时表中创build你想要的字段并使用它来使用你想要的。

我一直在寻找这样的东西,这个详细的分解,我希望这有助于。

在纯SQL中,主要的语句kools是这样的:

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

方括号定义了表格simbs,然后是En和ID列,圆括号定义了要启动的列的枚举,然后定义列的值,在我的情况下是一列和一个值。 撇号包围一个string

我会向你解释我的做法:

这可能不是很容易理解,但我希望有用的使用最后插入的ID的大图。 当然,还有其他更简单的方法。 但我有理由保持我的。 不包括相关的function,只是他们的名字和参数名称。

我使用这种方法进行医学人工智能方法检查是否需要的string存在于中心表(1)中。 如果想要的string不在中心表“simbs”中,或者如果允许重复,则想要的string被添加到中心表“simbs”(2)。 最后一个被查询的id用于创build关联的表(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 } 

我尝试了以上,但他们没有工作,我发现这个想法,这对我来说工作得很好。

 var ContactID = db.GetLastInsertId(); 

它更less的代码,我很容易投入。

希望这有助于某人。

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

您还可以在SQL Server中使用对SCOPE_IDENTITY的调用。

在查询中使用SELECT SCOPE_IDENTITY()

在这之后:

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

执行此操作

 int id = (int)command.ExecuteScalar; 

它会工作

有各种各样的方法来获取最后插入的ID,但我发现最简单的方法是简单地从DataSet中的TableAdapter中检索它,如下所示:

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

希望这可以帮助 …

插入任何行后,您可以通过查询的下面一行获得最后插入的id。

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

 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