2013-03-12 2 views
1

방금 ​​제출 한 정보가있는 다른 페이지로 사용자를 전달할 수 있도록 레코드의 ID를 가져와야합니다. 나는 이것에 관한 다른 질문을 보았고 사람들은 SELECT SCOPE_IDENTITY() 나 OUTPUT을 사용하도록 제안했지만 나는 C#과 SQL에 대해 정말 새로운 것이므로 기존 코드와 정확히 어떻게 사용하는지 모르겠습니다. 어떤 도움이라도 대단히 감사하겠습니다.레코드를 삽입 한 후에 레코드 ID를 가져옵니다.

방금 ​​삽입 한 레코드의 ID를 response.redirect에 넣어야합니다.

pcn.Open(); 
pcm.Connection = pcn; 

string logon_user = Request.ServerVariables["LOGON_USER"].Substring(7); 

var sql = String.Format(@"INSERT INTO Transfer (Status, Type, Name) values ('{0}','{1}','{2}')", '0', TypeTxtBox.Text.Replace("'", "''"), logon_user); 

pcm.CommandText = sql; 
pcm.ExecuteNonQuery(); 
pcn.Close(); 

Response.Redirect("View.aspx?ID=" + id); 

그래, 이와 유사한 다른 질문이 있음을 볼 수 있지만 제가 위에서 내 코드와 함께 정확한 도움을 찾고 있어요,이 중복 때문에하지 표시하지 않습니다!

+1

언제든지 실행할 수 있습니다. SELECT SCOPE_IDENTITY(); – MethodMan

+2

sql-injection을 방지하기 위해 매개 변수를 사용하십시오. http://stackoverflow.com/a/9319609/284240 –

+0

이 스크립트는 나와 내 어느 누구도 사용하지 않는 내부 스크립트로 SQL 주입에 대해 걱정하지 않습니다. 생각해 줘서 고마워. – techora

답변

0

SCOPE_IDENTITY 범위의 ID 열에 마지막 ID 값이 삽입됩니다. SqlCommand.ExecuteScalar은 스크립트를 실행하고 ID를 검색합니다.

 var sql = String.Format(@"INSERT INTO Transfer (Status, Type, Name) values ('{0}','{1}','{2}') 
     SELECT CAST(scope_identity() AS int)" 
    , '0', TypeTxtBox.Text.Replace("'", "''"), logon_user); 

int ID = (int)pcm.ExecuteScalar(); 
+0

이것은 많은 코드를 수정하지 않고도 효과가있었습니다. – techora

3

은, 지금까지 SQL에 대한 문자열 연결을 사용하지 마십시오!

ID를 얻으려면, 당신은 다음과 같이하려면 코드를 업데이트해야합니다

pcm.CommandText = "INSERT INTO Transfer (Status, Type, Name) values (@status, @type, @name);SELECT SCOPE_IDENTITY();"; 
object identifier = pcm.ExecuteScalar(); 

당신의 식별자는 정수가 있다면, 당신은 GUID의 따라 조정 (값을 얻기 위해 int로 identifier 전송할 수 있습니다 등)

int id = (int)identifier; 
관련 문제