Как получить последний вставленный идентификатор? - PullRequest
162 голосов
/ 08 марта 2011

У меня есть этот код:

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

Когда я вставляю в эту таблицу, у меня есть столбец первичного ключа auto_increment int с именем GamesProfileId, как я могу получить последний вставленный после этого, чтобы я могиспользовать этот идентификатор для вставки в другую таблицу?

Ответы [ 15 ]

244 голосов
/ 08 марта 2011

Для 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();
38 голосов
/ 08 марта 2011

Вы можете создать команду с CommandText, равным

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

и выполнить int id = (int)command.ExecuteScalar.

Эта статья MSDN даст вам несколько дополнительных приемов.

5 голосов
/ 23 октября 2015
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 голосов
/ 19 мая 2012

В чистом SQL основной оператор kools, такой как:

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

Квадратные скобки определяют символы таблицы, а затем столбцы En и ID, круглые скобки определяют нумерацию столбцов, которые нужно инициировать, а затем значениястолбцы, в моем случае один столбец и одно значение.Апострофы заключают в себе строку

Я объясню вам мой подход:

Это может быть непросто понять, но я надеюсь, что полезно получить общую картину, используя последний вставленный идентификатор.Конечно, есть альтернативные, более простые подходы.Но у меня есть причины, чтобы сохранить мои.Связанные функции не включены, только их имена и имена параметров.

Я использую этот метод для медицинского искусственного интеллекта. Этот метод проверяет, существует ли искомая строка в центральной таблице (1).Если искомая строка отсутствует в центральной таблице «simbs» или разрешены дубликаты, искомая строка добавляется в центральную таблицу «simbs» (2).Последний вставленный идентификатор используется для создания связанной таблицы (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
    }
3 голосов
/ 12 апреля 2011

У меня была такая же потребность и я нашел этот ответ ..

Это создает запись в таблице компании (comp), она захватывает автоматический идентификатор, созданный в таблице компании, и помещает его в таблицу персонала (персонал), чтобы можно было связать 2 таблицы, МНОГИЕ сотрудники с ОДНОЙ компанией. Он работает на моей базе данных 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' используется для хранения автоматически сгенерированного идентификационного номера Компании, который мы собираемся получить

AS
 Begin

  SET NOCOUNT ON

  DECLARE @tableVar TABLE (tempID INT)

- строка выше используется для создания временной таблицы для хранения автоматически сгенерированного идентификационного номера для последующего использования. Он имеет только одно поле 'tempID', и его тип INT совпадает с '@recID'.

  INSERT INTO comp(comp_name, comp_regno, comp_email) 

  OUTPUT inserted.comp_id INTO @tableVar

- строка ' OUTPUT вставлена. ' выше используется для извлечения данных из любого поля в записи, которую он создает прямо сейчас. Эти данные, которые мы хотим, являются идентификатором autonumber. Поэтому убедитесь, что в нем указано правильное имя поля для вашей таблицы, у меня 'comp_id' . Затем он помещается в таблицу временных показателей, которую мы создали ранее.

  VALUES (@comp_name, @comp_regno, @comp_email)

  SET @recID = (SELECT tempID FROM @tableVar)

- Строка выше используется для поиска таблицы темпораций, которую мы создали ранее, в которой сохранен нужный нам идентификатор. Поскольку в этой таблице временных данных есть только одна запись и только одно поле, он выберет только тот идентификационный номер, который вам нужен, и поместит его в ' @ recID '. ' @ recID ' теперь имеет желаемый идентификационный номер, и вы можете использовать его так, как хотите, как я использовал его ниже.

  INSERT INTO staff(Staff_comp_id) 
  VALUES (@recID)

 End

- Итак, поехали. На самом деле вы можете получить все, что вы хотите, в строке 'OUTPUT Я искал что-то подобное целую вечность, с этим подробным анализом, надеюсь, это поможет.

2 голосов
/ 14 июля 2016

Я попробовал вышеописанное, но они не сработали, я нашел эту мысль, которая прекрасно работает для меня.

var ContactID = db.GetLastInsertId();

Это меньше кода, и я легко вставляю.

Надеюсь, это кому-то поможет.

1 голос
/ 04 февраля 2017

Существует множество способов получения последнего введенного идентификатора, но самый простой способ, который я нашел, - это просто извлечь его из адаптера таблиц в наборе данных следующим образом:

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

Надеюсь, это поможет ...

1 голос
/ 27 марта 2014
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();
        }
    }
}
0 голосов
/ 25 сентября 2018

INSERT INTO aspnet_GameProfiles (UserId, GameId) VALUES (@UserId, @GameId) "; тогда вы можете просто получить доступ к последнему идентификатору, упорядочив таблицу по порядку.

ВЫБРАТЬ ТОП 1 UserId ИЗ aspnet_GameProfilesЗАКАЗ ПО ИДЕНТИФИКАТОРУ DESC.

0 голосов
/ 15 января 2018

если ваш идентификатор типа int и установлен на автоинкремент, попробуйте этот

SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...