如何获得最后插入的 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 插入到另一个表中?

237927 次浏览

可以创建一个 SqlCommand,其 CommandText等于

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

执行 int id = (int)command.ExecuteScalar

这个 MSDN 文章将给你一些额外的技术。

对于 SQLServer2005 + ,如果没有插入触发器,那么将 insert 语句(为了清楚起见,将所有行分开)更改为

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

对于 SQLServer2000,或者如果有插入触发器:

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

然后

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

我有同样的需要,并找到了这个答案. 。

这将在公司表(comp)中创建一个记录,它将获取在公司表上创建的自动 ID,并将其放入 Staff 表(Staff)中,以便将两个表链接起来,将许多职员链接到一个公司。它适用于我的 SQL 2008DB,应该适用于 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’是用来保存我们即将获取的公司自动生成的身份证号码

AS
Begin


SET NOCOUNT ON


DECLARE @tableVar TABLE (tempID INT)

——上面的行用于创建一个临时表,以保存自动生成的 ID 号,供以后使用。它只有一个字段‘ temID’,其类型 内景“@recID”相同。

  INSERT INTO comp(comp_name, comp_regno, comp_email)


OUTPUT inserted.comp_id INTO @tableVar

--上面的“ 输出插入。”行用于从它正在创建的记录中的任何字段中获取数据。我们需要的数据是 ID 自动编号。所以请确保它为您的表输入了正确的字段名,我的是 ‘ comp _ id’。然后将其放入前面创建的临时表中。

  VALUES (@comp_name, @comp_regno, @comp_email)


SET @recID = (SELECT tempID FROM @tableVar)

——上面的行用于搜索我们在前面创建的临时表,其中保存了我们需要的 ID。由于这个临时表中只有一条记录,而且只有一个字段,因此它将只选择您需要的 ID 号,并将其放入“ @ recID”中。‘ @ recID’现在有你想要的身份证号码,你可以使用它如何你想像我已经使用它下面。

  INSERT INTO staff(Staff_comp_id)
VALUES (@recID)


End

就是这样。实际上,您可以在 “输出已插入. What EverFieldNameYouWant”行中获取您想要的任何内容,并在临时表中创建您想要的字段,然后以您想要的方式访问它。

我一直在寻找这样的东西很多年了,这个详细的分解,我希望这有所帮助。

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

在纯 SQL 中,主语句酷似:

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

方括号定义表 simbs,然后是列 En 和 ID,圆括号定义要初始化的列的枚举,然后是列的值,在我的例子中是一列和一个值。撇号包括一个字符串

我会向你解释我的方法:

这可能不容易理解,但我希望有用的大图片周围使用最后插入的 id。当然还有其他更简单的方法。但我有理由保留我的。不包括关联函数,只包括它们的名称和参数名称。

我把这种方法用于医学人工智能 该方法检查中心表(1)中是否存在所需的字符串。如果所需的字符串不在中央表“ simbs”中,或者如果允许重复,则将所需的字符串添加到中央表“ simbs”(2)中。最后插入的 id 用于创建相关联的表(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
}

还可以在 SQLServer 中使用对 SCOPE _ IDENTITY 的调用。

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

在查询中使用 选择 SCOPE _ IDENTITY ()

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

会成功的。

我尝试了上面的方法,但是没有效果,我发现这个想法,对我来说还不错。

var ContactID = db.GetLastInsertId();

它的代码更少,我很容易放进去。

希望这对谁有帮助。

在这之后:

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。

插入 aspnet _ GameProfiles (UserId,GameId) 价值观(@UserId,@GameId) ; 选择“身份”

插入 aspnet _ GameProfiles (UserId,GameId)值(@UserId,@GameId)”; 然后你可以直接通过 desc 方式排序表来访问最后一个 id。

SELECT TOP 1 UserId FROM aspnet _ GameProfiles ORDER BY UserId DESC 从 aspnet _ GameProfiles 中选择 TOP 1 UserId。

如果你使用 ExecuteScalar:

cmd.ExecuteScalar();
result_id=cmd.LastInsertedId.ToString();

也许这个答案和我的数据库似乎没有指定为“ IDENTITY”的列一样有帮助(“ SELECT SCOPE _ IDENTITY ()”或“@@ IDENTITY”调用需要“ IDENTITY”)。另外,我的“ ID”列的类型是“二进制(16)”,所以我需要像下面所述的那样转换输出:

string returnId = BitConverter.ToString((byte[])cmd.ExecuteScalar()).Replace("-", "");
//   skip the replace if you handle the hyphen otherwise