2013-07-17 2 views
1

마지막으로 "ID_K"테이블 KLIENT에 ID로 삽입 된 번호를 찾아야합니다. 코드를 어떻게 개선해야합니까?IDENT_CURRENT를 찾는 Sql 명령

미리 감사드립니다.

SqlCommand comm = new SqlCommand("IDENT_CURRENT klient", spojeni); 
      // SqlCommand comm = new SqlCommand("Select MAX (ID_K) FROM klient", spojeni); 
      spojeni.Open(); 
      int max = (int)comm.ExecuteScalar(); 
      spojeni.Close(); 


      foreach (DataGridViewRow row in dtg_ksluzby.Rows) 
      { 
       if (Convert.ToBoolean(row.Cells[3].Value) == true) 
       { 
        SqlCommand prikaz2 = new SqlCommand("INSERT INTO klisluz(text,pocet,akce,subkey) values(@val1,@val2,@val3,@val4) ", spojeni); 
        prikaz2.Parameters.AddWithValue("@val1", row.Cells["text"].Value); 
        prikaz2.Parameters.AddWithValue("@val2", row.Cells["pocet"].Value); 
        prikaz2.Parameters.AddWithValue("@val3", row.Cells["akce"].Value); 
        prikaz2.Parameters.AddWithValue("@val4", max + 1); 
        spojeni.Open(); 
        prikaz2.ExecuteNonQuery(); 
        spojeni.Close(); 
       } 
      } 
+1

'SELECT IDENT_CURRENT ('tableName')'이 (가) 올바른 구문입니다. –

답변

3

IDENT_CURRENT에 대한 올바른 구문은

SqlCommand comm = new SqlCommand("SELECT IDENT_CURRENT ('klient')", spojeni); 

은 IDENT_CURRENT는 NUMERIC (38,0)로 정의되는 것을 명심하십시오, 그래서 가장 좋은 데이터 형식의 반환 값을 얻기 위해 사용하는 것을 생각 ExecuteScalar는이 진수

decimal lastValue = (decimal)comm.ExecuteScalar(); 

또는 값이 너무 크게하지 않으면, 당신은 사용할 수 있습니다

int lastValue = Convert.ToInt32(comm.ExecuteScalar()); 

그러나이 명령은 MAX (K_ID)와 같은 문제가 있습니다. 다른 연결의 누군가가이 호출과 'klisluz'테이블에 대한 호출 사이의 'klient'테이블에 새로운 레코드를 삽입하면 삽입 된 마지막 ID 값에 대해 잘못된 번호를 얻을 수 있습니다. 'klient'와 'klisluz'사이에 어떤 종류의 관계가있는 경우 테이블 이름과 열 이름에서 명확하지 않으므로 설명해야합니다.

+0

SqlCommand를 사용하는 코드가 내게이 오류를 줄 수는 있습니다 : 지정한 캐스트가 유효하지 않습니다. ? – Marek

+2

예, IDENT_CURRENT는 정수가 아니며 숫자 (38,0)를 반환합니다. 나는 가장 좋은 데이터 형을 사용하는 것이 10 진수라고 생각한다. 값이 너무 크지 않으면'int max = Convert.ToInt32 (comm.ExecuteScalar()); – Steve

+1

스티브 감사합니다. – Marek