복붙노트

[SQL] 어떻게 마지막으로 삽입 된 ID를 얻는 방법?

SQL

어떻게 마지막으로 삽입 된 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();
}

나는이 테이블에 삽입 할 때, 나는 다른 테이블에 삽입 할 해당 ID를 사용할 수 있도록하는 방법이 후 마지막으로 삽입 된 하나를 얻을 수 GamesProfileId라는 AUTO_INCREMENT의 INT 기본 키 열이?

해결법

  1. ==============================

    1.더 삽입 트리거가없는 경우 SQL 서버 2005 +를 들어,이에 삽입 문 (모두 한 줄, 여기에 명확성을 위해 분할)을 변경

    더 삽입 트리거가없는 경우 SQL 서버 2005 +를 들어,이에 삽입 문 (모두 한 줄, 여기에 명확성을 위해 분할)을 변경

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

    SQL 서버 2000, 또는 삽입 트리거가있는 경우 :

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

    그리고

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

    2.의 CommandText가 동일하면 명령을 만들 수 있습니다

    의 CommandText가 동일하면 명령을 만들 수 있습니다

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

    INT와 식 (INT) command.ExecuteScalar를 실행한다.

    이 MSDN 문서는 당신에게 몇 가지 추가 기술을 제공 할 것입니다.

  3. ==============================

    3.

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

    이 VIL 일 :

  4. ==============================

    4.나도 같은 요구를했고,이 대답을 발견 ..

    나도 같은 요구를했고,이 대답을 발견 ..

    이 회사 테이블 (완)에 레코드를 생성하고,이를 회사 테이블에 생성 된 자동 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 번호를 저장할 임시 테이블을 만드는 데 사용됩니다. 그것은 단지 하나의 필드 '미지근한'을 가지고 있으며, 그 유형 INT는 '@recID'과 동일합니다.

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

    - 'OUTPUT 삽입.' 상기 광고는 현재 생성되는 레코드의 모든 필드에서 잡아 데이터를 사용한다. 우리가 원하는이 데이터는 ID의 일련 번호입니다. 그래서 반드시 당신의 테이블에 대한 올바른 필드 이름, 나의 'comp_id'이다라고합니다. 이것은 우리가 이전에 만든 tempory 테이블에 삭제됩니다.

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

    - 위의 라인은 ID의 우리의 필요가 저장됩니다 우리가 이전에 만든 tempory 테이블을 검색하는 데 사용됩니다. 이 tempory 테이블에서 하나의 레코드 만, 단 하나 개의 필드가 존재하기 때문에, 그것은 단지 당신이 필요로하는 ID 번호를 선택하고 '@recID'로 떨어질 것이다. '@recID은'지금 당신이 원하는 ID 번호를 가지고 있으며, 내가 아래를 사용한 것처럼 당신이 원하는 당신은 어떻게 사용할 수 있습니다.

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

    - 그래서 당신이 이동합니다. 당신은 실제로 당신이 '출력 inserted.WhatEverFieldNameYouWant'라인에서 원하는 무엇도 잡고 당신이 당신의 tempory 테이블에 액세스 당신이 방법을 지금까지 사용하기 원하는 필드 무엇을 만들 수 있습니다.

    나는이 자세한 브레이크 다운과 함께, 난이 도움이되기를 바랍니다, 연령대에 이런 식으로 뭔가를 찾고 있었다.

  5. ==============================

    5.순수 SQL에서 주 문 kools 좋아 :

    순수 SQL에서 주 문 kools 좋아 :

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

    대괄호 괄호는 열 열거 제 경우, 다음 하나의 열 및 하나 개의 값을 컬럼의 값을 초기화하고되도록 정의 테이블 simbs 후 컬럼 EN과 ID를 정의한다. 어포 스트로피는 문자열을 둘러싸

    나는 당신에게 내 접근 방식을 설명합니다 :

    그것은 이해하지만 난 마지막으로 삽입 된 ID를 사용하여 주변의 큰 그림을 얻을 도움이 희망 쉽지 수 있습니다. 물론 다른 쉬운 방법이있다. 그러나 나는 내 유지하는 이유가있다. 관련 기능은 단지 그들의 이름과 매개 변수 이름, 포함되지 않습니다.

    나는 의료 인공 지능이 방법을 사용 방법 체크 원하는 문자열은 중앙 테이블 (1)에 존재합니다. 원하는 문자열이 중앙 테이블 "simbs"에없는 경우 중복이 허용되는 경우, 또는, 원하는 문자열은 중앙 테이블 "simbs"(2)에 추가됩니다. 마지막 inseerted 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
        }
    
  6. ==============================

    6.나는 위의 시도하지만 작동하지 않았다, 나는 나를 위해 잘 작동이 생각을 발견했다.

    나는 위의 시도하지만 작동하지 않았다, 나는 나를 위해 잘 작동이 생각을 발견했다.

    var ContactID = db.GetLastInsertId();
    

    그 적은 코드와 나는 쉬운 넣어.

    이 사람을 도움이되기를 바랍니다.

  7. ==============================

    7.또한 SQL Server의 SCOPE_IDENTITY에게 전화를 사용할 수 있습니다.

    또한 SQL Server의 SCOPE_IDENTITY에게 전화를 사용할 수 있습니다.

  8. ==============================

    8.

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

    9.마지막으로 삽입 된 ID 만 얻을 수있는 모든 종류의 방법이 있습니다 내가 찾은 가장 쉬운 방법은 단순히 때문에 같은 데이터 집합에 TableAdapter가에서 검색하는 것입니다 :

    마지막으로 삽입 된 ID 만 얻을 수있는 모든 종류의 방법이 있습니다 내가 찾은 가장 쉬운 방법은 단순히 때문에 같은 데이터 집합에 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;
    

    도움이 되었기를 바랍니다 ...

  10. ==============================

    10.어떤 행을 삽입 한 후에는 쿼리의 행 아래에 의해 마지막으로 삽입 된 ID를 얻을 수 있습니다.

    어떤 행을 삽입 한 후에는 쿼리의 행 아래에 의해 마지막으로 삽입 된 ID를 얻을 수 있습니다.

    INSERT INTO aspnet_GameProfiles (사용자 아이디, 게임 ID) VALUES (@UserId, @GameId); SELECT @@ IDENTITY

  11. ==============================

    11.쿼리를 사용하여 SELECT SCOPE_IDENTITY ()

    쿼리를 사용하여 SELECT SCOPE_IDENTITY ()

  12. ==============================

    12.금후:

    금후:

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

    이 실행

    int id = (int)command.ExecuteScalar;
    

    그것은 작동합니다

  13. ==============================

    13.INSERT INTO aspnet_GameProfiles (사용자 아이디, 게임 ID) 가치 (@UserId, @GameId) "; 당신은 내림차순 방식으로 테이블을 주문하여 마지막 ID에 바로 액세스 할 수 있습니다.

    INSERT INTO aspnet_GameProfiles (사용자 아이디, 게임 ID) 가치 (@UserId, @GameId) "; 당신은 내림차순 방식으로 테이블을 주문하여 마지막 ID에 바로 액세스 할 수 있습니다.

    aspnet_GameProfiles ORDER BY 사용자 아이디 DESC FROM SELECT TOP 1 사용자 아이디.

  14. ==============================

    14.

    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
    
  15. from https://stackoverflow.com/questions/5228780/how-to-get-last-inserted-id by cc-by-sa and MIT license