하나의 SqlCommand를 사용하여 레코드를 삽입하고 새로 생성된 ID를 반환하는 방법?
자동 생성된 기본 키가 있는 테이블에 레코드를 삽입하기 위해 SQLCommand 개체를 사용하고 있습니다.ExecuteScalar() 메서드를 사용할 때 새로 생성된 ID를 가져오도록 명령 텍스트를 작성하려면 어떻게 해야 합니까?
INSERT INTO YourTable(val1, val2, val3 ...)
VALUES(@val1, @val2, @val3...);
SELECT SCOPE_IDENTITY();
각 문장 끝에 있는 세미콜론을 잊지 마세요.
SQL 쿼리 끝에 다음 행 추가...
SELECT SCOPE_IDENTITY()
그런 다음 SqlCommand 개체에서 ExecuteScalar 메서드를 사용합니다.
var rowCount = command.ExecuteScalar()
insert into Yourtable()
values()
SELECT SCOPE_IDENTITY()
방금 테스트를 실행하여 SQL Server 2005 SP2 및 를 사용하여 세미콜론이 옵션인지 확인했습니다.순 3.5
명령 개체에 출력 파라미터를 추가한 다음 저장 프로시저에서 새 ID로 값을 설정합니다.
저장 프로시저:
@ID AS INT OUTPUT
[Insert Command]
SET @ID = SCOPE_IDENTITY()
.NET:
cmd.CommandText = "stored_procedure";
SqlParameter pID = new SqlParameter("ID", DBType.Int32, 4);
pID.Direction = ParameterDirection.Output;
cmd.ExecuteScalar();
int id = Convert.ToInt32(cmd.Parameters["ID"].Value.ToString());
@@IDENTITY를 사용하지 마십시오.잘못된 값을 반환할 수 있습니다.
SELECT SCOPE_IDENTITY()
당연한 선택인 것 같습니다
Dave Markle의 답변이 마음에 들기는 하지만(답변으로 표시하셨기 때문에), 데이터베이스에 트리거가 있고 CUD 작업을 감사하며 감사 테이블에 IDENTITY 열이 있다면 이 방법은 실패할 수 있습니다.감사 테이블이 실제로 다음에 발생하므로 방금 삽입한 테이블이 아닌 감사 테이블의 ID 값을 반환합니다.
이 경우 감사에 관계없이 두 경우 모두에서 작동하는 보다 일반적인 방법을 사용할 수 있습니다.좀 더 말이 많지만, 돈을 주고 사는 거죠.
예:
@"DECLARE @tmp AS TABLE ( id int )
INSERT INTO case
(
caseID,
partID,
serialNumber,
hardware,
software,
firmware
)
OUTPUT Inserted.ID into @tmp
VALUES
(
@caseID,
@partItemID,
@serialNumber,
@hardware,
@software,
@firmware
)
Select ID from @tmp" )
삽입 stmt 직후 사용
SELECT CAST(scope_identity() AS bigint) ---- incase you have a return result as int64
이렇게 하면 생성된 열 ID/ID가 반환됩니다.
ID가 Guid이면 이 솔루션이 가장 좋습니다.
INSERT INTO YourTable (val1, val2, val3)
OUTPUT inserted.id
VALUES (@val1, @val2, @val3)
Thanks @Scott Ivey
전체 데모:
internal static Guid InsertNote(Note note)
{
Guid id;
using (
var connection =
new SqlConnection(ConfigurationManager.ConnectionStrings["dbconn"].ConnectionString))
{
connection.Open();
using (
var command =
new SqlCommand(
"INSERT INTO Notes ([Title],[Text]) " +
"OUTPUT inserted.id " +
$"VALUES ('{title}','{text}');", connection))
{
command.CommandType = CommandType.Text;
var reader = command.ExecuteReader();
reader.Read();
id = reader.GetGuid(reader.GetOrdinal("id"));
}
connection.Close();
}
return id;
}
저장 프로시저를 사용하는 것을 권장하지만, 이는 당사 저장소의 단위 테스트를 위한 것입니다.
월풀에서 바로 탈출하는 방법:
MS SQL을 사용하는 경우 삽입 후 "SELECT @@IDENTITY as Value"를 사용하여 마지막 ID를 생성할 수 있습니다.
그리고:
@@IDENTITY그리고.SCOPE_IDENTITY현재 세션의 테이블에서 생성된 마지막 ID 값을 반환합니다.하지만,SCOPE_IDENTITY현재 범위 내에서만 값을 반환합니다.@@IDENTITY특정 범위에 국한되지 않습니다.
편집 : 댓글에 지적된 것처럼 항상 다음을 사용해야 합니다.SCOPE_IDENTITY,것은 아니다.@@IDENTITY.
언급URL : https://stackoverflow.com/questions/330707/how-to-insert-a-record-and-return-the-newly-created-id-using-a-single-sqlcommand
'programing' 카테고리의 다른 글
| TypeScript로 데이터베이스 버전을 확인하는 방법? (0) | 2023.09.14 |
|---|---|
| UI 탐색 모음 - 제목을 프로그래밍 방식으로 설정하시겠습니까? (0) | 2023.09.09 |
| 기존 테이블스페이스의 MAXSIZE를 결정하는 방법 (0) | 2023.09.09 |
| HTML div 태그의 테두리를 설정하는 방법 (0) | 2023.09.09 |
| jquery, 클래스별로 다음 요소 찾기 (0) | 2023.09.09 |