2013-08-12 3 views
-2

C# asp.net을 사용하여 레코드를 SQL Server 2008 테이블에 삽입하려고합니다. 열 값은 모두 "nvarchar"로 선언되고 첫 번째 열 subid는 기본 키입니다. 내 코드에서 , 나는 마지막 coulmn ID를 검색하고 증분하여 새 레코드에 대한 subid로 사용합니다. 레코드를 삽입하면 순차적으로 저장되지 않고 중간 어딘가에 저장됩니다. 다음에 검색하려고 할 때 마지막 id 열 값 ("order by"을 사용하더라도)은 증가 할 때 "중복 값, 허용되지 않음"오류를 제공하는 기존 값을 제공합니다.특정 행 다음에 레코드 삽입

 SqlCommand myCommand = new SqlCommand("SELECT TOP 1 subid FROM subjects       

     ORDER BY subid DESC", con1);   

      reader = myCommand.ExecuteReader(); 
      if (reader.HasRows == false) 
      { 
       Label4.Text = "1"; 
       reader.Close(); 
      } 
      else 
      { 
       while (reader.Read()) // if can read row from database 
       { 

        id = reader[0].ToString(); 

       } 
       int n = Convert.ToInt32(id); 
       int j = n + 1; 
       Label4.Text = j.ToString(); 

내 삽입 코드는 다음과 같습니다 : 이 마지막 ID 값을 검색하고 증가하는 내 코드 내가 값을 어떻게

 SqlDataAdapter da = new SqlDataAdapter("SELECT TOP 1 * FROM subjects ORDER BY  
     subid DESC", con); 
     SqlCommandBuilder cb = new SqlCommandBuilder(da); 
     DataSet ds = new DataSet("subjects"); 
     da.Fill(ds, "subjects"); 
     DataRow row = ds.Tables["subjects"].NewRow(); 
     row["subid"] = Label4.Text; 
     row["dept"] = (string)Session["deptmnt"]; 
     row["yr"] = DropDownList2.SelectedValue; 
     row["sem"] = DropDownList3.SelectedValue; 
     row["subname"] = TextBox1.Text; 
     row["subcode"] = TextBox2.Text; 

     ds.Tables["subjects"].Rows.Add(row); 
     da.Update(ds, "subjects"); 

     Label10.Visible = true; 
     con.Close(); 

마지막 행으로 삽입 얻을, pls는 도움이됩니다. 내 subid에는 "IT10001", "EC10001"과 같은 값이 있는데, 첫 번째 두 글자를 기반으로 부서를 식별합니다. 왜 내가 varchar!

+2

이 접근법은 정말 끔찍한 디자인입니다. 새로운 ID 값을 만들 때 "SELECT MAX (..) + 1"방식을 사용하지 마십시오. **로드 중 ** 안전하지 않음 ** - 한 명 이상의 사용자가이 애플리케이션을 사용하고 있다면 나중에 복제본을 작성하는 것보다 훨씬 빠릅니다. ** 그렇게하지 마세요! ** 테이블에 'INT IDENTITY' 컬럼을 사용하고 SQL Server가 ID의 고유성을 처리하도록하십시오. –

+0

@marc_s 관심 없으니 하루에 몇 번이나 사람들에게 말해야합니까? ;-) – Bridge

+0

@ 브릿지 : ** 길 너무 많아요! ** :-( –

답변

2

NVarchChar 필드의 정렬은 문자열로 수행됩니다. 따라서 NVARCHAR으로 계속 발생합니다. 올바른 방법은 데이터베이스에있는 add an integer column이며 auto-increment으로 설정하십시오. 이렇게하면 새 행을 추가하기 전에 매번 최대 값을 가져올 필요가 없습니다.

+0

, 고맙다. 많은 테이블, varchar와 함께, 그래서, 지금은 정수로 테이블을 변경할 수 없으므로 pls는 다른 대체 방법을 제공합니다. – user2605748

+0

은 nvarchar에서는 불가능합니다. 환약을 삼키십시오. – Ehsan

+2

불량품을 식별하는 경우 가능한 한 빨리 변경하십시오. 너는 나중에 더 많은 고통을 위해서만 자신을 개방하고있다. – SWeko

2

표현식이 SELECT TOP 1 * FROM subjects ORDER BY subid DESC입니다.

subid이 NVarChar 인 경우 앞에서 말한 것처럼 순서는 문자열이 아니라 숫자로 이루어집니다. 그리고 그것은 '10'< '2'를 의미합니다. 1000 개 레코드가 가정, 그들은 명령을 받게됩니다 :

1 
10 
11 
.. 
19 
100 
101 
... 
1000 
2 
20 
21 
... 
... 
999 

때문에, 각각의 모든 시간을 당신이 전적으로 가장 큰이기 때문에, 당신은 다시 '999'문자열을 얻을 것이다 가장 큰 번호를하려고합니다.

가장 간단한 해결책은 실제로 정수이므로 열을 정수로 변경하는 것입니다. 절대적으로 긍정적으로 변경할 수 없다면 적어도 값을 0으로 채 웁니다. 따라서 "1", "2", "10"대신에 "0001", "0002", "0010"을 사용하십시오.

또한 MAX + 1 방식을 사용하면 동시성 문제로 인해 트랜잭션을 사용하여 모든 작업을 수행해야합니다. int identity를 기본 키로 사용하면 이러한 문제를 해결할 수 있습니다.

관련 문제