복붙노트

[SQL] 삽입 명령을 실행하고 SQL에서 이드 삽입 돌려주는

SQL

삽입 명령을 실행하고 SQL에서 이드 삽입 돌려주는

안녕 난 MVC4에서 C #을 사용 SQL 테이블에 일부 값을 삽입하고있다. 사실 나는 값을 삽입하고 마지막 삽입 된 레코드의 'ID'를 반환합니다. 다음 코드를 사용합니다.

public class MemberBasicData
{
    public int Id { get; set; }
    public string Mem_NA { get; set; }
    public string Mem_Occ { get; set; }     
}

삽입 할 때 ID가 자동으로 데이터베이스에 증가한다.

public int CreateNewMember(string Mem_NA, string Mem_Occ )
{
    using (SqlConnection con=new SqlConnection(Config.ConnectionString))
    {
        using(SqlCommand cmd=new SqlCommand("INSERT INTO Mem_Basic(Mem_Na,Mem_Occ) VALUES(@na,@occ)",con))
        {
            cmd.Parameters.AddWithValue("@na", Mem_NA);
            cmd.Parameters.AddWithValue("@occ", Mem_Occ);
            con.Open();

            int modified = cmd.ExecuteNonQuery();

            if (con.State == System.Data.ConnectionState.Open) con.Close();
                return modified;
        }
    }
}

나는 ExecuteNonQuery는이 행에 영향을 미치는 번호를 의미 알고있다. 그 대신 내가 사용의

int modified = (int)cmd.ExecuteScalar();

그러나 작동하지 않습니다. 이 문제를 해결하기 위해 도와주세요. 그리고 (내 코드에서 작동하지 않습니다) cmd.ExecuteInsertAndGetID ()와 같은 코드가있다.

