2013-07-27 3 views
2

에서 AUTO_INCREMENT ID를 가져옵니다 :이 코드가 테이블

string conStr = ConfigurationManager.ConnectionStrings["BackgammonGame"].ConnectionString; 
      SqlConnection con = new SqlConnection(conStr); 
      SqlCommand cmd = new SqlCommand(); 
      cmd.Connection = con; 

      con.Open(); 
      cmd.CommandText = ("INSERT INTO Game (playerA, playerB) OUTPUT INSERTED.gameID VALUES (@playerA, @playerB)"); 

      cmd.Parameters.Add("@playerA", SqlDbType.NVarChar).Value = firstPlayer; 
      cmd.Parameters.Add("@playerB", SqlDbType.NVarChar).Value = secondPlayer; 

      cmd.ExecuteNonQuery(); 

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

내가이 테이블에 삽입 할 때, 나는 AUTO_INCREMENT INT 기본 키 열이 gameID라고, 그리고 나는 내가 gameID을 원하는 SQL 문에서 선언 출력. 내 문제는 코드에서이 줄을 쓸 때 : int id = (int)cmd.ExecuteScalar(); 삽입 된 매개 변수가 테이블에서 두 번 (동일한 정보가있는 두 줄) 나타납니다. 그러나 삭제하면 괜찮습니다.

다른 테이블에서이 ID를 사용할 수 있도록이 행이 필요합니다.

답변

2

변경하여 명령이 텍스트와

cmd.CommandText = ("INSERT INTO Game (playerA, playerB) VALUES (@playerA,@playerB); 
        SELECT SCOPE_IDENTITY()"); 

SCOPE IDENTITY 반환을 마지막으로 삽입 된 행의 ID 값을보십시오. 따라서 그 뜻이 삽입 쿼리를 사용하여 삽입 된 행의 제기 신원을 반환

은 EDIT 당신은 두 경우 쿼리를 두 번

cmd.ExecuteNonQuery(); // Avoid this 
int id = (int)cmd.ExecuteScalar();// This is enough 

을 실행하는

는 쿼리 그것을 원인을 실행하고 도착 삽입 두 번. ExecuteNonQuery()은 삽입 쿼리를 실행하고 영향을받는 행 수를 반환합니다.

여기서, ExecuteScalar()은 삽입 된 행의 식별 열인 select scope_identity() 스테이 션의 결과를 리턴합니다. 여기

con.Open(); 
cmd.CommandText = ("INSERT INTO Game (playerA, playerB) VALUES (@playerA,@playerB); 
        SELECT SCOPE_IDENTITY()"); 

cmd.Parameters.Add("@playerA", SqlDbType.NVarChar).Value = firstPlayer; 
cmd.Parameters.Add("@playerB", SqlDbType.NVarChar).Value = secondPlayer; 

int id = Convert.ToInt32(cmd.ExecuteScalar()); 
con.Close(); 
+0

SELECT SCOPE_IDENTITY() 삽입 된 ID를 알려주세요. 이제 라인에 예외가 생겼습니다 : int id = (int) cmd.ExecuteScalar(); 예외는 캐스트가 좋지 않다는 것입니다. –

+0

범위 ID는 삽입 된 행 – Nithesh

+0

의 ID 값을 반환합니다.이 경우 – Nithesh

1

INSERT INTO YourTable(val1, val2, val3 ...) 
VALUES(@val1, @val2, @val3...) 
SELECT SCOPE_IDENTITY() 

같은 명령을 수정하지만 난 개인적으로 저장 프로 시저를 작성하는 것을 선호하고 SP의 출력 매개 변수로 기본 키를 반환 코드입니다 .