我有这段代码:
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插入另一个表?
答案 0 :(得分:241)
对于SQL Server 2005+,如果没有插入触发器,则更改insert语句(所有一行,为了清楚起见,将此处拆分)更改为
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();
答案 1 :(得分:37)
您可以创建CommandText
等于
INSERT INTO aspnet_GameProfiles(UserId, GameId) OUTPUT INSERTED.ID VALUES(@UserId, @GameId)
并执行int id = (int)command.ExecuteScalar
。
此MSDN article会为您提供一些其他技巧。
答案 2 :(得分:5)
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();
}
这项工作:)
答案 3 :(得分:3)
我有同样的需要并找到了答案..
这会在公司表(comp)中创建一条记录,它会抓取在公司表上创建的自动ID并将其放入员工表(员工)中,这样就可以将2个表链接到一个公司。它适用于我的SQL 2008 DB,应该适用于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)
- 上面的行用于创建一个临时表来保存自动生成的ID号以供以后使用。它只有一个字段'tempID',其类型 INT 与'@ recID'相同。
INSERT INTO comp(comp_name, comp_regno, comp_email)
OUTPUT inserted.comp_id INTO @tableVar
- 上面的“ OUTPUT inserted。”行用于从现在正在创建的记录中的任何字段中获取数据。我们想要的数据是ID自动编号。因此,请确保为您的表格显示正确的字段名称,我的'comp_id'。然后将其放入我们之前创建的临时表中。
VALUES (@comp_name, @comp_regno, @comp_email)
SET @recID = (SELECT tempID FROM @tableVar)
- 上面的行用于搜索我们之前创建的临时表,其中保存了我们需要的ID。由于此临时表中只有一条记录,并且只有一个字段,因此只会选择您需要的ID号并将其放入“ @recID ”。 ' @recID '现在拥有您想要的ID号,您可以按照自己的方式使用它,就像我在下面使用它一样。
INSERT INTO staff(Staff_comp_id)
VALUES (@recID)
End
- 你去吧。您实际上可以在'OUTPUT inserted.WhatEverFieldNameYouWant'行中获取您想要的内容,并在您的临时表中创建所需的字段并访问它以使用您想要的方式。
我多年来一直在寻找这样的东西,详细介绍,我希望这会有所帮助。
答案 4 :(得分:3)
在纯SQL中,主要语句就像:
INSERT INTO [simbs] ([En]) OUTPUT INSERTED.[ID] VALUES ('en')
方括号定义表格simb,然后是列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
}
答案 5 :(得分:2)
我尝试了以上但是它们没有用,我发现了这个想法,这对我来说很合适。
var ContactID = db.GetLastInsertId();
它的代码少,我很容易投入。
希望这有助于某人。
答案 6 :(得分:1)
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();
}
}
}
答案 7 :(得分:1)
有各种方法可以获取Last Inserted 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;
希望这有助于......
答案 8 :(得分:0)
您还可以在SQL Server中使用对SCOPE_IDENTITY的调用。
答案 9 :(得分:0)
插入任何行后,您可以通过下面的查询行获取最后插入的ID。
INSERT INTO aspnet_GameProfiles(UserId,GameId) VALUES(@UserId,@ GameId); SELECT @@ IDENTITY
答案 10 :(得分:0)
如果您的id为int类型并设置为自动递增,请尝试使用此
SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE)
答案 11 :(得分:0)
插入aspnet_GameProfiles(UserId,GameId)VALUES(@UserId,@GameId)“; 那么您可以通过按desc方式对表格进行排序来访问最后一个ID。
从aspnet_GameProfiles中选择前1个用户ID,按用户ID DESC排序。
答案 12 :(得分:0)
如果您使用的是 executeScalar:
cmd.ExecuteScalar();
result_id=cmd.LastInsertedId.ToString();
答案 13 :(得分:-1)
在查询中使用 SELECT SCOPE_IDENTITY()
答案 14 :(得分:-1)
之后:
INSERT INTO aspnet_GameProfiles(UserId, GameId) OUTPUT INSERTED.ID VALUES(@UserId, @GameId)
执行此
int id = (int)command.ExecuteScalar;
它会起作用
答案 15 :(得分:-6)
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