해결법

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

    1.다음 솔루션은 SQL Server 2005 및 이상 작동합니다. 당신은 필요한 필드를 얻기 위해 출력을 사용할 수 있습니다. ID의 올바른 위치는 당신이 반환하려는 키를 작성할 수 있습니다. 이런 식으로 그것을 할

    다음 솔루션은 SQL Server 2005 및 이상 작동합니다. 당신은 필요한 필드를 얻기 위해 출력을 사용할 수 있습니다. ID의 올바른 위치는 당신이 반환하려는 키를 작성할 수 있습니다. 이런 식으로 그것을 할

    대한 SQL Server 2005 및 위

        using(SqlCommand cmd=new SqlCommand("INSERT INTO Mem_Basic(Mem_Na,Mem_Occ) output INSERTED.ID VALUES(@na,@occ)",con))
        {
            cmd.Parameters.AddWithValue("@na", Mem_NA);
            cmd.Parameters.AddWithValue("@occ", Mem_Occ);
            con.Open();
    
            int modified =(int)cmd.ExecuteScalar();
    
            if (con.State == System.Data.ConnectionState.Open) 
                con.Close();
    
            return modified;
        }
    }
    

    이전 버전에 대한

        using(SqlCommand cmd=new SqlCommand("INSERT INTO Mem_Basic(Mem_Na,Mem_Occ)  VALUES(@na,@occ);SELECT SCOPE_IDENTITY();",con))
        {
            cmd.Parameters.AddWithValue("@na", Mem_NA);
            cmd.Parameters.AddWithValue("@occ", Mem_Occ);
            con.Open();
    
            int modified = Convert.ToInt32(cmd.ExecuteScalar());
    
            if (con.State == System.Data.ConnectionState.Open) con.Close();
                return modified;
        }
    }
    
  2. ==============================

    2.에 조회를 변경

    에 조회를 변경

    "INSERT INTO Mem_Basic(Mem_Na,Mem_Occ) VALUES(@na,@occ); SELECT SCOPE_IDENTITY()"
    

    이것은 당신이 다음 ExecuteScalar는 함께 얻을 수있는 마지막 삽입 된 ID를 반환

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

    3.SQL 서버 저장 프로 시저 :

    SQL 서버 저장 프로 시저 :

    CREATE PROCEDURE [dbo].[INS_MEM_BASIC]
        @na varchar(50),
        @occ varchar(50),
        @New_MEM_BASIC_ID int OUTPUT
    AS
    BEGIN
        SET NOCOUNT ON;
    
        INSERT INTO Mem_Basic
        VALUES (@na, @occ)
    
        SELECT @New_MEM_BASIC_ID = SCOPE_IDENTITY()
    END
    

    C # 코드 :

    public int CreateNewMember(string Mem_NA, string Mem_Occ )
    {
        // values 0 --> -99 are SQL reserved.
        int new_MEM_BASIC_ID = -1971;   
        SqlConnection SQLconn = new SqlConnection(Config.ConnectionString);
        SqlCommand cmd = new SqlCommand("INS_MEM_BASIC", SQLconn);
    
        cmd.CommandType = CommandType.StoredProcedure;
    
        SqlParameter outPutVal = new SqlParameter("@New_MEM_BASIC_ID", SqlDbType.Int);
    
        outPutVal.Direction = ParameterDirection.Output;
        cmd.Parameters.Add(outPutVal);
        cmd.Parameters.Add("@na", SqlDbType.Int).Value = Mem_NA;
        cmd.Parameters.Add("@occ", SqlDbType.Int).Value = Mem_Occ;
    
        SQLconn.Open();
        cmd.ExecuteNonQuery();
        SQLconn.Close();
    
        if (outPutVal.Value != DBNull.Value) new_MEM_BASIC_ID = Convert.ToInt32(outPutVal.Value);
            return new_MEM_BASIC_ID;
    }
    

    나는 당신이 의지의 도움을 바랍니다 ....

    당신이 원하는 경우에 당신은이를 사용할 수 있습니다 ...

    public int CreateNewMember(string Mem_NA, string Mem_Occ )
    {
        using (SqlConnection con=new SqlConnection(Config.ConnectionString))
        {
            int newID;
            var cmd = "INSERT INTO Mem_Basic(Mem_Na,Mem_Occ) VALUES(@na,@occ);SELECT CAST(scope_identity() AS int)";
    
            using(SqlCommand cmd=new SqlCommand(cmd, con))
            {
                cmd.Parameters.AddWithValue("@na", Mem_NA);
                cmd.Parameters.AddWithValue("@occ", Mem_Occ);
    
                con.Open();
                newID = (int)insertCommand.ExecuteScalar();
    
                if (con.State == System.Data.ConnectionState.Open) con.Close();
                    return newID;
            }
        }
    }
    
  4. ==============================

    4.

    USE AdventureWorks2012;
    GO
    IF OBJECT_ID(N't6', N'U') IS NOT NULL 
        DROP TABLE t6;
    GO
    IF OBJECT_ID(N't7', N'U') IS NOT NULL 
        DROP TABLE t7;
    GO
    CREATE TABLE t6(id int IDENTITY);
    CREATE TABLE t7(id int IDENTITY(100,1));
    GO
    CREATE TRIGGER t6ins ON t6 FOR INSERT 
    AS
    BEGIN
       INSERT t7 DEFAULT VALUES
    END;
    GO
    --End of trigger definition
    
    SELECT id FROM t6;
    --IDs empty.
    
    SELECT id FROM t7;
    --ID is empty.
    
    --Do the following in Session 1
    INSERT t6 DEFAULT VALUES;
    SELECT @@IDENTITY;
    /*Returns the value 100. This was inserted by the trigger.*/
    
    SELECT SCOPE_IDENTITY();
    /* Returns the value 1. This was inserted by the 
    INSERT statement two statements before this query.*/
    
    SELECT IDENT_CURRENT('t7');
    /* Returns value inserted into t7, that is in the trigger.*/
    
    SELECT IDENT_CURRENT('t6');
    /* Returns value inserted into t6. This was the INSERT statement four statements before this query.*/
    
    -- Do the following in Session 2.
    SELECT @@IDENTITY;
    /* Returns NULL because there has been no INSERT action 
    up to this point in this session.*/
    
    SELECT SCOPE_IDENTITY();
    /* Returns NULL because there has been no INSERT action 
    up to this point in this scope in this session.*/
    
    SELECT IDENT_CURRENT('t7');
    /* Returns the last value inserted into t7.*/
    
  5. ==============================

    5.

    using(SqlCommand cmd=new SqlCommand("INSERT INTO Mem_Basic(Mem_Na,Mem_Occ) " +
        "VALUES(@na,@occ);SELECT SCOPE_IDENTITY();",con))
    {
        cmd.Parameters.AddWithValue("@na", Mem_NA);
        cmd.Parameters.AddWithValue("@occ", Mem_Occ);
        con.Open();
    
        int modified = cmd.ExecuteNonQuery();
    
        if (con.State == System.Data.ConnectionState.Open) con.Close();
            return modified;
    }
    

    SCOPE_IDENTITY가 : 동일한 범위 식별 컬럼에 삽입 된 마지막 ID 값을 반환. 자세한 내용은 http://technet.microsoft.com/en-us/library/ms190315.aspx

  6. from https://stackoverflow.com/questions/18373461/execute-insert-command-and-return-inserted-id-in-sql by cc-by-sa and MIT license