[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.다음 솔루션은 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.에 조회를 변경
에 조회를 변경
"INSERT INTO Mem_Basic(Mem_Na,Mem_Occ) VALUES(@na,@occ); SELECT SCOPE_IDENTITY()"
이것은 당신이 다음 ExecuteScalar는 함께 얻을 수있는 마지막 삽입 된 ID를 반환
-
==============================
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.
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.
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
from https://stackoverflow.com/questions/18373461/execute-insert-command-and-return-inserted-id-in-sql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 절 "로"MySQL은 (0) | 2020.03.20 |
---|---|
[SQL] ORDER BY와 LIMIT 대 MIN / MAX (0) | 2020.03.20 |
[SQL] 다른 서버에 두 개의 데이터베이스에 두 개의 테이블을 조인하여 데이터를 쿼리 (0) | 2020.03.20 |
[SQL] NOLOCK (SQL 서버 힌트) 나쁜 관행인가? (0) | 2020.03.20 |
[SQL] 날짜 + 시간과 날짜를 얻기 위해 SQL Server의 가장 효율적인 방법은? (0) | 2020.03.20 |