[SQL] INSERT 수익률 ID?
SQLINSERT 수익률 ID?
나는 INSERT 쿼리를하고 난 DB를 내가 방금 삽입 한 행의 ID를 반환합니다.
sqlString = "INSERT INTO MagicBoxes (OwnerID, Key, Name, Permissions, Active, LastUpdated) VALUES (@OwnerID, @BoxKey, @BoxName, 0, 1, @Date) SET @ID = SCOPE_IDENTITY();";
cmd = new SqlCommand(sqlString, con);
cmd.Parameters.AddWithValue("@OwnerID", OwnerID);
cmd.Parameters.AddWithValue("@BoxKey", BoxKey);
cmd.Parameters.AddWithValue("@BoxName", BoxName);
cmd.Parameters.AddWithValue("@Username", Username);
cmd.Parameters.AddWithValue("@Date", DateTime.Now);
cmd.ExecuteNonQuery();
나는 현재 내가 확실히 내가 다음에해야 할 일이 아니에요,이가 ...
해결법
-
==============================
1.당신은이처럼을 PARAMS 컬렉션에 @ID를 추가 한 다음 검색해야
당신은이처럼을 PARAMS 컬렉션에 @ID를 추가 한 다음 검색해야
cmd.Parameters.Add("@ID", SqlDbType.Int, 4).Direction = ParameterDirection.Output; cmd.ExecuteNonQuery(); //Now just read the value of: cmd.Parameters["@ID"].value
또는,이 구문을 선호하는 경우 :
SqlParameter param = new SqlParameter("@ID", SqlDbType.Int, 4); param.Direction = ParameterDirection.Output; cmd.Parameters.Add(param);
-
==============================
2.당신은 두 가지 옵션이 있습니다; 당신은 @ID라는 출력 매개 변수를 선언 할 수; 또는 - 당신은 SELECT SCOPE_IDENTITY () 그냥 사용에 끝을 변경할 수 있습니다 :
당신은 두 가지 옵션이 있습니다; 당신은 @ID라는 출력 매개 변수를 선언 할 수; 또는 - 당신은 SELECT SCOPE_IDENTITY () 그냥 사용에 끝을 변경할 수 있습니다 :
int id = (int)cmd.ExecuteScalar();
나는 형식 매개 변수 접근법을 선호하지만, ExecuteScalar는 잘 작동합니다.
-
==============================
3.SQL 서버 2008 년부터 SQL 구문에 추가 출력 조항이 있었다. 이것은 당신이 테이블 형식 데이터 스트림에 추가 된 DML 쿼리에 의해 영향을받는 데이터를 가질 수 있습니다.
SQL 서버 2008 년부터 SQL 구문에 추가 출력 조항이 있었다. 이것은 당신이 테이블 형식 데이터 스트림에 추가 된 DML 쿼리에 의해 영향을받는 데이터를 가질 수 있습니다.
쿼리 반환 후 올바른 정보를 SCOPE_IDENTITY ()를 쿼리하지만 그것은 출력 절은 하나 개의 쿼리에이 제한이 쿼리를 실행하는 SQL 서버를 강제로.
이 알면, 쿼리 ([ID]은 신원의 이름 가정) 다음과 같이 변경 될 수있다 실행될 :
INSERT INTO MagicBoxes (OwnerID, [Key], Name, [Permissions], Active, LastUpdated) OUTPUT INSERTED.Id VALUES (@OwnerID, @BoxKey, @BoxName, 0, 1, @Date)
또 다른 문제는 SqlCommand를 폐기되지 않습니다. 는 SQL의 대부분은 ... ADO.net의 객체는 IDisposable을 구현하고 적절히 폐기해야합니다.
다음과 같이 모든 것을 가져 오는 것은 함께 나는이 코드 조각을 구현하는 것입니다 :
using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["db"].ConnectionString)) using (var cmd = new SqlCommand(@" INSERT INTO MagicBoxes (OwnerID, [Key], Name, [Permissions], Active, LastUpdated) OUTPUT INSERTED.Id VALUES (@OwnerID, @BoxKey, @BoxName, 0, 1, @Date) ", conn)) { cmd.Parameters.AddRange(new[] { new SqlParameter("@OwnerID", SqlDbType.Int).Value = OwnerID, new SqlParameter("@BoxKey", SqlDbType.VarChar).Value = BoxKey, new SqlParameter("@BoxName", SqlDbType.VarChar).Value = BoxName, new SqlParameter("@Date", SqlDbType.DateTime).Value = DateTime.Now }); conn.Open(); var id = (int)cmd.ExecuteScalar(); }
-
==============================
4.이 당신의 매개 변수합니다 추가
이 당신의 매개 변수합니다 추가
SqlParameter IDParameter = new SqlParameter("@ID",SqlDbType.Int); IDParameter.Direction = ParameterDirection.Output; cmd.Parameters.Add(IDParameter);
당신이 ID를 검색 할 수 있습니다 실행 한 후
int id = (int)IDParameter.Value;
-
==============================
5.왜 저장 프로 시저를 호출하지 않습니다. 가게 절차에 값 전달이 값을 삽입하려면와 SP 리턴에서 마지막 시드 값이 SCOPE_IDENTITY를 사용하여 삽입 (). 이 도움을 바랍니다.
왜 저장 프로 시저를 호출하지 않습니다. 가게 절차에 값 전달이 값을 삽입하려면와 SP 리턴에서 마지막 시드 값이 SCOPE_IDENTITY를 사용하여 삽입 (). 이 도움을 바랍니다.
from https://stackoverflow.com/questions/5910385/return-id-on-insert by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 저장 프로 시저의 반환 결과 세트 대신 int로 (0) | 2020.06.12 |
---|---|
[SQL] 내가 사용이 가입 또는 EXISTS 사용하여 더 나은 성능을 얻을 수 있습니까? (0) | 2020.06.12 |
[SQL] 문자열에 특수 문자가 포함 된 경우 어떻게 감지? (0) | 2020.06.12 |
[SQL] ''근처의 구문이 잘못되었습니다 (0) | 2020.06.12 |
[SQL] SQL 서버 : 쿼리와 컬럼의 디폴트 값을 찾기 (0) | 2020.06.12 |