복붙노트

[SQL] INSERT 수익률 ID?

SQL

INSERT 수익률 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. ==============================

    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. ==============================

    2.당신은 두 가지 옵션이 있습니다; 당신은 @ID라는 출력 매개 변수를 선언 할 수; 또는 - 당신은 SELECT SCOPE_IDENTITY () 그냥 사용에 끝을 변경할 수 있습니다 :

    당신은 두 가지 옵션이 있습니다; 당신은 @ID라는 출력 매개 변수를 선언 할 수; 또는 - 당신은 SELECT SCOPE_IDENTITY () 그냥 사용에 끝을 변경할 수 있습니다 :

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

    나는 형식 매개 변수 접근법을 선호하지만, ExecuteScalar는 잘 작동합니다.

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

    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. ==============================

    4.이 당신의 매개 변수합니다 추가

    이 당신의 매개 변수합니다 추가

    SqlParameter IDParameter = new SqlParameter("@ID",SqlDbType.Int);
    IDParameter.Direction = ParameterDirection.Output;
    cmd.Parameters.Add(IDParameter);
    

    당신이 ID를 검색 할 수 있습니다 실행 한 후

    int id = (int)IDParameter.Value;
    
  5. ==============================

    5.왜 저장 프로 시저를 호출하지 않습니다. 가게 절차에 값 전달이 값을 삽입하려면와 SP 리턴에서 마지막 시드 값이 SCOPE_IDENTITY를 사용하여 삽입 (). 이 도움을 바랍니다.

    왜 저장 프로 시저를 호출하지 않습니다. 가게 절차에 값 전달이 값을 삽입하려면와 SP 리턴에서 마지막 시드 값이 SCOPE_IDENTITY를 사용하여 삽입 (). 이 도움을 바랍니다.

  6. from https://stackoverflow.com/questions/5910385/return-id-on-insert by cc-by-sa and MIT license