2010-11-20 3 views
2

내 테이블에서 일부 데이터를 추가하는 C# 단추. 이 행의 ID를 어떻게 얻을 수 있습니까? 아무도 아이디어가 있니?방금 ​​추가 한 행 ID를 얻는 방법

private static void InsertIntoTransportation(string ZednadebNumber, DateTime DateTime, int SellerID, int BuyerID, string TransStart, string TransEnd, decimal Quantity, string LoadType, string LoadName, int DriverID, decimal Cost, decimal FuelUsed, decimal salary) 
    { 
     try 
     { 
      using (SqlCommand cmd = new SqlCommand("INSERT INTO Transportation (DriverID, ClientIDAsSeller, ClientIDAsBuyer, ZednadebNumber, LoadName, TransStart, TransEnd, LoadType, Quantity, Cost, FuelUsed, DateTime) VALUES (@DriverID, @ClientIDAsSeller, @ClientIDAsBuyer, @ZednadebNumber, @LoadName, @TransStart, @TransEnd, @LoadType, @Quantity, @Cost, @FuelUsed, @DateTime)", new SqlConnection(Program.ConnectionString))) 
      { 
       cmd.Parameters.AddWithValue("@DriverID", DriverID); 
       cmd.Parameters.AddWithValue("@ClientIDAsSeller", SellerID); 
       cmd.Parameters.AddWithValue("@ClientIDAsBuyer", BuyerID); 
       cmd.Parameters.AddWithValue("@ZednadebNumber", ZednadebNumber); 
       cmd.Parameters.AddWithValue("@LoadName", LoadName); 
       cmd.Parameters.AddWithValue("@TransStart", TransStart); 
       cmd.Parameters.AddWithValue("@TransEnd", TransEnd); 
       cmd.Parameters.AddWithValue("@LoadType", LoadType); 
       cmd.Parameters.AddWithValue("@Quantity", Quantity); 
       cmd.Parameters.AddWithValue("@Cost", Cost); 
       cmd.Parameters.AddWithValue("@FuelUsed", FuelUsed); 
       cmd.Parameters.AddWithValue("@DateTime", DateTime); 
       cmd.Connection.Open(); 
       cmd.ExecuteNonQuery(); 
       SqlCommand cmd1 = new SqlCommand("INSERT INTO Salary (DriverID, TransportationID, Salary) VALUES (@DID, @@IDENTITY, @Salary)", new SqlConnection(Program.ConnectionString)); 
       cmd1.Parameters.AddWithValue("@DID", DriverID); 
       cmd1.Parameters.AddWithValue("@Salary", salary); 
       cmd1.Connection.Open(); 
       cmd1.ExecuteNonQuery(); 
       cmd1.Connection.Close(); 
       cmd.Connection.Close(); 
      } 
     } 
     catch (Exception) 
     { 

      MessageBox.Show("ვერ ვახერხებ მონაცემთა ბაზასთან კავშირს, დაწრმუნდით თქვენი კომპიუტერის ინტერნეტთან კავშირის გამართულობაში.", "შეცდომა !!!", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 
+0

코드를 게시 할 수 있습니까? 데이터를 추가하는 방법을 보려면 코드를 확인해야합니다. 줄 단위로 추가하거나 목록을 추가 하시겠습니까? ID 열의 유형 (int, uniqueidentifier, nvarchar)은 무엇입니까? 방법? –

답변

4

내테이블에 일부 데이터를 추가하는 버튼. 이 행의 ID를 어떻게 얻을 수 있습니까? 누구나 아이디어가 있습니까?

제공된 코드 예제는 두 행을 삽입합니다.

어느 쪽이든 단순히 "SELECT SCOPE_IDENTITY()"를 포함하도록 명령문을 변경하고 명령에서 스칼라 결과를 얻으십시오. 당신의 행 ID를 가정

표준 정수 필드 (보다는 BIGINT) 당신의 행 정수/BIGINT를 증가 자동차를 사용하지 않을 경우,이 작동하지 않습니다

// Edit your command text to have "; SELECT SCOPE_IDENTITY()" at the end. 
int? insertedId = cmd.ExecuteScalar() as int?; 
if (insertedId.HasValue) 
{ 
    // success! 
} 

주입니다.

또한 테스트/샘플 코드 이외의 다른 경우 저장 프로 시저로 명령문을 이동하는 것이 좋습니다.

C#에서 SQL 코드를 분리하면 일반 명령문을 다시 사용할 수 있습니다 (메서드로 간주). 또는 ORM 솔루션 사용을 고려하십시오.

+0

감사합니다. –

-1

동료 중 일부는 삽입 후 ID 값을 반환하기 위해 쿼리를 처리합니다. DBA는 알렉산더가 지시 한대로 다른 방법을 사용할 수 있습니다. 쿼리가 네트워크에서 추가 IO를 생성하는 동안 적어도 캐시에 있어야하며 더 이상 디스크 IO가 발생하지 않아야합니다.

+2

삽입 된 값을 찾기 위해 쿼리를 수행하면 두 개 이상의 프로세스가 동시에 작동하는 경우 경쟁 조건이 발생할 수 있습니다. 대신 제공된 SCOPE_IDENTITY 기능을 사용하여 생성 된 ID를 하나의 원자 조작으로 리턴하십시오. 예를 들어 나의 대답을보십시오. –

+0

윌, 알렉산더와 동의하고 이중 쿼리를 제안하지 않으려 고 노력했다. –

1

MS SQL Server에서 내 선호 언어는 output clause입니다. 쿼리가 아닌 쿼리를 실행하지 않고 리더가 될 것입니다 (기술적으로 삽입 된 경우에도). 삽입 된 결과 집합에 선택한 필드가있는 행이 하나씩 포함됩니다. 이것은 추후 발생할 수있는 업데이트가 필요한 ROWVERSION (TIMESTAMP) 열이있는 경우 유용합니다 (다른 읽기를 수행하지 못하게 함).

편집 - OUTPUT INTO가 아닌 OUTPUT을 사용하십시오 (C#보다 SQL Server 측 코드에 더 유용함).

scope_identity (트리거 대신에 다른 트리거를 사용하여 null을 반환하는 경우), @@ identity 및 모든 문제와는 반대로 sprocs 및 triggers와도 잘 작동합니다.

관련 문제